# Content Breakdown

> 爆款拆解技能：从抖音、小红书、微信公众号、B站、小宇宙、百家号、微博、今日头条拆解内容（字幕/转录/正文/图片OCR），也支持本地视频/音频文件转录。 当用户说"拆解视频内容"、"获取字幕"、"拆解笔记图片"、"获取笔记正文"、"识别图片文字"、 "拆解公众号文章"、"拆解B站视频"、"拆解播客内容"、"转录这个视频文件"、"提取本地视频内容"、 "拆解百家号文章"、"提取微博内容"、"拆解头条文章"时触发。 依赖：Python 3.10+、requests 【不适用场景】 - 关键词搜索拆解（如"搜爆款"、"找爆款"、"搜一下xx的爆款"、"竞品分析"、"搜热门"）→ 请使用「内容雷达 content-radar」技能 - 通用网页搜索 → 使用 web_search - 内容发布 → 使用发布技能 - 只想清洗 ASR 逐字稿 → 走逐字稿润色技能

- Skill: `ahang1598/content-breakdown` (Agent Skill, multi-file: 29 files)
- Install (CLI): `npx skillmds@latest add ahang1598/content-breakdown`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/content-breakdown/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/content-breakdown

---


# 爆款拆解技能 Content Breakdown

**架构**：优先使用 `curl` / `yt-dlp` / HTTP API 直接获取数据（无需浏览器），仅在 curl 失败时降级到 Agent（browser_use）获取页面数据。Python 脚本（`scripts/cli.py`）负责下载/转录/OCR。脚本不含任何浏览器操作。

---

## 平台路由

> ⛔ **强制规则**：收到 URL 后，识别平台，**必须先 `read_file` 读取对应 reference 文件再执行**。
> **禁止凭记忆执行任何平台的提取流程**。每次提取都必须重新读取文档，无论之前是否执行过同平台的提取。
> 未读取 reference 文件就开始操作视为严重错误。

| 平台识别 | 命令 | 优先方式（curl/API） | 降级方式（browser_use） | 必须先读取 |
|---------|------|-----------|---------|---------|
| `douyin.com` / `v.douyin.com` | `extract-douyin` | `yt-dlp` 获取元数据 + 视频直链 | `browser_use` 获取直链 | **`references/douyin.md`** |
| `xiaohongshu.com` / `xhslink.com` | `extract-xhs` | `curl` + Desktop UA 获取 `__INITIAL_STATE__` | `browser_use` 获取正文+图片 | **`references/xhs.md`** |
| `bilibili.com` / `b23.tv` / BV号 | `extract-bilibili` | B 站公开 API（`--no-cookie` 模式，360P + ASR） | `browser_use` 获取 Cookie + 字幕 API | **`references/bilibili.md`** |
| `mp.weixin.qq.com` | `extract-wechat` | `curl` + Desktop UA 获取 SSR HTML | 无需降级 | **`references/wechat.md`** |
| `xiaoyuzhoufm.com` | `extract-xiaoyuzhou` | `curl` 提取音频直链 | 无需降级 | **`references/xiaoyuzhou.md`** |
| `baijiahao.baidu.com` / `mbd.baidu.com` | `extract-baijiahao` | `curl` + Desktop UA 获取页面 HTML | `browser_use` 获取 HTML + 脚本解析 | **`references/baijiahao.md`** |
| `weibo.com` / `m.weibo.cn` | `extract-weibo` | 移动端 API（m.weibo.cn） | 无需降级 | **`references/weibo.md`** |
| `toutiao.com` / `m.toutiao.com` | `extract-toutiao` | 移动端 API（`m.toutiao.com/i{id}/info/`）返回 JSON | `browser_use` 获取 HTML + 脚本解析 | **`references/toutiao.md`** |

不支持的平台：单条时提示不支持并列出支持列表；批量时跳过（`⏭️ 跳过：{链接} — 暂不支持`），不中断整体流程。

## 各平台关键注意事项

| 平台 | 关键注意事项 |
|------|------------|
| 抖音 | 优先用 `yt-dlp --dump-json` 获取元数据，失败再降级 browser_use；无 API 字幕时**必须**继续 ASR 转录 |
| 小红书 | 优先用 `curl` + Desktop UA 从 SSR HTML 提取 `__INITIAL_STATE__`；图文笔记需执行**两条命令**（提取 + OCR）；`image_files` 不为空即为图文 |
| B 站 | 优先用 `--no-cookie` 模式（公开 API + 360P + ASR），无需浏览器；需要字幕时再用 `--cookie` + browser_use 获取 Cookie |
| 微信公众号 | `curl` + Desktop UA 即可获取 SSR HTML（已验证），**不得自行添加 `--no-ocr`** |
| 小宇宙 | 默认下载音频并转录 |
| 百家号 | 优先尝试 `curl` + Desktop UA，失败再降级 browser_use；**不得自行添加 `--no-ocr`** |
| 微博 | 使用移动端 API（m.weibo.cn），自动展开长文；**不得自行添加 `--no-ocr`** |
| 今日头条 | 优先通过移动端 API（`m.toutiao.com/i{id}/info/`）获取 JSON 数据，失败再降级 browser_use；图片 URL 可能缺少协议前缀，脚本自动补全 |

---

## 提取流程

> ⛔ **以下 6 步必须严格按顺序逐步执行，禁止跳过任何一步，禁止合并步骤，禁止在未完成前一步时开始下一步。**

1. ⛔ **读取文档**：`read_file` 读取对应平台的 `references/*.md`。**此步骤不可跳过**，未读取就开始操作视为严重错误。
2. **获取数据**：按文档 Step 1 的方式零（curl/yt-dlp/API）优先获取数据。**优先方式失败时**才降级到 browser_use，browser_use 失败再降级到 CDP。**必须严格按照 reference 文件中的步骤顺序执行，包括滚动防反爬等所有前置操作。**
3. **脚本处理**：按文档 Step 2 调用 `python3 scripts/cli.py extract-{平台}` 处理
4. **格式化输出**：读取 `references/output-format.md`，按**三部分格式**输出：
   - **📋 内容元数据**：标题、作者、平台、时长、互动数据等
   - **📄 提取内容原文**：转录文本 / 正文 / OCR 文本
   - ⛔ **📊 内容分析**：**此部分必须包含且不可省略**，需输出核心主题、主要观点、适用场景、内容结构分析。缺少此部分视为报告不完整。
5. **保存报告**：⛔ 报告文件中**三部分必须全部写入**（📋 + 📄 + 📊），缺少任何一部分禁止保存。写入路径：`~/.content-breakdown/output/{平台}_{标题摘要}_{YYYYMMDD}.md`
6. ⛔ **进入后续流程**：**保存报告 ≠ 任务完成！保存报告后绝对不得结束任务**，必须继续执行下方「后续流程」章节。在后续流程全部完成前结束任务视为严重错误。

---

## 批量提取模式

≥ 2 条链接时进入批量模式。

| 行为 | 单条模式 | 批量模式 |
|------|---------|---------|
| 对话展示原文 | ✅ 完整展示 | ❌ 只展示元数据+分析摘要 |
| 口播脚本生成 | ✅ 自动判断+use_skill | ❌ 汇总后由用户选择 |
| 分镜/风格分析 | ✅ 逐步询问 | ❌ 汇总后由用户选择 |
| 汇总报告 | ❌ | ✅ 自动生成 |

⛔ 每条视频类内容（转录 ≥ 100 字）**必须**判断是否口播并标记（✅/❌），不可跳过此标记步骤。

**口播判断标准**（满足 2 条及以上即为口播）：
1. 有持续的人声叙述（连贯完整句子为主）
2. 有明确的表达主题（围绕一个中心论点展开）
3. 有结构化的信息传递（有开头引入、中间展开、结尾总结）
4. **不属于**：纯音乐/MV、游戏实况、Vlog 日常、影视剪辑、搞笑段子集锦

批量完成后生成汇总报告（**必须读取** `references/batch-report-template.md`），然后询问：

```
ask_human("📊 汇总拆解报告已生成。共 {M} 条成功，{K} 条跳过，{P} 条口播。\n\n(A) 分镜/制作分析（输入序号）\n(B) 批量生成视频脚本（共 {P} 条口播）\n(C) 选择特定内容生成视频脚本（输入序号）\n(D) 结束")
```

- A → 分镜分析（需先提取关键帧）
- B → 逐条通过 use_skill 调用 video-script-generator（失败时降级到 `references/oral-template.md`）
- C → 指定内容通过 use_skill 调用 video-script-generator
- D → 结束

> 选 A/B/C 执行完后回到此询问继续。

---

## 后续流程（单条模式专用）

> ⛔ **保存报告 ≠ 任务完成**：单条提取保存报告后**必须执行以下流程，全部完成后才允许结束任务**。
> 在步骤一和步骤二全部完成之前结束任务视为严重错误。批量模式跳过此章节。

### 步骤一：分镜分析（视频类内容专用）

**触发条件**：视频类内容（有转录/音频）。图文/文章类跳过此步骤，直接进入步骤二。

```
ask_human("📝 爆款拆解报告已生成。是否需要进行分镜分析？（需提取关键帧）\n\n(A) 进行分镜分析\n(B) 不需要，跳过")
```

- A → 执行以下**完整分镜分析流程**：
  1. 使用 `--extract-keyframes` 提取关键帧
  2. ⛔ **必须基于关键帧生成完整的分镜分析报告**，不能只列出时间轴/截图列表。报告必须包含：
     - **分镜结构分析**：各段落的镜头构成、转场方式
     - **画面风格分析**：色调、构图、字幕使用、品牌元素
     - **剪辑节奏分析**：节奏变化、时长分布、高潮/缓冲交替
  3. 保存为 `~/.content-breakdown/output/{平台}_分镜分析_{标题摘要}_{YYYYMMDD}.md`
  > ⛔ 只提取关键帧但不生成深度分析报告视为未完成。
- B → 跳过，进入步骤二

> ⛔ 分镜分析完成（或用户选择跳过）后，**必须继续执行步骤二**，禁止在此结束任务。无论用户选择 A 还是 B，步骤二都必须执行。

### 步骤二：视频脚本生成

**触发条件**：视频类内容且转录 ≥ 100 字。图文/文章类跳过此步骤，直接结束。

**内部判断标准**（后台判断，不在对话中向用户展示判断过程）：
满足 2 条及以上即判定为适合生成脚本：
1. 有持续的人声叙述（连贯完整句子为主）
2. 有明确的表达主题（围绕一个中心论点展开）
3. 有结构化的信息传递（有开头引入、中间展开、结尾总结）
4. **不属于**：纯音乐/MV、游戏实况、Vlog 日常、影视剪辑、搞笑段子集锦

**判断结果**（对用户透明，不输出判断过程）：
- 适合生成脚本 → 直接询问
- 不适合 → 直接结束任务（不需要告诉用户"不是口播所以跳过"）

**询问**：

```
ask_human("是否调用「视频脚本生成器」生成新脚本？\n\n(A) 生成视频脚本\n(B) 不需要，结束")
```

- A → 通过 `use_skill(name="video-script-generator")` 调用。如果技能不在本地，先 `search_skills` 搜索。调用前确保对话上下文已有提取报告（📋 元数据 + 📄 原文 + 📊 分析）。
- B → 结束任务

**降级**（use_skill 失败时）：`ask_human` 告知用户，询问是否降级到 `references/oral-template.md` 本地生成。仅降级路径才允许使用该模板。

---

## 核心约束

> ⛔ 以下规则优先级最高，**不可违反，不可以任何理由绕过**：

- ⛔ **必须先读取 reference 文件**：每次提取前必须 `read_file` 读取对应平台的 reference 文件，禁止凭记忆执行
- ⛔ **curl/yt-dlp 优先，browser_use 降级**：抖音优先用 `yt-dlp`，小红书/百家号/头条优先用 `curl`，B 站优先用 `--no-cookie` 模式。**优先方式失败后才降级到 browser_use**，browser_use 必须按 reference 文件中的方式一→方式二→方式三全部尝试失败后才允许降级到 `scripts/cdp_extract.py`（详见：`douyin.md` §1.4、`bilibili.md` §1.5、`xhs.md` §1.6）。跳过任何一种方式直接降级视为严重错误。
- ⛔ **Whisper 必须使用 medium 模型**：base 模型（74M）在有背景音乐、方言、快速口语的视频中输出几乎全是乱码。medium（1.5B，约 1.42GB）是中文转录的最低可用模型。脚本默认已设为 medium，**禁止改回 base**。
- ⛔ **browser_use 必须执行滚动防反爬**：进入页面后必须先执行滚动操作（scrollBy + wait），未执行滚动就开始提取数据视为严重错误
- ⛔ **禁止截图代替下载**：图片必须下载原图后 OCR
- ⛔ **禁止猜测参数**：不确定时必须查阅对应 reference 文件
- ⛔ **禁止跳过输出格式**：必须按三部分格式输出（📋 元数据 + 📄 原文 + 📊 分析），缺少任何一部分禁止保存
- ⛔ **禁止编造数据**：互动数据必须从页面提取，无法获取时标注"未获取"而非编造
- ⛔ **禁止在脚本中操作浏览器**：脚本只处理已获取的数据
- ⛔ **报告必须保存文件**：每次提取都必须生成 Markdown 文件并写入磁盘
- ⛔ **保存报告后必须继续后续流程**：单条模式保存报告后必须执行步骤一（分镜询问）和步骤二（口播判断），在后续流程全部完成前结束任务视为严重错误
- ⛔ **browser_use 提取完成后必须关闭页面**：执行 `browser_use(action="close_tab")` 关闭打开的页面
- ⛔ **登录墙处理**：检测到登录墙时必须读取 `references/login-wall.md` 并按其流程执行
- ⛔ **脚本失败处理**：`cli.py` 返回失败时查看 error 字段，按下方异常处理表操作，最多重试 2 次

---

## 异常处理

| 异常 | 处理 |
|------|------|
| browser_use 页面重定向 | 提示用户登录 |
| browser_use evaluate 返回 `page is not ready` / `navigation_in_flight` | **不要立即降级**。等待 5 秒后重试**当前方式**，但**每种方式最多重试 1 次**（即最多 2 次尝试）。重试后仍失败 → 立即切换到下一种方式（方式一→方式二→方式三）。禁止在同一种方式上循环重试超过 2 次。三种方式全部失败后才降级到 CDP |
| browser_use 返回 `Target closed` / 页面崩溃 | 此时浏览器已不可用，直接降级到 `python3 scripts/cdp_extract.py --url <URL>` |
| Performance API 无直链 | 增加等待时间，多次滚动；仍失败则继续尝试 DOM 提取（方式三）。方式一二三全部失败后降级到 cdp_extract.py |
| cdp_extract.py 返回 `login_required` | `ask_human` 引导用户登录，登录后重试 |
| cdp_extract.py 返回 `data_completeness: partial` + `login_status: not_logged_in`（抖音/小红书） | ⛔ **绝对禁止使用 partial 数据继续执行，无任何例外**。不得以"简单任务"、"只需转录"等理由绕过。必须立即执行 `ask_human` 引导用户登录，登录后重新提取完整数据。违反此规则视为严重错误。 |
| cdp_extract.py 返回 `data_completeness: partial` + `login_status: logged_in`（抖音） | 已登录但仍只有 audio_url（DASH 分离场景），此时可以使用 `--audio-url` 继续转录。报告中元数据用脚本返回的 metadata 填充（可能不完整）。 |
| cdp_extract.py 返回 `Chrome not found` | Chrome 未安装，`ask_human` 提示用户安装：https://www.google.com/chrome/ |
| cdp_extract.py 返回 `chromedriver_blocked` | 执行返回的 `fix_command`（`codesign --force --sign - <path>`），然后重试 |
| ASR 失败 | 自动降级到 Whisper |
| 图片下载失败 | 记录失败 URL，继续处理其他图片 |
| 脚本返回"不包含音频流" | browser_use 获取音频轨 URL，用 `--audio-url` 重新调用 |
| "视频下载失败"/"链接过期" | browser_use 重新获取直链再调用 |
| 其他错误 | `ask_human` 告知用户 |

**对用户翻译技术错误**：`login_required` → "需要先登录"；`TimeoutError` → "网络超时"；Python traceback → "处理工具出错了"。

---

## 前置条件与依赖

browser_use Profile 自动持久化登录状态，首次使用需登录一次。

> ⛔ 在**首次调用 `cli.py` 前必须执行依赖检查**。如果本次会话中已检查过则可跳过，但首次调用时不可跳过。

```bash
# 依赖检查
python3 -c "import requests; print('✅ requests')" && \
python3 -c "import imageio_ffmpeg; print('✅ imageio-ffmpeg')" && echo "通过"

# 安装（如缺失）
pip install requests imageio-ffmpeg
pip install yt-dlp                # 抖音视频提取（优先方式）
pip install chromedriver-autoinstaller selenium  # CDP 降级方案(跨平台自动管理 ChromeDriver)
pip install rapidocr-onnxruntime    # OCR（推荐）
pip install openai-whisper          # Whisper 转录（可选兜底）
```

---

## 资源索引

| 文件 | 用途 | 何时读取 |
|------|------|---------|
| `references/douyin.md` | 抖音提取流程 | 识别到抖音链接时 |
| `references/xhs.md` | 小红书提取流程 | 识别到小红书链接时 |
| `references/bilibili.md` | B站提取流程 | 识别到B站链接时 |
| `references/wechat.md` | 微信公众号提取 | 识别到微信链接时 |
| `references/xiaoyuzhou.md` | 小宇宙提取 | 识别到小宇宙链接时 |
| `references/baijiahao.md` | 百家号提取流程 | 识别到百家号链接时 |
| `references/weibo.md` | 微博提取流程 | 识别到微博链接时 |
| `references/toutiao.md` | 今日头条提取流程 | 识别到头条链接时 |
| `references/output-format.md` | 输出格式规范 | 提取成功后 |
| `references/oral-template.md` | 口播模板（降级用） | use_skill 失败时 |
| `references/batch-report-template.md` | 汇总报告模板 | 批量提取完成后 |
| `references/login-wall.md` | 登录墙处理流程 | 检测到未登录时 |

