
Douyin Prohibited Word
- 234 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Use douyin-prohibited-word for development tasks
About
douyin-prohibited-word: A skill for development. This provides functionality for development workflows.
- douyin-prohibited-word
Douyin Prohibited Word by the numbers
- 234 all-time installs (skills.sh)
- +15 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,686 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/redfox-data/redfox-community --skill douyin-prohibited-wordAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 234 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Use douyin-prohibited-word for development tasks
Files
抖音违禁词检测
简介
抖音违禁词检测是一款专为抖音内容创作者和运营人员设计的智能合规检测工具,帮你快速排查文案中的违禁词并给出安全替换方案。
视频被限流、文案被下架?可能就是一两个词惹的祸。把文案扔进来,快速告诉你哪里踩雷、怎么改才安全。
通过简单的输入操作,你可以:
- 🔍 自动识别抖音违禁词,原文加粗定位风险点
- 💡 获得结合上下文的智能替换建议 + 更换理由
- ✏️ 一键生成替换后的可发布版本,复制粘贴就能用
适用于短视频编导、电商运营、直播策划、品牌市场等需要确保抖音文案合规发布的场景。
---
功能特性
🎯 核心功能
- 🔍 违禁词标记:原文中命中词直接加粗,一眼看到风险点
- 💡 智能替换建议:每个违禁词配一个结合上下文的替换词 + 更换理由,帮你"改通顺"而不是机械替换
- ✏️ 优化文案生成:直接输出一份替换后的可发布版本,替换词加粗标记,复制粘贴就能用
- 📎 文件自动交付:自动生成纯文本优化文案文件,点击即可下载保存
- 📏 长文案分批检测:超过 3000 字自动提醒,支持分批检测后自动合并结果
✨ 特色亮点
- 📥 多输入形态:支持直接粘贴文案、上传 TXT/DOC/DOCX 文件、上传图片提取文字、粘贴网页链接
- ⚡ 一站式处理:文本提取 + 违禁词检测一次完成,无需多次调用脚本
- 🌐 动态网页支持:网页检测使用 Playwright 无头浏览器渲染 JS 页面,也支持静态页面回退
- 🔤 英文误匹配过滤:内置英文单词误匹配过滤,不会把正常英文单词片段误判为违禁词
- 🔄 网络自动重试:遇到网络波动自动重试最多 3 次,无需手动干预
---
一键安装
前置条件
- Python 3.8+
- 已注册 红狐Hub 账号并获取 API Key(格式
ak_xxxxxxxx)
安装步骤
# 1. 安装 Python 依赖
pip install python-docx==1.1.0 beautifulsoup4==4.12.3 playwright==1.58.0
# 2. 安装 Playwright 浏览器(网页检测需要)
playwright install chromium---
鉴权
获取 API Key
1. 访问 红狐Hub 官网 了解服务详情 2. 前往 注册页面 注册账号 3. 新注册用户将获赠免费积分,可立即开始使用 API 服务 4. 注册登录后,在个人中心获取 API Key,格式为 ak_xxxxxxxx
配置 API Key
将 API Key 配置为环境变量 REDFOX_API_KEY:
方式一:临时设置(当前终端会话有效)
export REDFOX_API_KEY=ak_xxxxxxxx方式二:永久设置(推荐)
# Bash 用户
echo 'export REDFOX_API_KEY=ak_xxxxxxxx' >> ~/.bashrc
source ~/.bashrc
# Zsh 用户
echo 'export REDFOX_API_KEY=ak_xxxxxxxx' >> ~/.zshrc
source ~/.zshrc| 变量名 | 必填 | 说明 |
|---|---|---|
REDFOX_API_KEY | 是 | RedFox API 访问密钥,格式 ak_xxxxxxxx,脚本自动通过 X-API-KEY 请求头附加 |
---
使用指南
基础使用
1. 直接贴文案
最简单的用法,直接把抖音文案粘贴进来:
用户:帮我看下这段抖音脚本有没有违禁词:这款美白神器真的太有效了,用了三天就白了一个度
检测完成后自动输出三个板块:检测结果 → 修改建议 → 优化文案,并自动生成可下载的纯文本文件。
2. 上传文件
支持 TXT、DOC、DOCX 文件,直接上传即可自动提取文字并检测:
用户:[上传 script.docx] 帮我检查这个文档
脚本自动提取文件内容 → 字数判断 → 调用检测 API → 输出结果。
3. 上传图片
上传视频截图或字幕截图,自动提取图中文字进行检测(仅提取文字,不分析图片内容):
用户:[上传字幕截图.png] 检测图片里的文字有没有违禁词
4. 粘贴链接
直接粘贴网页地址,自动抓取页面文字内容进行检测:
用户:帮我检测这个网页 https://example.com/article
高级使用:超长文案分批检测
当文案超过 3000 字时,系统会自动暂停并询问:
- 回复 1:仅检测前 3000 字符
- 回复 2:分批检测全部内容,完成后自动合并结果
- 回复 3:取消
当文案超过 10000 字时,系统会提示建议手动分批,不执行检测。
命令速查
| 输入形态 | 助手动作 |
|---|---|
| 纯文本 | 计算字数 → 字数闸门 → --content="..." → 三板块输出 → 写文件 |
| 上传 TXT/DOC/DOCX | --file=path --extract-only 查字数 → 按规则检测 → 三板块输出 → 写文件 |
| 上传图片 | 仅提取图中文字 → 计算字数 → --content="提取文字" → 三板块输出 → 写文件 |
粘贴 https://... | --url=... --extract-only 查字数 → 按规则检测 → 三板块输出 → 写文件 |
| 超长文案(3000~10000) | 发出询问语,收到 1/2/3 后再继续 |
| 超长文案(>10000) | 直接提示建议手动分批,不执行检测 |
--content、--file、--url 三者互斥,每次调用仅传一个。平台已固定为抖音,无需指定。
输出格式说明
检测成功时,输出固定包含三个板块(顺序固定,禁止增减):
| 板块 | 内容 |
|---|---|
| 🔍 违禁词检测结果 | 检测平台、违禁词数量、违禁词类型 |
| 💡 修改建议 | 违禁词 → 替换词 → 更换理由 表格 |
| ✏️ 建议优化文案 | 替换后的完整文案,替换处加粗显示 |
未检测到违禁词时,仅输出「未检测到违禁词,文案内容合规✅」,不输出后两个板块。
重要:三板块输出完成后,会自动将纯文本优化文案写入 ./抖音_优化文案_{随机6位数字}.txt 并以文件卡片形式发送给用户,可直接点击下载。
---
使用场景
场景一:短视频脚本发布前自查
角色:短视频编导/创作者
需求:口播脚本、字幕文案发布前排查极限词、禁宣用语
使用方式: 1. 将完成的脚本文案粘贴进来 2. 查看违禁词标记和替换建议 3. 下载优化后的安全版本
预期收益:避免因违禁词导致视频限流或下架,安心发布
---
场景二:电商商品文案批量扫雷
角色:电商运营
需求:商品详情页、活动页文案上架前批量合规检测
使用方式: 1. 上传包含多条商品文案的 DOCX 文档 2. 系统自动分批检测长文档 3. 获取全部替换后的合规版本
预期收益:批量排查,避免商品因文案违规被下架处罚
---
场景三:直播话术合规过筛
角色:直播话术策划
需求:直播间台词、促销话术上线前快速过筛
使用方式: 1. 直接粘贴直播话术脚本 2. 一键获取违禁词位置和替换建议 3. 根据建议调整话术
预期收益:保障直播话术合规,降低直播风险
---
场景四:品牌落地页文案抽查
角色:品牌/市场团队
需求:落地页、H5 活动页发布前文案合规抽查
使用方式: 1. 粘贴落地页 URL 2. 系统自动抓取页面文字内容 3. 检测文案合规性
预期收益:快速完成页面文案审核,避免对外发布后出现问题
---
项目架构
目录结构
douyin-prohibited-word/
├── SKILL.md # Skill 说明文档(本文件)
├── references/
│ └── core_workflow.md # 完整执行规程(输出模板、铁律、详细步骤)
├── scripts/
│ └── check_sensitive_words.py # 核心检测脚本
└── _meta.json # 元数据配置技术栈
| 组件 | 技术 |
|---|---|
| 运行环境 | Python 3.8+ |
| HTTP 请求 | requests(Python 原生 HTTP 库,自动重试) |
| 文档解析 | python-docx(DOC/DOCX) |
| 网页提取 | Playwright(JS 动态页面)+ BeautifulSoup4(静态页面回退) |
| 检测平台 | 抖音(硬编码) |
核心模块说明
| 模块 | 文件 | 职责 |
|---|---|---|
| 文本提取 | check_sensitive_words.py — extract_from_file() / extract_from_web() | 从文件、网页中提取文本内容 |
| 违禁词检测 | check_sensitive_words.py — check_sensitive_words() | 调用违禁词检测 API,返回标记后的 HTML + 违禁词列表 |
| 英文误匹配过滤 | check_sensitive_words.py | 自动过滤英文单词内部子串误标(如 "Glasswing" 中的 "ass") |
| 执行规程 | references/core_workflow.md | 完整的输出模板、执行铁律、超长内容处理规则、异常处理话术 |
---
常见问答
安装相关问题
Q1: 安装时提示缺少依赖库怎么办?
A: 按以下命令安装缺失的依赖:
pip install python-docx==1.1.0 beautifulsoup4==4.12.3 playwright==1.58.0
playwright install chromiumQ2: Playwright 安装失败怎么办?
A: 网页检测需要 Playwright 渲染 JS 页面。如果 Playwright 不可用,脚本会自动回退到静态页面提取方式,不影响其他功能使用。
---
使用相关问题
Q3: 一次最多能检测多少内容?
A: 单次检测上限 3000 字符。3000~10000 字符支持分批检测后自动合并,超过 10000 字符建议手动分批。
Q4: 支持哪些文件格式?
A: 支持 TXT、DOC、DOCX、CSV、MD 等文本类型文件,以及常见图片格式(提取图中文字)。暂不支持 PDF,请转为图片或文本文件后上传。
Q5: 数据会外传吗?如何保障隐私?
A: 文案将通过加密 HTTPS 连接发送至检测服务进行匹配,不在本地存储。
---
故障排除
Q6: 检测服务返回异常怎么办?
A: 脚本内置自动重试机制(最多 3 次),偶尔网络波动会自动重试。如果多次重试仍失败,请稍后重试或联系技术支持。
Q7: 英文单词被误判为违禁词?
A: 已内置英文误匹配过滤。脚本会自动识别并过滤英文单词内部子串误标(如 "Glasswing" 中的 "ass"),无需额外处理。
Q8: 文件或网页提取失败?
A: 请检查文件格式是否正确、网址是否可正常访问。PDF 文件不支持,请先转换为图片或文本格式。
---
获取帮助
- 完整执行规程、输出模板、执行铁律详见 `references/core_workflow.md`
---
触发条件
满足以下任一即激活本 Skill:
- 用户提到「抖音违禁词」「抖音敏感词」「抖音审核」「限流词」「脚本合规」「口播文案合规」
- 用户要求检测抖音短视频脚本、直播话术、字幕文案、商品详情等内容安全性
- 用户上传文件/图片/链接并提到抖音相关的检测需求
执行铁律
调用脚本、格式化输出前,必须先读取并严格遵循 `references/core_workflow.md` 全文。核心原则:
1. 禁止编造结果 —— 仅以脚本返回 JSON 为准,不得臆造违禁词或替换建议 2. 禁止输出原始 JSON —— 必须解析后填入输出模板 3. 禁止多余寒暄 —— 仅输出三个板块(🔍检测结果、💡修改建议、✏️优化文案),无开场白/结束语 4. 分批/字数超限必须暂停 —— 发出提示后立即停止,等待用户明确回复 1/2/3 后再继续 5. 图片仅限文字 —— 禁止获取图片的视觉风格、布局、色彩、人物等任何非文字信息 6. 必须交付文件 —— 三板块输出完成后,必须将纯文本优化文案写入 ./抖音_优化文案_{随机6位数字}.txt 并以卡片形式发送给用户,禁止省略 A: 已内置英文误匹配过滤。脚本会自动识别并过滤英文单词内部子串误标(如 "Glasswing" 中的 "ass"),无需额外处理。
Q8: 文件或网页提取失败?
A: 请检查文件格式是否正确、网址是否可正常访问。PDF 文件不支持,请先转换为图片或文本格式。
---
获取帮助
- 完整执行规程、输出模板、执行铁律详见 `references/core_workflow.md`
---
触发条件
满足以下任一即激活本 Skill:
- 用户提到「抖音违禁词」「抖音敏感词」「抖音审核」「限流词」「脚本合规」「口播文案合规」
- 用户要求检测抖音短视频脚本、直播话术、字幕文案、商品详情等内容安全性
- 用户上传文件/图片/链接并提到抖音相关的检测需求
执行铁律
调用脚本、格式化输出前,必须先读取并严格遵循 `references/core_workflow.md` 全文。核心原则:
1. 禁止编造结果 —— 仅以脚本返回 JSON 为准,不得臆造违禁词或替换建议 2. 禁止输出原始 JSON —— 必须解析后填入输出模板 3. 禁止多余寒暄 —— 仅输出三个板块(🔍检测结果、💡修改建议、✏️优化文案),无开场白/结束语 4. 分批/字数超限必须暂停 —— 发出提示后立即停止,等待用户明确回复 1/2/3 后再继续 5. 图片仅限文字 —— 禁止获取图片的视觉风格、布局、色彩、人物等任何非文字信息 6. 必须交付文件 —— 三板块输出完成后,必须将纯文本优化文案写入 ./抖音_优化文案_{随机6位数字}.txt 并以卡片形式发送给用户,禁止省略
Douyin Prohibited Word Checker / douyin-prohibited-word
---
Overview
Detect prohibited words in copy, files, or web pages for Douyin (TikTok China), highlight hits in bold, and deliver replacement suggestions plus a safe revised version—so you can spot compliance risks before publishing.
Core Value
- 🔍 Spot risks at a glance: Hits are bolded in the original text so you see exactly what to fix
- 💡 Reads naturally after edits: Each hit gets a context-aware replacement and a clear reason—not a blunt find-and-replace
- ✏️ Ready to publish: Get a full revised copy in one go, plus an auto-generated plain-text file you can download
Intended Users
- 🎬 Short-video creators / editors — Pre-check voiceover scripts and subtitles to avoid throttling or takedowns
- 🛍️ E-commerce operators — Compliance-check product detail and campaign copy before listing
- 🎙️ Live-stream script planners — Quickly screen promo lines and live-room scripts
- 🏢 Brand / marketing teams — Spot-check landing pages and H5 campaign copy
---
Features
Core Capabilities
- Prohibited-word highlighting: Hits are bolded in the original text for instant visibility
- Smart replacement suggestions: Each hit includes a context-aware replacement and rationale—so edits flow naturally
- Optimized copy generation: Delivers a publish-ready full version with replacements bolded for easy copy-paste
- Automatic file delivery: Generates a downloadable plain-text optimized copy file
- Batch checks for long copy: Prompts when content exceeds 3,000 characters; supports batch detection with merged results
---
API Key Acquisition & Security
- This skill requires the environment variable:
REDFOX_API_KEY. REDFOX_API_KEYis issued by RedFoxHub (https://redfox.hk).- Register at RedFoxHub to obtain
REDFOX_API_KEY. - Configure
REDFOX_API_KEYon your device before using this skill. - Before providing your key, confirm its source, scope, validity period, and whether it can be reset or revoked.
- Do not hard-code or expose keys in plain text in code, prompts, logs, or output files.
---
Usage Guide
Describe your need in natural language—no commands to memorize. You can paste copy, upload TXT/DOC/DOCX files, upload images for text extraction, or paste a web page URL.
Quick Reference
| Intent | Example phrase | Result |
|---|---|---|
| Paste copy | "Check this Douyin script for prohibited words: This whitening product really works…" | Detection results, edit suggestions, optimized copy, and a downloadable file |
| Upload a file | "[Upload script.docx] Check this document for me" | Text is extracted automatically, then checked |
| Upload an image | "[Upload subtitle-screenshot.png] Check the text in this image for prohibited words" | Text is extracted from the image and checked (text only—no visual analysis) |
| Paste a URL | "Check this page for prohibited words: https://example.com/article" | Page text is fetched automatically, then checked |
| Long copy | When copy exceeds 3,000 characters, you'll be asked how to proceed | Choose first segment only, batch full check, or cancel |
Output Example
After detection, you receive three sections (fixed order):
🔍 Prohibited Word Detection Results — Platform, hit count, and word categories
💡 Edit Suggestions — Prohibited word → replacement → reason (in a table)
✏️ Suggested Optimized Copy — Full revised text with replacements bolded, plus an auto-generated downloadable plain-text file
If no prohibited words are found, you only see: "No prohibited words detected. Copy is compliant ✅."
---
Use Cases
| Scenario | Role | Example question | Benefit |
|---|---|---|---|
| Pre-publish script check | Creator / editor | "Check this voiceover script for Douyin prohibited words" | Avoid throttling or takedowns caused by risky wording |
| Bulk product copy screening | E-commerce operator | "[Upload product-copy.docx] Screen for prohibited words before listing" | Batch screening to reduce listing penalties from non-compliant copy |
| Live-stream script review | Live script planner | "Are there sensitive words in this promo script? How should I fix them?" | Keep live-room scripts compliant and lower live-stream risk |
| Landing page spot check | Brand / marketing | "Check whether the copy on this campaign page URL is compliant" | Fast page copy review before going live |
---
抖音违禁词检测 / douyin-prohibited-word
---
简介
检测文案、文件或网页中的抖音违禁词并加粗显示,提供违禁词替换建议和替换后的安全文案,帮你发布前快速排查合规风险。
核心价值
- 🔍 一眼定位风险:原文中命中词直接加粗,哪里踩雷一目了然
- 💡 改得通顺:每个违禁词给出结合上下文的替换词与更换理由,不是机械替换
- ✏️ 拿来就能发:一键生成替换后的完整文案,并自动交付可下载的纯文本文件
适用对象
- 🎬 短视频编导 / 创作者 — 口播脚本、字幕文案发布前排查,避免限流或下架
- 🛍️ 电商运营 — 商品详情页、活动页文案上架前批量合规检测
- 🎙️ 直播话术策划 — 直播间台词、促销话术上线前快速过筛
- 🏢 品牌 / 市场团队 — 落地页、H5 活动页文案合规抽查
---
功能特性
核心功能
- 违禁词标记:原文中命中词直接加粗,一眼看到风险点
- 智能替换建议:每个违禁词配一个结合上下文的替换词 + 更换理由,帮你「改通顺」而不是机械替换
- 优化文案生成:直接输出一份替换后的可发布版本,替换词加粗标记,复制粘贴就能用
- 文件自动交付:自动生成纯文本优化文案文件,点击即可下载保存
- 长文案分批检测:超过 3000 字自动提醒,支持分批检测后自动合并结果
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接用自然语言描述需求,无需记忆命令。支持粘贴文案、上传 TXT/DOC/DOCX 文件、上传图片提取文字,或粘贴网页链接。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 直接贴文案 | 「帮我看下这段抖音脚本有没有违禁词:这款美白神器真的太有效了……」 | 输出检测结果、修改建议、优化文案,并生成可下载文件 |
| 上传文件 | 「[上传 script.docx] 帮我检查这个文档」 | 自动提取文档文字并完成检测 |
| 上传图片 | 「[上传字幕截图.png] 检测图片里的文字有没有违禁词」 | 提取图中文字并完成检测(仅文字,不分析画面) |
| 粘贴链接 | 「帮我检测这个网页 https://example.com/article」 | 自动获取页面文字并完成检测 |
| 超长文案 | 文案超过 3000 字时会询问处理方式 | 可选仅检前段、分批全检或取消 |
输出示例
检测完成后,你将收到三个板块(顺序固定):
🔍 违禁词检测结果 — 检测平台、违禁词数量、违禁词类型
💡 修改建议 — 违禁词 → 替换词 → 更换理由(表格形式)
✏️ 建议优化文案 — 替换后的完整文案,替换处加粗显示;同时自动生成可下载的纯文本文件
若未检测到违禁词,则仅提示「未检测到违禁词,文案内容合规✅」。
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 脚本发布前自查 | 短视频编导/创作者 | 「帮我检查这段口播脚本有没有抖音违禁词」 | 避免因违禁词导致视频限流或下架 |
| 商品文案批量扫雷 | 电商运营 | 「[上传商品文案.docx] 上架前帮我过一遍违禁词」 | 批量排查,降低商品因文案违规被处罚风险 |
| 直播话术合规过筛 | 直播话术策划 | 「这段促销直播话术有没有敏感词,怎么改安全」 | 保障直播话术合规,降低直播风险 |
| 落地页文案抽查 | 品牌/市场团队 | 「帮我检测这个活动页链接里的文案是否合规」 | 快速完成页面文案审核,避免对外发布后出问题 |
---
抖音违禁词查询 — 核心工作流
执行本 Skill 时须完整遵守本文档全部条款;与 scripts/check_sensitive_words.py 配合使用。
任务目标
- 本 Skill 用于:检测用户输入的文案、上传的文件(图片/TXT/DOC/DOCX等文本类型文件)或网页地址中是否包含抖音违禁词,将违禁词加粗显示,提供替换建议和仅替换违禁词后的文案
- 能力包含:支持文本、文件、网页三种输入方式的抖音违禁词查询,一站式检测无需多次调用脚本
- 触发条件:用户输入文案内容、上传文件、提供网页地址,需要检测抖音违禁词
前置准备
- 依赖说明:脚本依赖python-docx(Word文档提取)、beautifulsoup4(网页内容提取)、playwright(无头浏览器渲染JS动态网页,需执行
playwright install chromium安装浏览器);网络请求使用原生 requests 库 - 非标准文件/文件夹准备:无
超长内容处理规则(所有输入类型通用)
当获取到的文案字符数超过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,原文中违禁词用加粗,单独成段展示确保渲染生效】
⚠️ 数据说明:以上查询结果仅供参考,请您根据企业经营范围和产品实际效果或功效,自行核对。
💡 修改建议
针对每个违禁词,提供安全的替换表达。
| 违禁词 | 替换词 | 更换理由 |
|---|---|---|
| 【违禁词1】 | 【替换词1】 | 【更换理由1】 |
| 【违禁词2】 | 【替换词2】 | 【更换理由2】 |
✏️ 建议优化文案
💡 加粗文案表示已替换的文案
【仅将违禁词替换为对应的安全替换词,替换时必须确保替换词与前后文语境通顺、语法正确、语义自然,如需微调前后助词/连接词以保证通顺则一并调整;所有替换词及微调处用加粗标记;不改变原文语气、排版、用词风格,不添加emoji,不重写文案;该板块不使用代码块包裹,直接输出富文本】
---
输出格式铁律
1. 检测结果输出时仅输出上述三个板块,禁止在该结果中添加开场白、结束语、补充说明、额外标题等任何其他内容;但检测完成并输出结果后,智能体可正常回复用户的后续提问 2. 三个板块标题必须加粗,emoji在加粗标记外:🔍 违禁词检测结果、💡 修改建议、✏️ 建议优化文案 3. ✏️建议优化文案必须确保替换词与前后文语境通顺,整句话语法正确、语义自然,禁止机械替换单词导致语病(如"回神秘公寓"→"回神秘居所"而非"回神秘公寓");如需微调前后助词/连接词以保证通顺则一并调整并用加粗标记;不改变原文语气/排版/用词风格,禁止添加emoji,禁止重写文案;所有替换词及微调处必须用加粗显示;该板块不使用代码块包裹,直接输出富文本 4. 【不可跳过】三板块输出完成后,智能体必须将纯文本优化文案写入文件 ./抖音_优化文案_{随机6位数字}.txt,文件内容与"✏️建议优化文案"完全一致但移除所有HTML标记,仅保留纯文本。写入后必须将文件以卡片形式发送给用户,让用户可以直接点击下载,禁止仅告知文件路径而不发送文件卡片。该文件必须实际写入磁盘,禁止省略不输出、禁止仅提示文件名而不写入内容、禁止不发送文件卡片。分批检测时,所有批次检测完成后,必须将全部批次的替换结果按原文顺序汇总为一份完整的优化文案写入文件并发送文件卡片,不可遗漏任何批次的内容 5. 脚本返回JSON后,智能体必须解析并填入模板,禁止直接输出原始JSON 6. 未检测到违禁词(word_count=0)时:仅输出"🔍 违禁词检测结果"板块,内容为"未检测到违禁词,文案内容合规✅",不输出后两个板块,不输出文件
---
完整输出示例
用户输入:"这款美白神器真的太有效了,用了三天就白了一个度"
🔍 违禁词检测结果
- ☁️检测平台:抖音
- 违禁词数量:2个
- 违禁词类型:禁用词
📚 违禁文案: 这款美白神器真的太有效了,用了三天就白了一个度
⚠️ 数据说明:以上查询结果仅供参考,请您根据企业经营范围和产品实际效果或功效,自行核对。
💡 修改建议
针对每个违禁词,提供安全的替换表达。
| 违禁词 | 替换词 | 更换理由 |
|---|---|---|
| 有效 | 用着感觉不错 | "有效"属禁用词,改为描述使用感受的口语化表达 |
| 白了一个度 | 肤色提亮了不少 | "白了一个度"暗示美白功效,改为描述视觉感受的间接表达 |
✏️ 建议优化文案
💡 加粗文案表示已替换的文案
这款美白神器真的太用着感觉不错了,用了三天就肤色提亮了不少
(三板块输出完成后,智能体必须将纯文本优化文案写入 ./抖音_优化文案_{随机6位数字}.txt,内容与上方一致但无HTML标记。文件必须实际写入磁盘,写入后必须将文件以卡片形式发送给用户,禁止仅告知路径而不发送文件卡片)
---
注意事项
- 所有输入类型(文本/文件/网页/图片)超过3000字符时,必须按【超长内容处理规则】处理;3000 < 字数 ≤ 10000 提示"⚠ 单次查询内容字数建议不超过1000字,现在已超过单次执行字数是否进行分批查询?",用户回复1执行单次查询(仅前3000字符),回复2分批查询(每批3000字符),回复3取消执行;字数 > 10000 直接提示"⚠ 当前内容字数超过10000字,查询将会消耗过多的时间和积分,强烈建议手动分批查询。"并中断,不执行任何检测
- 网络请求自动重试:遇到5xx、超时、连接错误等场景最多重试2次,智能体无需手动重试
- API凭证:脚本通过环境变量
REDFOX_API_KEY读取API Key(支持从 ~/.bashrc / ~/.zshrc 等 shell 配置文件自动回退读取),请求头自动附加X-API-KEY,无需智能体手动传入 - 脚本已内置英文误匹配过滤:API会将英文单词内部子串误标为违禁词(如"Glasswing"中的"ass"),脚本自动识别并过滤此类误匹配,无需智能体额外处理
- 违禁词用加粗标记;优化文案中替换词用加粗标记
- "✏️建议优化文案"仅替换违禁词,替换时必须确保与前后文语境通顺、语法正确,如需微调前后助词/连接词以保证通顺则一并调整并用加粗标记;禁止改变语气/排版/添加emoji/重写文案
- 【不可跳过】三板块输出完成后必须将纯文本优化文案写入
./抖音_优化文案_{随机6位数字}.txt,其中随机数由智能体每次生成(如用当前时间戳后6位或随机6位数字),确保连续对话中不同次检测的文件名唯一、内容不被覆盖。文件内容与"✏️建议优化文案"一致但移除所有HTML标记。写入后必须将文件以卡片形式发送给用户,让用户可以直接点击下载,禁止仅告知文件路径而不发送文件卡片。该文件必须实际写入磁盘,禁止省略、禁止仅提示文件名而不写入内容、禁止不发送文件卡片。分批检测时,所有批次完成后必须将全部替换结果按原文顺序汇总写入一份完整文件并发送文件卡片,不可遗漏任何批次 - 图片文件由智能体先用read_image提取文字(仅提取图片中的文字内容,禁止识别图片的视觉风格描述),再以 --content 传入脚本检测
- 不支持PDF文件,若用户上传PDF需提醒"不支持PDF文件,请将PDF转为图片或文本类型文件后重新上传"
- 检测完成并输出结果、写入文件后,智能体可正常回复用户的后续提问(如调整替换词、重新检测、解释违禁规则等),不应因铁律约束而拒绝后续对话
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import json
import os
import re
import sys
import requests
try:
from docx import Document
from bs4 import BeautifulSoup
except ImportError as e:
print(json.dumps({"status": "error", "error": f"缺少依赖库: {str(e)}"}, ensure_ascii=False))
sys.exit(1)
# API配置
API_URL = "https://redfox.hk/story/api/cozeSkill/sensitiveWordSearch"
# API单次查询内容长度上限(字符数)
MAX_CONTENT_LENGTH = 3000
# 内容最大限制(字符数),超过此值直接提示并中断
MAX_TOTAL_LENGTH = 10000
# ============================================================
# API Key 获取
# ============================================================
def _get_api_key():
"""获取 REDFOX_API_KEY,优先级:环境变量 > shell 配置文件,均未获取到返回 None"""
# 1. 从环境变量获取
api_key = os.getenv("REDFOX_API_KEY")
if api_key and api_key.strip():
return api_key.strip()
# 2. 从 shell 配置文件中读取
home = os.path.expanduser("~")
shell_configs = [
os.path.join(home, ".zshrc"),
os.path.join(home, ".bashrc"),
os.path.join(home, ".bash_profile"),
os.path.join(home, ".profile"),
]
for config_path in shell_configs:
if not os.path.isfile(config_path):
continue
try:
with open(config_path, "r", encoding="utf-8", errors="replace") as f:
for line in f:
# 匹配 export REDFOX_API_KEY=... 或 REDFOX_API_KEY=...
m = re.match(
r'^\s*(?:export\s+)?REDFOX_API_KEY\s*=\s*["\']?([^"\'\n]+)["\']?\s*$',
line
)
if m:
val = m.group(1).strip()
if val:
return val
except Exception:
continue
return None
# ============================================================
# 文本提取
# ============================================================
def extract_from_file(file_path):
"""从文件中提取文本(支持DOC、DOCX、TXT等文本类型文件)"""
if not os.path.exists(file_path):
raise Exception(f"文件不存在: {file_path}")
file_ext = os.path.splitext(file_path)[1].lower()
if file_ext == '.pdf':
raise Exception("不支持PDF文件,请上传图片、TXT等文本类型文件")
elif file_ext in ['.doc', '.docx']:
doc = Document(file_path)
text = ""
for paragraph in doc.paragraphs:
text += paragraph.text + "\n"
return text.strip()
elif file_ext == '.txt':
with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
return f.read().strip()
elif file_ext in ['.csv', '.md', '.log', '.json', '.xml', '.html', '.htm']:
with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
return f.read().strip()
else:
raise Exception(f"不支持的文件类型: {file_ext},仅支持图片、TXT、DOC、DOCX等文本类型文件")
def extract_from_web(url):
"""
从网页中提取文本。优先使用Playwright无头浏览器渲染JS后提取(支持SPA页面),
若Playwright不可用则回退到requests静态提取。
"""
if not url.startswith(('http://', 'https://')):
url = 'https://' + url
# 优先尝试Playwright(支持SPA/JS动态渲染页面)
try:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(url, timeout=30000)
page.wait_for_timeout(3000) # 等待JS渲染
# 优先提取文章正文区域(常见选择器)
article_selectors = [
'article', '.article-content', '.article-body', '.article-detail',
'.post-content', '.post-body', '.content-body', '.entry-content',
'.rich_media_content', '#js_content', '.detail-content',
'.article-content', '.news-content', '.text-content',
]
text = None
for selector in article_selectors:
try:
el = page.query_selector(selector)
if el:
extracted = el.inner_text().strip()
if len(extracted) > 100: # 正文区域通常较长
text = extracted
break
except Exception:
continue
# 无匹配正文区域时回退到body
if not text:
text = page.inner_text('body')
browser.close()
return text.strip()
except Exception:
pass # Playwright不可用,回退到requests方式
# 回退:requests静态提取
try:
resp = requests.get(url, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept": "text/html, */*"
}, timeout=30)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, 'html.parser')
for tag in soup(["script", "style", "noscript"]):
tag.decompose()
text = soup.get_text(separator='\n', strip=True)
return text.strip()
except Exception as e:
raise Exception(f"网页内容提取失败: {str(e)}")
# ============================================================
# 违禁词检测
# ============================================================
def check_sensitive_words(content):
"""
调用抖音违禁词检测API(POST方式,JSON body)
Args:
content: 待检测的文案内容
Returns:
dict: 包含检测结果和格式化HTML的字典
"""
# 内容长度校验
if len(content) > MAX_CONTENT_LENGTH:
return {
"status": "error",
"platform": "抖音",
"original_content": content[:200] + "...",
"error": f"文案内容过长({len(content)}字符),单次上限为{MAX_CONTENT_LENGTH}字符,请缩减后重试"
}
# 获取凭证
api_key = _get_api_key()
if not api_key:
return {
"status": "error",
"platform": "抖音",
"original_content": content,
"error": "未找到 REDFOX_API_KEY,请设置环境变量 REDFOX_API_KEY=ak_xxxxxxxx 或在 shell 配置文件(~/.bashrc / ~/.zshrc 等)中添加 export REDFOX_API_KEY=ak_xxxxxxxx"
}
# 请求参数
payload = {
"content": content,
"platform": "抖音",
"source": "抖音违禁词查询-GitHub"
}
headers = {
"Content-Type": "application/json",
"X-API-KEY": api_key
}
try:
# 发起POST请求(自动重试:5xx、超时等场景)
last_error = None
for attempt in range(3): # 最多3次(1次原始 + 2次重试)
try:
response = requests.post(
API_URL,
json=payload,
headers=headers,
timeout=30
)
if response.status_code >= 500 and attempt < 2:
import time
time.sleep(1 * (attempt + 1))
continue
break
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
last_error = e
if attempt < 2:
import time
time.sleep(1 * (attempt + 1))
continue
return {
"status": "error",
"platform": "抖音",
"original_content": content,
"error": f"请求失败: {str(e)},已重试2次仍失败"
}
if response.status_code >= 400:
raise Exception(f"HTTP请求失败: {response.status_code}, {response.text[:500]}")
# 解析响应
resp = response.json()
# API返回格式: {"code": 2000, "data": {...}, "msg": "成功"}
api_code = resp.get("code", 0)
if api_code != 2000:
raise Exception(f"API业务错误: code={api_code}, msg={resp.get('msg', '未知')}")
api_data = resp.get("data") or {}
# 从API返回的content中提取违禁词列表
# API格式: content中用<span class="banned-word">或<span class="sensitive-word">标记违禁词
api_content = api_data.get("content") or ""
original_content = api_data.get("originalContent") or content
prohibited_words_type = api_data.get("prohibitedWordsType") or []
# 提取违禁词文本(兼容banned-word/sensitive-word/industry-banned-word三种类名,去重)
sensitive_words = list(dict.fromkeys(
re.findall(r'<span class="(?:banned-word|sensitive-word|industry-banned-word)">(.*?)</span>', api_content)
))
# 将所有违禁词标签样式统一替换为<b>加粗样式
html_content = re.sub(
r'<span class="(?:banned-word|sensitive-word|industry-banned-word)">',
'<b>',
api_content
)
html_content = html_content.replace('</span>', '</b>')
# 过滤英文误匹配:API会将英文单词内部子串误标为违禁词(如"Glasswing"中的"ass")
# 从原文提取所有英文单词,若违禁词是某个英文单词的子串则视为误匹配
english_words = re.findall(r'[A-Za-z]+', original_content)
false_positive_words = set()
for ew in english_words:
for sw in sensitive_words:
if sw.isascii() and sw.isalpha() and sw.lower() in ew.lower() and sw.lower() != ew.lower():
false_positive_words.add(sw)
# 从sensitive_words中移除误匹配项
sensitive_words = [w for w in sensitive_words if w not in false_positive_words]
# 从html_content中移除误匹配的span标签,还原为纯文本
for fpw in false_positive_words:
escaped = re.escape(fpw)
html_content = re.sub(
rf'<b>{escaped}</b>',
fpw,
html_content
)
result = {
"status": "success",
"platform": "抖音",
"original_content": original_content,
"sensitive_words": sensitive_words,
"prohibited_words_type": prohibited_words_type,
"word_count": len(sensitive_words),
"html_content": html_content
}
return result
except json.JSONDecodeError as e:
return {
"status": "error",
"platform": "抖音",
"original_content": content,
"error": f"响应解析失败: {str(e)}"
}
except Exception as e:
return {
"status": "error",
"platform": "抖音",
"original_content": content,
"error": f"处理失败: {str(e)}"
}
def main():
parser = argparse.ArgumentParser(description="抖音违禁词检测工具")
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--content", help="直接传入文案文本")
group.add_argument("--file", help="文件路径(支持TXT、DOC、DOCX等文本类型文件)")
group.add_argument("--url", help="网页地址")
parser.add_argument("--extract-only", action="store_true", help="仅提取文本不检测,返回提取的文本内容和长度")
args = parser.parse_args()
# 获取文本内容
try:
if args.content:
text = args.content
elif args.file:
text = extract_from_file(args.file)
elif args.url:
text = extract_from_web(args.url)
else:
print(json.dumps({"status": "error", "error": "请指定输入方式:--content、--file 或 --url"}, ensure_ascii=False))
return
except Exception as e:
print(json.dumps({"status": "error", "error": f"文本提取失败: {str(e)}"}, ensure_ascii=False))
return
if not text:
print(json.dumps({"status": "error", "error": "未提取到文本内容"}, ensure_ascii=False))
return
# 仅提取模式:返回文本内容和长度,不调用检测API
if args.extract_only:
print(json.dumps({"status": "extracted", "content": text, "length": len(text)}, ensure_ascii=False))
return
# 调用违禁词检测
result = check_sensitive_words(text)
print(json.dumps(result, ensure_ascii=False))
if __name__ == "__main__":
main()