# 抖音违禁词查询 — 核心工作流

执行本 Skill 时须完整遵守本文档全部条款；与 [scripts/check_sensitive_words.py](../scripts/check_sensitive_words.py) 配合使用。

## 任务目标

- 本 Skill 用于:检测用户输入的文案、上传的文件（图片/TXT/DOC/DOCX等文本类型文件）或网页地址中是否包含抖音违禁词，将违禁词标红显示，提供替换建议和仅替换违禁词后的文案
- 能力包含:支持文本、文件、网页三种输入方式的抖音违禁词查询，一站式检测无需多次调用脚本
- 触发条件:用户输入文案内容、上传文件、提供网页地址，需要检测抖音违禁词

## 前置准备

- 依赖说明:脚本依赖python-docx（Word文档提取）、beautifulsoup4（网页内容提取）、playwright（无头浏览器渲染JS动态网页，需执行`playwright install chromium`安装浏览器）
- **违禁词检测接口**：执行检测（非 `--extract-only`）前须配置 **`DY_SENSITIVE_WORD_API_URL`** 环境变量为 **HTTPS 完整 URL（含路径）**，或使用脚本参数 **`--api-url=...`** 覆盖；须指向部署方自有或已合规签约的服务端点，请求为 **POST `application/json`**，响应 JSON 契约须与原 Skill 约定一致（见脚本 `check_sensitive_words`）。仓库内不嵌入第三方域名。
- 非标准文件/文件夹准备:无

## 超长内容处理规则（所有输入类型通用）

当获取到的文案字符数超过3000时，**必须暂停并按以下规则提示用户，等待用户回复后再继续，禁止未等用户回复就自行执行后续流程**：

- **3000 < 字数 ≤ 10000**：提示用户：
  > ⚠ 单次查询内容字数建议不超过1000字，现在已超过单次执行字数是否进行分批查询？
  > 回复1：执行单次查询（仅检测前3000字符）
  > 回复2：执行分批查询
  > 回复3：取消执行

- **字数 > 10000**：直接提示用户并中断，不执行任何检测：
  > ⚠ 当前内容字数超过10000字，查询将会消耗过多的时间和积分，强烈建议手动分批查询。

  提示后立即结束任务，不提供分批选项，不执行检测。

用户回复对应动作（仅适用于3000 < 字数 ≤ 10000的场景）：

- **回复1**：仅取前3000字符调用脚本检测（超出部分丢弃）
- **回复2**：按3000字符在自然断句处切割分批，逐批调用 `python scripts/check_sensitive_words.py --content="..."` 检测全部内容；分批检测完成后必须汇总所有批次的替换结果，输出一份完整的优化文案文件，不可遗漏
- **回复3**：结束任务，不执行检测

## 操作步骤

1. 智能体识别用户输入类型（文本/文件/网页），执行对应流程
   - **文本输入**：
     1. **先判断文案字数**：智能体必须先计算用户输入文案的字符数
     2. 若不超过3000字符，直接调用 `python scripts/check_sensitive_words.py --content="文案内容"` 检测
     3. 若超过3000字符，按【超长内容处理规则】处理（超过10000字直接提示并中断，3000-10000字提示用户选择）
   - **文本类型文件（TXT/DOC/DOCX等）**：
     1. 先调用 `python scripts/check_sensitive_words.py --file=/path/to/file.txt --extract-only` 提取全部文字内容
     2. 若返回的 length 不超过3000，直接调用 `python scripts/check_sensitive_words.py --content="提取的内容"` 检测
     3. 若返回的 length 超过3000，按【超长内容处理规则】处理（超过10000字直接提示并中断，3000-10000字提示用户选择）
   - **网页地址**：
     1. 先调用 `python scripts/check_sensitive_words.py --url=https://example.com --extract-only` 提取全部文字内容
     2. 若返回的 length 不超过3000，直接调用 `python scripts/check_sensitive_words.py --content="提取的内容"` 检测
     3. 若返回的 length 超过3000，按【超长内容处理规则】处理（超过10000字直接提示并中断，3000-10000字提示用户选择）
   - **图片文件**：智能体先用read_image提取文字（仅提取图片中的文字内容，禁止识别图片的视觉风格描述），再用 --content 传入；若提取文字超过3000字符，按【超长内容处理规则】处理（超过10000字直接提示并中断，3000-10000字提示用户选择）
   - **PDF文件**：不支持，提醒用户"不支持PDF文件，请将PDF转为图片或文本类型文件后重新上传"
   - --content、--file、--url 三者互斥，每次调用仅传一个
   - 平台已硬编码为抖音，无需也无法指定其他平台
2. 解析脚本返回的JSON，**严格按下方输出模板呈现结果，禁止偏离**；分批检测时每批均输出三板块结果
3. **【必须执行，不可跳过】** 将纯文本优化文案（移除所有HTML标记）写入文件 `./抖音_优化文案_{随机6位数字}.txt`，写入后**必须将文件以卡片形式发送给用户**，让用户可以直接点击下载，禁止仅告知文件路径而不发送文件卡片。**该文件必须实际写入磁盘，禁止省略不输出、禁止仅提示文件名而不写入内容、禁止不发送文件卡片**。**分批检测时，所有批次检测完成后，必须将全部批次的替换结果汇总为一份完整的优化文案写入文件并发送文件卡片，不可遗漏任何批次的内容**

---

## 输出模板（必须严格照此输出，禁止增减任何板块）

以下三个板块为完整输出，必须同时出现、顺序固定、标题加粗。占位符用【】标注，替换为实际值。

🔍 **违禁词检测结果**

- ☁️**检测平台**：抖音
- **违禁词数量**：【word_count】个
- **违禁词类型**：【prohibited_words_type】

📚 **违禁文案：**

【html_content，原文中违禁词用<span style="color:red">标红，单独成段展示确保渲染生效】

> ⚠️ 数据说明：以上查询结果仅供参考，请您根据企业经营范围和产品实际效果或功效，自行核对。

💡 **修改建议**

针对每个违禁词，提供安全的替换表达。

| 违禁词 | 替换词 | 更换理由 |
|--------|--------|----------|
| 【违禁词1】 | 【替换词1】 | 【更换理由1】 |
| 【违禁词2】 | 【替换词2】 | 【更换理由2】 |

✏️ **建议优化文案**

> 💡 <span style="color:blue">蓝色文案</span>表示已替换的文案

【仅将违禁词替换为对应的安全替换词，替换时必须确保替换词与前后文语境通顺、语法正确、语义自然，如需微调前后助词/连接词以保证通顺则一并调整；所有替换词及微调处用\<span style="color:blue"\>标蓝；不改变原文语气、排版、用词风格，不添加emoji，不重写文案；该板块不使用代码块包裹，直接输出富文本】

---

## 输出格式铁律

1. **检测结果输出时仅输出上述三个板块**，禁止在该结果中添加开场白、结束语、补充说明、额外标题等任何其他内容；但检测完成并输出结果后，智能体可正常回复用户的后续提问
2. 三个板块标题必须加粗，emoji在加粗标记外：🔍 **违禁词检测结果**、💡 **修改建议**、✏️ **建议优化文案**
3. **✏️建议优化文案**必须确保替换词与前后文语境通顺，整句话语法正确、语义自然，禁止机械替换单词导致语病（如"回神秘公寓"→"回神秘居所"而非"回神秘公寓"）；如需微调前后助词/连接词以保证通顺则一并调整并用蓝色标记；不改变原文语气/排版/用词风格，禁止添加emoji，禁止重写文案；所有替换词及微调处必须用\<span style="color:blue"\>标蓝显示；该板块不使用代码块包裹，直接输出富文本
4. **【不可跳过】三板块输出完成后，智能体必须将纯文本优化文案写入文件** `./抖音_优化文案_{随机6位数字}.txt`，文件内容与"✏️建议优化文案"完全一致但移除所有HTML标记，仅保留纯文本。写入后**必须将文件以卡片形式发送给用户**，让用户可以直接点击下载，禁止仅告知文件路径而不发送文件卡片。**该文件必须实际写入磁盘，禁止省略不输出、禁止仅提示文件名而不写入内容、禁止不发送文件卡片**。**分批检测时，所有批次检测完成后，必须将全部批次的替换结果按原文顺序汇总为一份完整的优化文案写入文件并发送文件卡片，不可遗漏任何批次的内容**
5. 脚本返回JSON后，智能体必须解析并填入模板，禁止直接输出原始JSON
6. 未检测到违禁词（word_count=0）时：仅输出"**🔍 违禁词检测结果**"板块，内容为"未检测到违禁词，文案内容合规✅"，不输出后两个板块，不输出文件

---

## 完整输出示例

用户输入："这款美白神器真的太有效了，用了三天就白了一个度"

🔍 **违禁词检测结果**

- ☁️**检测平台**：抖音
- **违禁词数量**：2个
- **违禁词类型**：禁用词

📚 **违禁文案：**

这款美白神器真的太<span style="color:red">有效</span>了，用了三天就<span style="color:red">白了一个度</span>

> ⚠️ 数据说明：以上查询结果仅供参考，请您根据企业经营范围和产品实际效果或功效，自行核对。

💡 **修改建议**

针对每个违禁词，提供安全的替换表达。

| 违禁词 | 替换词 | 更换理由 |
|--------|--------|----------|
| 有效 | 用着感觉不错 | "有效"属禁用词，改为描述使用感受的口语化表达 |
| 白了一个度 | 肤色提亮了不少 | "白了一个度"暗示美白功效，改为描述视觉感受的间接表达 |

✏️ **建议优化文案**

> 💡 <span style="color:blue">蓝色文案</span>表示已替换的文案

这款美白神器真的太<span style="color:blue">用着感觉不错</span>了，用了三天就<span style="color:blue">肤色提亮了不少</span>

（三板块输出完成后，智能体必须将纯文本优化文案写入 `./抖音_优化文案_{随机6位数字}.txt`，内容与上方一致但无HTML标记。文件必须实际写入磁盘，写入后**必须将文件以卡片形式发送给用户**，禁止仅告知路径而不发送文件卡片）

---

## 注意事项

- 所有输入类型（文本/文件/网页/图片）超过3000字符时，必须按【超长内容处理规则】处理；3000 < 字数 ≤ 10000 提示"⚠ 单次查询内容字数建议不超过1000字，现在已超过单次执行字数是否进行分批查询？"，用户回复1执行单次查询（仅前3000字符），回复2分批查询（每批3000字符），回复3取消执行；字数 > 10000 直接提示"⚠ 当前内容字数超过10000字，查询将会消耗过多的时间和积分，强烈建议手动分批查询。"并中断，不执行任何检测
- 网络请求自动重试：遇到5xx、超时、连接重置等场景最多重试2次，智能体无需手动重试；检测请求使用标准 HTTPS 与证书校验，接口 URL 由环境变量 `DY_SENSITIVE_WORD_API_URL` 或 `--api-url` 配置（见「前置准备」）
- 若脚本返回「未配置违禁词检测接口地址」类错误：须提示在运行环境中配置 `DY_SENSITIVE_WORD_API_URL` 或使用 `--api-url`，不得伪造检测结果
- 脚本已内置英文误匹配过滤：API会将英文单词内部子串误标为违禁词（如"Glasswing"中的"ass"），脚本自动识别并过滤此类误匹配，无需智能体额外处理
- 违禁词用HTML <span style="color:red"> 标记（渲染红色）；优化文案中替换词用 <span style="color:blue"> 标记（渲染蓝色）
- "✏️建议优化文案"仅替换违禁词，替换时必须确保与前后文语境通顺、语法正确，如需微调前后助词/连接词以保证通顺则一并调整并用蓝色标记；禁止改变语气/排版/添加emoji/重写文案
- **【不可跳过】**三板块输出完成后必须将纯文本优化文案写入 `./抖音_优化文案_{随机6位数字}.txt`，其中随机数由智能体每次生成（如用当前时间戳后6位或随机6位数字），确保连续对话中不同次检测的文件名唯一、内容不被覆盖。文件内容与"✏️建议优化文案"一致但移除所有HTML标记。写入后**必须将文件以卡片形式发送给用户**，让用户可以直接点击下载，禁止仅告知文件路径而不发送文件卡片。**该文件必须实际写入磁盘，禁止省略、禁止仅提示文件名而不写入内容、禁止不发送文件卡片**。**分批检测时，所有批次完成后必须将全部替换结果按原文顺序汇总写入一份完整文件并发送文件卡片，不可遗漏任何批次**
- 图片文件由智能体先用read_image提取文字（仅提取图片中的文字内容，禁止识别图片的视觉风格描述），再以 --content 传入脚本检测
- 不支持PDF文件，若用户上传PDF需提醒"不支持PDF文件，请将PDF转为图片或文本类型文件后重新上传"
- 检测完成并输出结果、写入文件后，智能体可正常回复用户的后续提问（如调整替换词、重新检测、解释违禁规则等），不应因铁律约束而拒绝后续对话
