
Wechat Prohibited Word
- 225 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Use wechat-prohibited-word for development tasks
About
wechat-prohibited-word: A skill for development. This provides functionality for development workflows.
- wechat-prohibited-word
Wechat Prohibited Word by the numbers
- 225 all-time installs (skills.sh)
- +15 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,726 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 wechat-prohibited-wordAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 225 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Use wechat-prohibited-word for development tasks
Files
公众号违禁词查询
简介
公众号违禁词查询是一款专为公众号内容创作者和运营人员设计的合规检测工具,基于官方违禁词库实时同步,覆盖广告法、医疗美容、金融风险等 10+ 类目。
通过简单的文案输入,你可以:
- 🔍 快速扫描文案中的违禁词与敏感表述,加粗标注风险位置
- 💡 获取每个违禁词的向上文语境的替换建议
- ✏️ 直接拿到一份替换后的合规文案,复制即可发布
- 📎 自动生成纯文本文件,方便存档和协作
适用于公众号运营、新媒体编辑、品牌市场团队、设计师等需要确保文案合规发布的场景。
本 Skill 基于 Python 脚本,通过 API 调用远端违禁词检测服务,支持文本、文件、网页、图片四种输入方式。
---
功能特性
核心功能
| 功能 | 说明 |
|---|---|
| 违禁词扫描 | 基于官方违禁词库,覆盖广告法极限词、医疗美容、金融风险、教育培训等 10+ 类目 |
| 风险标注 | 命中违禁词在原文中加粗显示,同时汇总违禁词类型与数量 |
| 智能替换 | 每个违禁词提供结合上下文的替换表达,附更换理由,不是机械同义词替换 |
| 优化文案生成 | 直接输出替换后的完整合规版本,替换处加粗标记,保持原文语气和风格 |
特色亮点
- 四种输入方式:支持直接粘贴文案、上传 TXT/DOC/DOCX 文件、上传图片自动提取文字、粘贴网页链接
- 长文案分批检测:超过 3000 字自动提醒,支持按自然断句处切割分批检测,结果自动合并
- 英文误匹配过滤:内置英文单词识别,不会把 "Glasswing" 中的 "ass" 误判为违禁词
- 网络异常容错:API 请求遇到 5xx、超时、连接失败时自动重试,无需手动干预
- 数据隐私保护:文案通过加密连接发送至检测服务,不在本地存储
---
一键安装
前置条件
- Python 3.7+ 运行环境
- pip 包管理器
- 已注册 红狐Hub 账号并获取 API Key
安装步骤
1. 将本 Skill 文件夹放入你的平台 Skill 目录 2. 安装 Python 依赖:
pip install requests python-docx beautifulsoup4 playwright
playwright install chromium3. 配置 API Key(见下方)
API Key 配置
获取 API Key
1. 访问 红狐Hub 官网 了解服务详情 2. 前往 注册页面 注册账号 3. 新注册用户将获赠免费积分,可立即开始使用 API 服务 4. 注册登录后,在个人中心获取 API Key,格式为 ak_xxxxxxxx
配置方式
| 配置方式 | 操作 | 说明 |
|---|---|---|
| 环境变量(推荐) | export REDFOX_API_KEY=ak_xxxxxxxx | 在当前终端会话生效 |
| Shell 配置文件 | 将上述 export 语句写入 ~/.bashrc 或 ~/.zshrc,执行 source ~/.bashrc | 永久生效,脚本自动读取 |
脚本获取 Key 的优先级:环境变量 REDFOX_API_KEY → Shell 配置文件自动扫描 → 提示用户配置---
使用指南
基础使用
方式一:直接粘贴文案
最常用的方式,适合快速检测草稿:
用户:帮我看下这篇公众号草稿有没有违禁词:这款美白神器真的太有效了,用了三天就白了一个度
>
助手:自动检测并输出违禁词标注、替换建议表和优化后文案
方式二:上传文件
支持 TXT、DOC、DOCX 格式,直接上传即可自动读取检测。
方式三:上传图片
上传海报截图或推文截图,系统自动提取图中文字进行检测(仅提取文字内容,不分析图片视觉风格)。
方式四:粘贴网页链接
提供文章 URL,系统自动抓取页面正文内容进行检测。
注意事项:
- 平台固定为公众号,无需手动指定
- 单次建议不超过 3000 字,超过会询问你是否分批检测
- 超过 10000 字的内容暂不支持,建议手动分批
- PDF 文件不支持,请转为图片或文本文件后上传
命令速查
| 命令 | 用途 |
|---|---|
python scripts/check_sensitive_words.py --content="文案" | 检测文本内容 |
python scripts/check_sensitive_words.py --file=/path/file.txt | 检测文件内容 |
python scripts/check_sensitive_words.py --url=https://... | 检测网页内容 |
python scripts/check_sensitive_words.py --file=/path/file.txt --extract-only | 仅提取文本,不检测 |
---
使用场景
场景一:公众号推文发布前自查
角色:公众号运营
需求:推文发出前确认没有极限词、禁用宣传用语,避免被平台删改或封号
使用方式: 1. 写完推文后直接粘贴到对话中 2. 查看违禁词标注结果 3. 复制优化文案替换原文发布
预期效果:提前排除合规风险,降低删文概率
---
场景二:多篇短文案批量预审
角色:新媒体编辑
需求:日常产出多篇短文,需要在发布前统一过一遍合规检查
使用方式: 1. 将多篇文案合并为一个 TXT 文件上传 2. 系统自动分批检测全部内容 3. 下载合并后的优化文案文件
预期效果:一次完成多篇检测,提升审稿效率
---
场景三:活动落地页文案抽查
角色:品牌/市场团队
需求:H5 页面、活动落地页上线前确认文案无违规风险
使用方式: 1. 提供页面 URL 2. 系统自动抓取正文并检测 3. 按替换建议修正违规表述
预期效果:避免活动页面因违规词被举报或下架
---
场景四:海报/推文图文字合规检查
角色:设计师
需求:海报中的营销文案需要确保不触犯广告法
使用方式: 1. 上传海报截图 2. 系统提取图中文字进行检测 3. 确认替换方案后修改设计稿
预期效果:在设计阶段即排除文字风险,减少返工
---
项目架构
目录结构
wechat-prohibited-word/
├── SKILL.md # Skill 说明文档(本文件)
├── scripts/
│ └── check_sensitive_words.py # 核心检测脚本
└── references/
└── core_workflow.md # Agent 执行规程(输出模板、格式铁律等)技术栈
| 组件 | 技术 | 说明 |
|---|---|---|
| 运行环境 | Python 3.7+ | 脚本执行环境 |
| HTTP 请求 | requests | 标准 HTTP 库,调用检测 API |
| 文档解析 | python-docx | Word 文档 (.doc/.docx) 文本提取 |
| 网页解析 | beautifulsoup4 + playwright | 静态 HTML 解析 + JS 动态页面渲染 |
| API 服务 | 红狐Hub | 官方违禁词库,POST+JSON 方式调用 |
数据流转
用户输入(文本/文件/网页/图片)
→ 脚本提取文本内容
→ HTTPS POST 发送至红狐Hub API
→ API 匹配违禁词库,返回标注结果
→ 脚本过滤英文误匹配,格式化输出 JSON
→ Agent 按模板呈现三板块结果 + 写入优化文案文件---
常见问答
安装配置
Q: 安装依赖时报错怎么办? A: 请确认 Python 版本≥3.7,并依次执行:
pip install --upgrade pip
pip install requests python-docx beautifulsoup4 playwright
playwright install chromiumQ: 提示 "未配置 REDFOX_API_KEY" 怎么办? A: 请按以下步骤处理: 1. 访问 redfox.hk 注册账号 2. 在个人中心复制 API Key(格式 ak_xxxxxxxx) 3. 执行 export REDFOX_API_KEY=ak_xxxxxxxx 或写入 ~/.bashrc
---
功能使用
Q: 支持检测哪些类型的违禁词? A: 覆盖广告法极限词("最好""第一"等)、医疗美容禁宣用语、金融收益承诺、教育培训夸大宣传、虚假广告用语、诱导分享话术等 10+ 类目。
Q: 长文案怎么处理? A: 3000 字以内直接检测;超过 3000 字会自动询问是否分批检测,在自然断句处切割保证语义完整;超过 10000 字建议手动分批。
Q: 英文内容会被误判吗? A: 不会。脚本内置英文误匹配过滤,正常英文单词中的子串不会被标记为违禁词。
---
故障排除
Q: 检测接口超时或报错? A: 脚本内置自动重试机制(最多 2 次),若仍然失败请稍后重试。持续异常请联系服务提供商。
Q: 网页内容提取失败? A: 部分需要登录或有反爬机制的页面无法提取。建议直接复制页面文字后粘贴检测。
Q: 上传的文件无法识别? A: 支持的文本文件格式:TXT、DOC、DOCX、CSV、MD、LOG、JSON、XML、HTML。PDF 不支持,请转为图片或文本文件。
---
获取帮助
如有其他问题,可通过以下方式获取支持:
- 🌐 访问 红狐Hub 查看文档
- 📧 邮件联系服务提供商
---
Agent 执行规程:进行检测、格式化输出前,必须先读取并严格遵循 `references/core_workflow.md` 全文。该文档包含输出模板、格式铁律、分批询问话术、异常处理表等完整执行细节。
WeChat Prohibited Word Checker / wechat-prohibited-word
---
Introduction
Scan WeChat Official Account copy, files, or web pages for prohibited and sensitive wording, highlight risks, and get compliant replacement suggestions—helping you pass review safely and avoid takedowns or traffic limits.
Core Value
- Fast scanning: Powered by an official prohibited-word library covering 10+ categories including advertising law, medical aesthetics, and financial risk; hits are bolded in the original text.
- Smart replacements: Context-aware alternative phrasing and rationale for each hit—not mechanical synonym swaps.
- Ready-to-publish copy: A full compliant version with replacements bolded; copy and publish as-is.
- Easy archiving: Auto-generated plain-text optimized copy files for team collaboration and records.
Who It's For
- 📱 WeChat operators — Pre-publish self-checks to reduce takedowns, traffic limits, and account risks.
- ✍️ New media editors — Batch compliance review for multiple short pieces, faster editorial workflow.
- 🏢 Brand / marketing teams — Spot-check campaign landing pages and H5 copy before launch.
- 🎨 Designers — Catch marketing copy risks in posters and tweet screenshots early in the design phase.
---
Features
Core Capabilities
- Prohibited-word scanning: Synced with the official library in real time—covers superlatives under advertising law, banned medical/beauty claims, financial return promises, exaggerated education/training claims, and 10+ other categories.
- Risk highlighting: Hits are bolded in the source text, with a summary of word types and counts.
- Smart replacements: Context-aware alternative phrasing for each hit, with rationale.
- Optimized copy generation: Full compliant version with replacements bolded, preserving tone and style.
Highlights
- Multiple input methods: Paste copy directly, upload TXT/DOC/DOCX files, upload images for automatic text extraction, or paste a web page URL.
- Long-copy batch detection: Alerts when content exceeds 3,000 characters; supports splitting at natural sentence breaks with merged results.
- English false-match filtering: Built-in English word recognition—substrings inside normal English words are not flagged incorrectly.
- Data privacy: Copy is sent to the detection service over an encrypted connection and is not stored locally.
---
API Key Acquisition & Security
- This skill requires the environment variable:
REDFOX_API_KEY. REDFOX_API_KEYis provided by RedFoxHub (https://redfox.hk).- Register at RedFoxHub to obtain your
REDFOX_API_KEY. - Configure the
REDFOX_API_KEYenvironment variable on your device before using this skill. - Before providing a key, confirm its source, scope, validity period, and whether reset/revocation is supported.
- Do not hard-code or expose keys in plain text in code, prompts, logs, or output files.
---
Usage Guide
Describe what you need in plain language—no fixed commands to memorize. The platform is fixed to WeChat Official Accounts; no manual platform selection is required.
Quick Phrase Reference
| Intent | Example prompt | Outcome |
|---|---|---|
| Paste copy to check | "Check this draft for prohibited words: This whitening miracle really works—you'll see results in three days" | Hit highlights, replacement table, and optimized copy |
| Upload a file | Upload a TXT, DOC, or DOCX file and ask for WeChat prohibited-word detection | File content is read and checked automatically |
| Upload an image | Upload a poster or tweet screenshot and ask to check the text in the image | Text is extracted from the image and checked |
| Paste a web URL | Provide a campaign or article URL and ask to check the page copy | Page body is fetched and checked automatically |
| Batch pre-review | Upload a file combining multiple short pieces and ask for a unified compliance check | All content is checked in batches with merged output |
Sample Output
After detection, you receive three sections (illustrative):
🔍 Prohibited Word Detection Results
- ☁️Platform: WeChat Official Account
- Prohibited word count: 2
- Word types: Banned terms
📚 Flagged copy: This whitening miracle really works—you'll see results in three days
💡 Revision Suggestions
| Prohibited word | Replacement | Rationale |
|---|---|---|
| works | feels quite nice to use | "Works" is a banned term; rephrased as a conversational usage experience |
| days | skin tone looks brighter | Implies whitening efficacy; rephrased as an indirect visual description |
✏️ Suggested Optimized Copy
This whitening miracle really feels quite nice to use—you'll see skin tone looks brighter in three days
(A downloadable plain-text optimized copy file is also generated for easy publishing and archiving.)
---
Use Cases
| Scenario | Role | Example question | Benefit |
|---|---|---|---|
| Pre-publish tweet self-check | WeChat operator | "Does this post contain superlatives or banned promotional language?" | Catch compliance risks early; lower takedown risk |
| Batch pre-review of short copy | New media editor | "Run a prohibited-word check on these short pieces together" | Check multiple pieces at once; faster editorial workflow |
| Campaign landing page spot-check | Brand / marketing | "Does the copy on this H5 campaign page have compliance risks?" | Avoid reports or takedowns due to prohibited wording |
| Poster text compliance check | Designer | "Do these marketing lines on the poster violate advertising law?" | Eliminate text risks during design; reduce rework |
---
公众号违禁词查询 / wechat-prohibited-word
---
简介
扫描公众号文案、文件或网页中的违禁词与敏感表述,标注风险并提供合规替换建议,帮你安全过审、避免删文限流。
核心价值
- 快速扫描:基于官方违禁词库,覆盖广告法、医疗美容、金融风险等 10+ 类目,命中词在原文中加粗标注。
- 智能替换:每个违禁词提供结合上下文的替换表达与更换理由,不是机械同义词替换。
- 即用文案:直接输出替换后的完整合规版本,替换处加粗标记,复制即可发布。
- 便捷存档:自动生成纯文本优化文案文件,方便团队协作与留存。
适用对象
- 📱 公众号运营 — 推文发布前自查,降低删文、限流与封号风险。
- ✍️ 新媒体编辑 — 多篇短文案统一过合规检查,提升审稿效率。
- 🏢 品牌 / 市场团队 — 活动落地页、H5 页面上线前确认文案无违规风险。
- 🎨 设计师 — 海报、推文截图中的营销文案在设计阶段即排除文字风险。
---
功能特性
核心功能
- 违禁词扫描:基于官方违禁词库实时同步,覆盖广告法极限词、医疗美容禁宣用语、金融收益承诺、教育培训夸大宣传等 10+ 类目。
- 风险标注:命中违禁词在原文中加粗显示,同时汇总违禁词类型与数量。
- 智能替换:针对每个违禁词提供结合上下文的替换表达,附更换理由说明。
- 优化文案生成:输出替换后的完整合规版本,替换处加粗标记,保持原文语气与风格。
特色亮点
- 多种输入方式:支持直接粘贴文案、上传 TXT/DOC/DOCX 文件、上传图片自动提取文字、粘贴网页链接。
- 长文案分批检测:超过 3000 字自动提醒,支持按自然断句处切割分批检测,结果自动合并。
- 英文误匹配过滤:内置英文单词识别,正常英文单词中的子串不会被误判为违禁词。
- 数据隐私保护:文案通过加密连接发送至检测服务,不在本地存储。
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接用自然语言描述需求,无需记忆固定命令。平台固定为公众号,无需手动指定。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 粘贴文案检测 | 「帮我看下这篇公众号草稿有没有违禁词:这款美白神器真的太有效了,用了三天就白了一个度」 | 输出违禁词标注、替换建议表和优化后文案 |
| 上传文件 | 上传 TXT、DOC 或 DOCX 文件,说明需要检测公众号违禁词 | 自动读取文件内容并完成检测 |
| 上传图片 | 上传海报截图或推文截图,要求检查图中文字 | 提取图中文字并完成合规检测 |
| 粘贴网页链接 | 提供活动页或文章 URL,要求检测页面文案 | 自动获取页面正文并完成检测 |
| 批量预审 | 将多篇文案合并为一个文件上传,要求统一过一遍合规检查 | 分批检测全部内容,合并输出优化文案 |
输出示例
完成检测后,你将收到三个板块的结果(示意):
🔍 违禁词检测结果
- ☁️检测平台:公众号
- 违禁词数量:2 个
- 违禁词类型:禁用词
📚 违禁文案: 这款美白神器真的太有效了,用了三天就白了一个度
💡 修改建议
| 违禁词 | 替换词 | 更换理由 |
|---|---|---|
| 有效 | 用着感觉不错 | 「有效」属禁用词,改为描述使用感受的口语化表达 |
| 白了一个度 | 肤色提亮了不少 | 「白了一个度」暗示美白功效,改为描述视觉感受的间接表达 |
✏️ 建议优化文案
这款美白神器真的太用着感觉不错了,用了三天就肤色提亮了不少
(同时会生成可下载的纯文本优化文案文件,便于复制发布与存档。)
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 推文发布前自查 | 公众号运营 | 「这篇推文有没有极限词或禁用宣传用语?」 | 提前排除合规风险,降低删文概率 |
| 多篇短文案批量预审 | 新媒体编辑 | 「帮我把这几篇短文一起过一遍违禁词检查」 | 一次完成多篇检测,提升审稿效率 |
| 活动落地页文案抽查 | 品牌 / 市场团队 | 「这个 H5 活动页的文案有没有违规风险?」 | 避免活动页面因违规词被举报或下架 |
| 海报文字合规检查 | 设计师 | 「海报上的这几句营销文案有没有触犯广告法?」 | 在设计阶段排除文字风险,减少返工 |
---
公众号违禁词查询 — 核心流程与输出规范
本文档为 Skill 的核心执行规程;进行检测、分批询问、结果呈现与文件输出时,必须先读取并严格遵循本文档全文。
数据源说明
本 Skill 的违禁词匹配基于官方违禁词库,通过独立后端 API 完成检测。执行脚本时,会将待检测内容通过 HTTPS POST 发往对接服务端(JSON),不在本地计算词库。
| 项目 | 说明 |
|---|---|
| 数据来源 | 官方违禁词库 |
| API 地址 | https://redfox.hk/story/api/cozeSkill/sensitiveWordSearch |
| 认证方式 | 环境变量 REDFOX_API_KEY(格式 ak_xxxxxxxx),请求头 X-API-KEY |
| 请求体字段 | content(待检测文案)、platform(固定为"公众号")、source(来源标识) |
| HTTP 库 | requests(标准库) |
对话指引:首次为用户检测前,应用一两句话说明「文案将通过加密连接发送至检测服务」;若用户拒绝外传数据,则不应调用检测脚本。
任务目标
- 本 Skill 用于:检测用户输入的文案、上传的文件(图片/TXT/DOC/DOCX等文本类型文件)或网页地址中是否包含公众号违禁词,将违禁词加粗显示,提供替换建议和仅替换违禁词后的文案
- 能力包含:支持文本、文件、网页三种输入方式的公众号违禁词查询,一站式检测无需多次调用脚本
- 触发条件(满足任一即激活本 Skill):
- 用户提到「公众号违禁词」「公众号敏感词」「推文合规」「广告法违禁词」「封号风险」
- 用户要求检测公众号推文、草稿、活动页、海报文字等内容安全性
- 用户上传文件/图片/链接并提到公众号相关的检测需求
前置准备
- 依赖说明:脚本依赖 python-docx(Word文档提取)、beautifulsoup4(网页内容提取)、playwright(无头浏览器渲染JS动态网页,需执行
playwright install chromium安装浏览器) - 凭证配置:脚本通过环境变量
REDFOX_API_KEY读取API Key(格式ak_xxxxxxxx),请求头以X-API-KEY方式传递;若环境变量未设置,脚本自动从~/.bashrc、~/.zshrc等 Shell 配置文件中读取 - 非标准文件/文件夹准备:无
操作步骤
执行铁律
1. 禁止编造结果 —— 仅以脚本返回 JSON 为准,不得臆造违禁词或替换建议 2. 禁止输出原始 JSON —— 必须解析后填入输出模板 3. 禁止多余寒暄 —— 仅输出三个板块(🔍检测结果、💡修改建议、✏️优化文案),无开场白/结束语 4. 分批/字数超限必须暂停 —— 发出提示后立即停止,等待用户明确回复 1/2/3 后再继续 5. 图片仅限文字 —— 禁止获取图片的视觉风格、布局、色彩、人物等任何非文字信息 6. 必须交付文件 —— 三板块输出完成后,必须将纯文本优化文案写入 ./公众号_优化文案_{随机6位数字}.txt 并以卡片形式发送给用户,禁止省略
流程总览
1. 智能体识别用户输入类型(文本/文件/网页/图片),执行对应流程 2. 解析脚本返回的JSON,严格按输出模板呈现结果,禁止偏离;分批检测时每批均输出三板块结果 3. 【必须执行,不可跳过】 将纯文本优化文案写入文件并发送卡片
各输入类型详细流程
文本输入:
1. 先判断文案字数:智能体必须先计算用户输入文案的字符数 2. 若不超过3000字符,直接调用 python scripts/check_sensitive_words.py --content="文案内容" 检测 3. 若超过3000字符且不超过10000字符,必须暂停并询问用户:
⚠ 单次查询内容字数建议不超过1000字,现在已超过单次执行字数是否进行分批查询?
回复1:执行单次查询(仅检测前3000字符)
回复2:执行分批查询(检测全部内容)
回复3:取消执行
必须等待用户回答后再继续,禁止未等用户回复就自行执行后续流程
- 用户回复"1":仅取前3000字符调用脚本检测
- 用户回复"2":按3000字符分批调用脚本检测全部内容(分批时在自然断句处切割,避免截断句子)
- 用户回复"3":结束任务
4. 若超过10000字符,直接提示用户并中断:
⚠ 当前内容字数超过10000字,查询将会消耗过多的时间和积分,强烈建议手动分批查询。
文本类型文件(TXT/DOC/DOCX等):
1. 先调用 python scripts/check_sensitive_words.py --file=/path/to/file.txt --extract-only 提取全部文字内容 2. 若返回的 length 超过10000,直接提示中断(同上) 3. 若超过3000且不超过10000,必须暂停并询问用户(同上询问模板)——必须等待用户回答 4. 若未超过3000字符,直接调用 python scripts/check_sensitive_words.py --content="提取的内容" 检测
网页地址:
1. 先调用 python scripts/check_sensitive_words.py --url=https://example.com --extract-only 提取全部文字内容 2. 后续逻辑与文本类型文件相同
图片文件:
1. 智能体先用 read_image 提取文字(仅提取图片中的文字内容,禁止识别图片的视觉风格描述) 2. 再用 --content 传入提取文字 3. 后续字数判断和分批逻辑与文本输入相同
通用规则
--content、--file、--url三者互斥,每次调用仅传一个- 平台已硬编码为公众号,无需也无法指定其他平台
命令速查
| 输入形态 | 助手动作 |
|---|---|
| 纯文本 | 计算字数 → 字数闸门 → --content="..." → 三板块输出 → 写文件 |
| 上传 TXT/DOC/DOCX | --file=path --extract-only 查字数 → 按规则检测 → 三板块输出 → 写文件 |
| 上传图片 | 仅提取图中文字 → 计算字数 → --content="提取文字" → 三板块输出 → 写文件 |
粘贴 https://... | --url=... --extract-only 查字数 → 按规则检测 → 三板块输出 → 写文件 |
| 超长文案 | 发出询问语,收到 1/2/3 后再继续 |
异常处理
| 异常场景 | 用户话术 |
|---|---|
| 文件/网页提取失败 | 「内容提取失败,请检查文件格式或网址是否可访问」 |
| PDF 文件 | 「不支持 PDF 文件,请转为图片或文本文件后重新上传」 |
| API 超时或网络异常 | 「检测服务暂时不可用,已自动重试仍失败,请稍后重试」 |
| API 返回业务错误(code≠2000) | 「检测服务返回异常,请稍后重试」 |
| 未配置 API Key | 「未配置 REDFOX_API_KEY,请设置环境变量 export REDFOX_API_KEY=ak_xxxxxxxx 或写入 ~/.bashrc」 |
| 依赖缺失(python-docx/playwright 等) | 提示用户安装对应依赖后重试 |
---
输出模板(必须严格照此输出,禁止增减任何板块)
以下三个板块为完整输出,必须同时出现、顺序固定、标题加粗。占位符用【】标注,替换为实际值。
🔍 违禁词检测结果
- ☁️检测平台:公众号
- 违禁词数量:【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标记。文件必须实际写入磁盘,写入后必须将文件以卡片形式发送给用户,禁止仅告知路径而不发送文件卡片)
---
资源索引
- 脚本:见 scripts/check_sensitive_words.py(用途与参数:一站式公众号违禁词检测,支持三种输入方式——--content 直接传入文案文本,--file 传入TXT/DOC/DOCX等文本类型文件路径自动提取,--url 传入网页地址自动提取(使用Playwright无头浏览器渲染JS动态页面,回退到 requests 静态提取);--extract-only 仅提取文本不检测,返回 content 和 length;API 使用 POST+JSON 方式调用 https://redfox.hk/story/api/cozeSkill/sensitiveWordSearch,请求头含 X-API-KEY,平台已硬编码为公众号)
注意事项
- API单次查询支持3000字符;内容总字数上限10000字符。所有输入类型(文本/文件/网页/图片)超过3000字符且不超过10000字符时均必须暂停并询问用户:
⚠ 单次查询内容字数建议不超过1000字,现在已超过单次执行字数是否进行分批查询?
回复1:执行单次查询(仅检测前3000字符)
回复2:执行分批查询(检测全部内容)
回复3:取消执行
必须等待用户回答后再继续,禁止未等用户回复就自行执行后续流程
- 用户回复"1":仅检测前3000字符
- 用户回复"2":按自然断句处切割分批检测(每批不超过3000字符),分批检测完成后必须汇总所有批次的替换结果输出一份完整的优化文案文件不可遗漏
- 用户回复"3":结束任务
超过10000字符时直接提示用户并中断:
⚠ 当前内容字数超过10000字,查询将会消耗过多的时间和积分,强烈建议手动分批查询。
- 网络请求自动重试:遇到5xx、超时、连接失败等场景最多重试2次,智能体无需手动重试
- 脚本已内置英文误匹配过滤:API会将英文单词内部子串误标为违禁词(如"Glasswing"中的"ass"),脚本自动识别并过滤此类误匹配,无需智能体额外处理
- 违禁词用加粗标记;优化文案中替换词用加粗标记
- "✏️建议优化文案"仅替换违禁词,替换时必须确保与前后文语境通顺、语法正确,如需微调前后助词/连接词以保证通顺则一并调整并用加粗标记;禁止改变语气/排版/添加emoji/重写文案
- 【不可跳过】三板块输出完成后必须将纯文本优化文案写入
./公众号_优化文案_{随机6位数字}.txt,其中随机数由智能体每次生成(如用当前时间戳后6位或随机6位数字),确保连续对话中不同次检测的文件名唯一、内容不被覆盖。文件内容与"✏️建议优化文案"一致但移除所有HTML标记。写入后必须将文件以卡片形式发送给用户,让用户可以直接点击下载,禁止仅告知文件路径而不发送文件卡片。该文件必须实际写入磁盘,禁止省略、禁止仅提示文件名而不写入内容、禁止不发送文件卡片。分批检测时,所有批次完成后必须将全部替换结果按原文顺序汇总写入一份完整文件并发送文件卡片,不可遗漏任何批次 - 图片文件由智能体先用 read_image 提取文字(仅提取图片中的文字内容,禁止识别图片的视觉风格描述),再以 --content 传入脚本检测
- 文件上传仅支持图片和文本类文件(TXT、CSV、MD、LOG、JSON、XML、HTML、DOC、DOCX),不支持PDF
- 检测完成并输出结果、写入文件后,智能体可正常回复用户的后续提问(如调整替换词、重新检测、解释违禁规则等),不应因铁律约束而拒绝后续对话
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import json
import os
import re
import sys
from pathlib import Path
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单次查询最大字符数
MAX_CONTENT_LENGTH = 3000
# 内容总字数上限(超过此值直接提示用户手动分批,不执行检测)
MAX_TOTAL_LENGTH = 10000
# API地址
API_URL = "https://redfox.hk/story/api/cozeSkill/sensitiveWordSearch"
# 环境变量名
ENV_KEY_NAME = "REDFOX_API_KEY"
# 常见 Shell 配置文件列表
SHELL_CONFIG_FILES = [
".bashrc",
".zshrc",
".bash_profile",
".profile",
]
def _get_api_key():
"""
获取 API Key,优先级:
1. 环境变量 REDFOX_API_KEY
2. 自动从 Shell 配置文件(~/.bashrc、~/.zshrc 等)中读取
3. 以上均未获取到则提示用户配置并退出
"""
# 1. 优先从环境变量获取
api_key = os.getenv(ENV_KEY_NAME, "").strip()
if api_key:
return api_key
# 2. 从 Shell 配置文件中读取
home = Path.home()
for cfg_file in SHELL_CONFIG_FILES:
cfg_path = home / cfg_file
if cfg_path.is_file():
try:
content = cfg_path.read_text(encoding="utf-8", errors="replace")
# 匹配 export REDFOX_API_KEY="ak_xxx" 或 export REDFOX_API_KEY=ak_xxx
match = re.search(
rf'export\s+{ENV_KEY_NAME}\s*=\s*["\']?([a-zA-Z0-9_\-]+)["\']?',
content
)
if match:
api_key = match.group(1).strip()
if api_key:
return api_key
except (OSError, UnicodeDecodeError):
continue
# 3. 未获取到,提示用户配置
raise ValueError(
f"未配置 {ENV_KEY_NAME},请通过以下方式之一配置:\n"
f" 方式一(推荐):设置环境变量 export {ENV_KEY_NAME}=ak_xxxxxxxx\n"
f" 方式二:将上述 export 语句写入 ~/.bashrc 或 ~/.zshrc,然后执行 source ~/.bashrc\n"
f" API Key 获取方式:访问 https://redfox.hk/ 注册登录后在个人中心获取"
)
def _call_api(content, platform="公众号", source="公众号违禁词查询-GitHub", max_retries=2):
"""
调用公众号违禁词检测API(POST + JSON方式)
Args:
content: 待检测的文案内容
platform: 平台名称
source: 来源标识
max_retries: 最大重试次数
Returns:
dict: API响应的data字段
"""
api_key = _get_api_key()
headers = {
"Content-Type": "application/json; charset=utf-8",
"X-API-KEY": api_key
}
payload = {
"content": content,
"platform": platform,
"source": source
}
last_error = None
for attempt in range(max_retries + 1):
try:
response = requests.post(API_URL, headers=headers, json=payload, timeout=30)
if response.status_code >= 500 and attempt < max_retries:
import time
time.sleep(1 * (attempt + 1))
continue
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', '未知')}")
return resp.get("data") or {}
except requests.exceptions.Timeout as e:
last_error = e
if attempt < max_retries:
import time
time.sleep(1 * (attempt + 1))
continue
raise Exception(f"请求超时,已重试{max_retries}次仍失败")
except requests.exceptions.ConnectionError as e:
last_error = e
if attempt < max_retries:
import time
time.sleep(1 * (attempt + 1))
continue
raise Exception(f"连接失败,已重试{max_retries}次仍失败: {str(e)}")
except ValueError:
# JSON解析失败,直接抛出
raise
except Exception as e:
if "HTTP请求失败" in str(e) or "API业务错误" in str(e):
raise
last_error = e
if attempt < max_retries:
import time
time.sleep(1 * (attempt + 1))
continue
raise Exception(f"请求失败: {str(e)}")
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 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获取静态HTML并提取文本
try:
response = requests.get(url, timeout=30, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
if response.status_code >= 400:
raise Exception(f"网页请求失败: HTTP {response.status_code}")
soup = BeautifulSoup(response.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方式,参数通过请求体传递)
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}字符,请缩减后重试"
}
try:
# 调用API
api_data = _call_api(content)
# 从API返回的content中提取违禁词列表
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)
))
# 将所有违禁词标签样式统一替换为color:red样式
html_content = re.sub(
r'<span class="(?:banned-word|sensitive-word|industry-banned-word)">',
'<span style="color:red">',
api_content
)
# 过滤英文误匹配: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'<span style="color:red">{escaped}</span>',
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 ValueError as e:
return {
"status": "error",
"platform": "公众号",
"original_content": content,
"error": 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()