# 小红书违禁词查询 · 核心工作流

本文档包含本 Skill 的完整执行规范：**任务目标、前置准备、操作步骤、输出模板、格式铁律、示例、脚本说明与注意事项**。处理违禁词检测请求时必须全文遵循，不得删减或改写约束含义。

## 任务目标

- 本 Skill 用于:检测用户输入的文案、上传的文件（图片/TXT/DOC/DOCX等文本类型文件）或网页地址中是否包含小红书违禁词，将违禁词标红显示，提供替换建议和仅替换违禁词后的文案
- 能力包含:支持文本、文件、网页三种输入方式的小红书违禁词查询，一站式检测无需多次调用脚本
- 触发条件:用户输入文案内容、上传文件、提供网页地址，需要检测小红书违禁词

## 前置准备

- 依赖说明:脚本依赖python-docx（Word文档提取）、beautifulsoup4（网页内容提取）、playwright（无头浏览器渲染JS动态网页，需执行`playwright install chromium`安装浏览器）
- 非标准文件/文件夹准备:无

## 操作步骤

1. 智能体识别用户输入类型（文本/文件/网页），执行对应流程
   - **文本输入**：
     1. **先判断文案字数**：智能体必须先计算用户输入文案的字符数
     2. 若不超过3000字符，直接调用 `python scripts/check_sensitive_words.py --content="文案内容"` 检测
     3. 若超过3000字符且不超过10000字符，**必须暂停并询问用户**"⚠ 单次查询内容字数建议不超过3000字，现在已超过单次执行字数是否进行分批查询？\n回复1：执行单次查询（仅检测前3000字符）\n回复2：执行分批查询（检测全部内容）\n回复3：取消执行"**——必须等待用户回答后再继续，禁止未等用户回复就自行执行后续流程**——用户回复"1"则仅取前3000字符调用脚本检测，用户回复"2"则按3000字符分批调用 `python scripts/check_sensitive_words.py --content="文案内容"` 检测全部内容（分批时在自然断句处切割，避免截断句子），用户回复"3"则结束任务
     4. 若超过10000字符，**直接提示用户**"⚠ 当前内容字数超过10000字，查询将会消耗过多的时间和积分，强烈建议手动分批查询。"**并中断后续逻辑，不执行任何检测**
   - **文本类型文件（TXT/DOC/DOCX等）**：
     1. 先调用 `python scripts/check_sensitive_words.py --file=/path/to/file.txt --extract-only` 提取全部文字内容
     2. 若返回的 length 超过10000，**直接提示用户**"⚠ 当前内容字数超过10000字，查询将会消耗过多的时间和积分，强烈建议手动分批查询。"**并中断后续逻辑，不执行任何检测**；若超过3000且不超过10000，**必须暂停并询问用户**"⚠ 单次查询内容字数建议不超过3000字，现在已超过单次执行字数是否进行分批查询？\n回复1：执行单次查询（仅检测前3000字符）\n回复2：执行分批查询（检测全部内容）\n回复3：取消执行"**——必须等待用户回答后再继续，禁止未等用户回复就自行执行后续流程**——用户回复"1"则仅取前3000字符调用脚本检测，用户回复"2"则按3000字符分批调用 `python scripts/check_sensitive_words.py --content="..."` 检测全部内容，用户回复"3"则结束任务；若未超过3000字符，直接调用 `python scripts/check_sensitive_words.py --content="提取的内容"` 检测
   - **网页地址**：
     1. 先调用 `python scripts/check_sensitive_words.py --url=https://example.com --extract-only` 提取全部文字内容
     2. 若返回的 length 超过10000，**直接提示用户**"⚠ 当前内容字数超过10000字，查询将会消耗过多的时间和积分，强烈建议手动分批查询。"**并中断后续逻辑，不执行任何检测**；若超过3000且不超过10000，**必须暂停并询问用户**"⚠ 单次查询内容字数建议不超过3000字，现在已超过单次执行字数是否进行分批查询？\n回复1：执行单次查询（仅检测前3000字符）\n回复2：执行分批查询（检测全部内容）\n回复3：取消执行"**——必须等待用户回答后再继续，禁止未等用户回复就自行执行后续流程**——用户回复"1"则仅取前3000字符调用脚本检测，用户回复"2"则按3000字符分批调用 `python scripts/check_sensitive_words.py --content="..."` 检测全部内容，用户回复"3"则结束任务；若未超过3000字符，直接调用 `python scripts/check_sensitive_words.py --content="提取的内容"` 检测
   - **图片文件**：智能体先用read_image提取文字（仅提取图片中的文字内容，禁止识别图片的视觉风格描述），再用 --content 传入；若提取文字超过10000字符，**直接提示用户**"⚠ 当前内容字数超过10000字，查询将会消耗过多的时间和积分，强烈建议手动分批查询。"**并中断后续逻辑，不执行任何检测**；若超过3000且不超过10000字符，**必须暂停并询问用户**"⚠ 单次查询内容字数建议不超过3000字，现在已超过单次执行字数是否进行分批查询？\n回复1：执行单次查询（仅检测前3000字符）\n回复2：执行分批查询（检测全部内容）\n回复3：取消执行"**——必须等待用户回答后再继续，禁止未等用户回复就自行执行后续流程**——用户回复"1"则仅检测前3000字符，用户回复"2"则按3000字符分批检测全部内容，用户回复"3"则结束任务
   - **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标记。文件必须实际写入磁盘，写入后**必须将文件以卡片形式发送给用户**，禁止仅告知路径而不发送文件卡片）

---

## 资源索引

- 脚本:见 [scripts/check_sensitive_words.py](../scripts/check_sensitive_words.py)（用途与参数:一站式小红书违禁词检测，支持三种输入方式——`--content` 直接传入文案文本，`--file` 传入 TXT/DOC/DOCX 等文本类型文件路径自动提取，`--url` 传入网页地址自动提取（优先 Playwright 无头浏览器渲染 JS 动态页面，不可用时回退标准库 urllib 拉取静态 HTML）；`--extract-only` 仅提取文本不检测，返回 content 和 length；平台已硬编码为小红书）

## 注意事项

- 文案内容上限为3000字符；**所有输入类型（文本/文件/网页/图片）超过3000字符且不超过10000字符时均必须暂停并询问用户**"⚠ 单次查询内容字数建议不超过3000字，现在已超过单次执行字数是否进行分批查询？\n回复1：执行单次查询（仅检测前3000字符）\n回复2：执行分批查询（检测全部内容）\n回复3：取消执行"**——必须等待用户回答后再继续，禁止未等用户回复就自行执行后续流程**——用户回复"1"则仅检测前3000字符，用户回复"2"则按自然断句处切割分批检测（每批不超过3000字符），分批检测完成后必须汇总所有批次的替换结果输出一份完整的优化文案文件不可遗漏，用户回复"3"则结束任务；**超过10000字符时直接提示用户**"⚠ 当前内容字数超过10000字，查询将会消耗过多的时间和积分，强烈建议手动分批查询。"**并中断后续逻辑，不执行任何检测**
- 网络请求自动重试：遇到5xx、超时、连接重置等场景最多重试2次，智能体无需手动重试
- 脚本已内置英文误匹配过滤：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转为图片或文本类型文件后重新上传"
- 检测完成并输出结果、写入文件后，智能体可正常回复用户的后续提问（如调整替换词、重新检测、解释违禁规则等），不应因铁律约束而拒绝后续对话
