
Xiaohongshu Prohibited Word
- 237 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Use xiaohongshu-prohibited-word for development tasks
About
xiaohongshu-prohibited-word: A skill for development. This provides functionality for development workflows.
- xiaohongshu-prohibited-word
Xiaohongshu Prohibited Word by the numbers
- 237 all-time installs (skills.sh)
- +16 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,595 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 xiaohongshu-prohibited-wordAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 237 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Use xiaohongshu-prohibited-word for development tasks
Files
小红书违禁词查询
简介
小红书违禁词查询是一款专为小红书内容创作者、品牌运营和营销人员设计的智能违禁词检测工具,基于 红狐Hub 违禁词检测 API,在笔记发布前快速扫描文案中的敏感词并提供上下文智能替换建议。
通过简单的文案输入,你可以:
- 🔍 违禁词标记 —— 原文中命中词用加粗标出,一眼看到风险点
- 💡 替换建议 —— 每个违禁词配一个结合上下文的替换词 + 更换理由
- ✏️ 优化文案 —— 直接给出一份替换后的可发布版本,复制粘贴就能用
- 📏 长文案分批检测 —— 超过 3000 字自动提醒,支持分批检测后合并结果
触发关键词:小红书违禁词 笔记敏感词 小红书审核 限流词 种草文案合规
功能特性
🎯 核心功能
| 输入方式 | 能力说明 | 使用示例 |
|---|---|---|
| 💬 直接贴文案 | 粘贴笔记文案,一键检测 | 帮我看下这段笔记有没有违禁词:这款美白神器真的太有效了…… |
| 📎 上传文件 | 支持 TXT、DOC、DOCX,自动读取检测 | 直接上传文档,无需手动复制 |
| 🖼️ 上传图片 | 自动提取图中文字进行检测 | 上传笔记截图/海报即可 |
| 🌐 粘贴链接 | 自动抓取网页内容检测 | 帮我检测这个网页:https://example.com/article |
✨ 特色亮点
- ⚡ 一站式检测 —— 文本/文件/图片/网页四种输入方式,一次调用完成所有检测
- 🔗 跨平台内容提取 —— 内置 Playwright 无头浏览器,支持 JS 动态渲染的 SPA 页面内容提取
- 🌐 英文误匹配过滤 —— 自动识别英文单词内部子串误判(如 "Glasswing" 中的 "ass"),无需手动排查
- 🔒 数据安全 —— 检测内容通过加密 HTTPS 发送,不在本地存储
- 📄 一键导出 —— 自动生成纯文本优化文案文件并以卡片形式发送,可直接下载使用
限制说明:平台固定为小红书,无需指定。PDF 不支持,需转为图片或文本文件后上传。
一键安装
前置条件
- Python 3.8+
- 安装 Python 依赖:
pip install python-docx==1.1.0 beautifulsoup4==4.12.3 playwright==1.58.0- 安装 Chromium 浏览器:
playwright install chromium获取 API Key
1. 访问 红狐Hub 官网 了解服务详情 2. 前往 注册页面 注册账号 3. 新注册用户将获赠免费积分,可立即开始使用 API 服务 4. 注册登录后,在个人中心获取 API Key,格式为 ak_xxxxxxxx
配置 API Key
脚本按以下优先级自动获取密钥:
| 优先级 | 来源 | 说明 |
|---|---|---|
| 1 | 环境变量 REDFOX_API_KEY | 直接读取当前设备环境变量 |
| 2 | Shell 配置文件 | 自动扫描 ~/.zshrc ~/.bashrc ~/.bash_profile ~/.profile ~/.zprofile |
| 3 | 提示配置 | 以上均未找到时,提示用户手动配置 |
配置示例:
export REDFOX_API_KEY=ak_xxxxxxxx环境变量参考
| 变量名 | 必填 | 说明 |
|---|---|---|
REDFOX_API_KEY | 是 | 红狐Hub API 访问密钥,格式 ak_xxxxxxxx |
XHS_SENSITIVE_WORD_API_URL | 否 | 自定义 API 端点地址(默认使用 红狐Hub 官方) |
XHS_SENSITIVE_WORD_VERIFY_SSL | 否 | SSL 证书校验开关,默认 1(开启) |
使用指南
基础使用
💬 直接贴文案 —— 把笔记文案发给助手即可检测
用户:帮我看下这段笔记有没有违禁词:这款美白神器真的太有效了,用了三天就白了一个度
>
助手输出:🔍 违禁词检测结果 → 💡 修改建议 → ✏️ 优化文案 + 纯文本文件卡片
📎 上传文件 —— 直接上传 TXT、DOC、DOCX 文件,助手自动提取内容检测
🖼️ 上传图片 —— 上传笔记截图或海报,助手提取图中文字后检测(仅提取文字,不分析图片视觉)
🌐 粘贴链接 —— 提供网页 URL,助手自动抓取页面文字内容检测
高级使用
长文案分批检测:超过 3000 字符时,助手会暂停并询问(回复 1=单次仅检测前3000字 / 2=分批检测全部 / 3=取消),分批时自动在自然断句处切割
仅提取文字预览:调用脚本 --extract-only 参数可仅提取文字不检测,返回文本内容和长度
自定义 API 端点:设置 XHS_SENSITIVE_WORD_API_URL 环境变量指向自建检测服务
命令速查
| 输入形态 | 助手动作 |
|---|---|
| 纯文本 | 计算字数 → 字数闸门 → --content="..." → 三板块输出 |
| 上传 TXT/DOC/DOCX | --file=path --extract-only 查字数 → 按规则检测 → 三板块输出 |
| 上传图片 | 仅提取图中文字 → 计算字数 → --content="提取文字" → 三板块输出 |
粘贴 https://... | --url=... --extract-only 查字数 → 按规则检测 → 三板块输出 |
| 超长文案 | 发出询问语,收到用户明确回复后再继续 |
--content、--file、--url 三者互斥。
完整执行规程(输出模板、格式铁律、示例)详见 `references/core_workflow.md`,调用脚本和格式化输出前必须读取并严格遵循。
使用场景
场景一:小红书创作者发布前自查
角色:小红书博主、内容创作者
需求:种草笔记发布前快速排查违禁词,避免因极限词、禁宣用语被限流或下架
使用方式: 1. 将笔记文案直接粘贴发给助手 2. 查看违禁词检测结果和替换建议 3. 复制优化后文案或下载纯文本文件直接发布
预期收益:一次改对,安心发布,减少反复修改和审核等待时间
场景二:品牌/电商运营批量扫雷
角色:品牌运营、电商运营
需求:活动海报文案、商品详情页、多篇推广文案批量检测
使用方式: 1. 将多段文案整理为 DOC/DOCX 文档上传 2. 助手自动提取内容,分批检测全部文案 3. 获取每批检测结果和汇总优化文件
预期收益:批量扫雷提升效率,避免活动上线后被投诉下架
场景三:投放/营销话术快速过筛
角色:广告投放、营销人员
需求:多条卖点话术、投放文案快速过审
使用方式: 1. 逐条或批量提交投放文案 2. 按助手替换建议修改违禁词 3. 下载优化后文案提交合规审核
预期收益:缩短审核周期,提高投放素材通过率
场景四:内容审核/增长团队抽查
角色:增长运营、内容审核
需求:落地页、H5 页面纯文本内容合规抽查
使用方式: 1. 粘贴落地页或 H5 URL 2. 助手自动抓取页面文字检测 3. 查看检测结果确认是否存在违规
预期收益:快速完成页面合规抽查,降低违规风险
项目架构
目录结构
xiaohongshu-prohibited-word/
├── SKILL.md # Skill 主文档(本文件)
├── skill-card.md # 技能市场卡片描述
├── _meta.json # 元数据
├── scripts/
│ └── check_sensitive_words.py # 核心检测脚本
│ ├── _get_api_key() # API Key 获取(环境变量 → Shell配置 → 提示)
│ ├── _http_request() # HTTP 请求(urllib 原生,内置重试)
│ ├── extract_from_file() # 文件文本提取(DOC/DOCX/TXT/CSV/MD 等)
│ ├── extract_from_web() # 网页文本提取(Playwright → urllib 回退)
│ └── check_sensitive_words() # 违禁词检测(API 调用 + 结果解析)
└── references/
└── core_workflow.md # 核心工作流(操作步骤、输出模板、格式铁律、示例)技术栈
| 组件 | 技术 | 说明 |
|---|---|---|
| 运行环境 | Python 3.8+ | 标准 Python 环境 |
| HTTP 请求 | urllib.request(标准库) | 原生 HTTP 请求,内置重试与超时处理 |
| 文档解析 | python-docx | Word 文档文本提取 |
| 网页解析 | beautifulsoup4 + playwright | 静态 HTML + JS 动态渲染双引擎 |
| API 服务 | 红狐Hub 违禁词检测 API | HTTPS POST,JSON 格式,X-API-KEY 鉴权 |
常见问答
安装相关
Q1: 提示"缺少依赖库"怎么办?
A: 运行以下命令安装:
pip install python-docx==1.1.0 beautifulsoup4==4.12.3 playwright==1.58.0
playwright install chromiumQ2: 提示"缺少凭证配置"怎么办?
A: 请按以下步骤操作: 1. 访问 https://redfox.hk/login 注册获取 API Key(新用户赠免费积分) 2. 配置环境变量:export REDFOX_API_KEY=ak_xxxxxxxx 3. 或在 ~/.bashrc / ~/.zshrc 中添加后执行 source ~/.bashrc
使用相关
Q3: 单次能检测多少字?
A: 建议单次 3000 字以内效果最佳。3001~10000 字会询问是否分批检测,超过 10000 字暂不支持。
Q4: 支持 PDF 文件吗?
A: 不支持 PDF。请将 PDF 转为图片或文本文件后重新上传。
Q5: 检测结果能保证百分百准确吗?
A: 检测结果基于红狐Hub违禁词库,仅供参考。请根据企业经营范围和产品实际效果自行核对,最终以小红书平台审核结果为准。
故障排除
Q6: 提示"检测服务暂时不可用"?
A: 脚本已内置自动重试机制。若持续失败,请检查网络、确认 API Key 未过期、或访问 红狐Hub 官网确认服务状态。
Q7: 网页内容提取失败?
A: 请检查网址是否可正常访问。部分需登录或有反爬保护的页面可能无法提取,建议改为复制文字后直接粘贴检测。
Q8: 图片文字提取不准确?
A: 文字提取依赖图片清晰度和字体。建议使用高清晰度截图,避免手写字体和艺术字体。
获取帮助
- 🌐 红狐Hub 官网:https://redfox.hk/
- 📧 联系邮箱:graves9758@gmail.com
Xiaohongshu Prohibited Word Check / xiaohongshu-prohibited-word
---
Introduction
Scan your copy for Xiaohongshu (Little Red Book) prohibited terms before publishing, highlight risks, and get compliant replacements plus a ready-to-post revised draft—so you can reduce throttling and takedown risk.
Core value
- Flagged terms: Hits are shown in bold in the original text so risks stand out.
- Replacement suggestions: Each hit comes with a context-aware alternative and a short rationale.
- Optimized copy: A publishable version with only the necessary swaps, ready to copy or download as plain text.
- Long-copy batches: Content over 3,000 characters triggers a reminder and supports batched checks with merged results.
Who it’s for
- 📝 Creators / bloggers — Pre-publish self-checks; fewer rewrites and review cycles.
- 🛍️ Brand & e-commerce ops — Batch-check campaigns, product pages, and promos before go-live.
- 📣 Ads & marketing — Screen multiple selling points and ad lines faster for compliance review.
- 🔍 Growth & content review — Spot-check landing pages and H5 page text for policy risk.
---
Features
Core capabilities
- Paste copy: Send note text directly for prohibited-term detection and edit guidance.
- Upload documents: TXT, DOC, and DOCX are read automatically—no manual copy-paste.
- Upload images: Text is read from note screenshots or posters, then checked (text only, not visual style).
- Paste a link: Provide a URL; page text is read automatically, then checked.
- Long copy: Best under 3,000 characters per run; longer content can be checked in batches with a combined optimized file.
- One-click export: A plain-text optimized draft file for download and direct use.
---
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
REDFOX_API_KEY. - Configure
REDFOX_API_KEYon your device before using this skill. - Before sharing a key, confirm its source, scope, validity, and whether it can be reset or revoked.
- Do not hard-code or expose keys in code, prompts, logs, or output files.
---
How to use
Describe what you need in plain language—no fixed commands to memorize. You can say things like “Xiaohongshu prohibited words,” “note sensitive words,” “throttling terms,” or “compliant seeding copy.”
Quick phrase guide
| Intent | Example prompt | What you get |
|---|---|---|
| Check note copy | “Check this note for prohibited words: this whitening product works so well…” | Flagged terms, replacements, and optimized copy |
| Check a document | Upload a TXT, DOC, or DOCX file | Content is read and checked automatically |
| Check image text | Upload a note screenshot or poster | Text is extracted from the image, then checked |
| Check a web page | “Check this page: https://example.com/article” | Page text is read, then checked |
| Long copy options | After submitting 3,000+ characters, reply 1 / 2 / 3 per the prompt | First chunk only, full batch check, or cancel |
Sample output
After a check, you receive three sections in order (illustrative):
🔍 Prohibited word check results
- Platform: Xiaohongshu
- Count and types of hits
- Original copy with prohibited terms in bold
💡 Revision suggestions
| Prohibited term | Replacement | Rationale |
|---|---|---|
| … | … | … |
✏️ Suggested optimized copy
Full text with only prohibited terms swapped; replacements shown in bold, plus a downloadable plain-text file.
If nothing is flagged, you’ll see: no prohibited words detected—copy looks compliant ✅.
---
Use cases
| Scenario | Role | Example ask | Benefit |
|---|---|---|---|
| Pre-publish check | Creator / blogger | Paste full seeding note and ask for prohibited words | Fix once, publish with more confidence |
| Batch copy sweep | Brand / e-commerce ops | Upload a Word file with multiple promo drafts | Batch detection; fewer post-launch violations |
| Ad copy screening | Ads / marketing | Submit selling points or ad lines one by one | Faster compliance review and approval |
| Page compliance spot | Growth / content review | Share a landing or H5 URL to check on-page text | Quick page audit; lower policy risk |
---
小红书违禁词查询 / xiaohongshu-prohibited-word
---
简介
在笔记发布前快速扫描文案中的小红书违禁词,标出风险点并给出可替换的合规表达与优化后全文,降低限流与下架风险。
核心价值
- 违禁词标记:原文命中词加粗显示,风险点一目了然。
- 替换建议:每个违禁词配有结合上下文的替换词与更换理由。
- 优化文案:直接给出替换后的可发布版本,可复制使用或下载纯文本文件。
- 长文案分批:超过 3000 字会提醒并支持分批检测后合并结果。
适用对象
- 📝 小红书博主 / 创作者 — 发布前自查,减少反复修改与审核等待。
- 🛍️ 品牌 / 电商运营 — 活动文案、商品详情批量扫雷,避免上线后被投诉下架。
- 📣 投放 / 营销人员 — 多条卖点话术快速过筛,缩短合规审核周期。
- 🔍 增长运营 / 内容审核 — 落地页、H5 页面文字合规抽查。
---
功能特性
核心功能
- 直接贴文案:粘贴笔记正文即可检测违禁词并给出修改方案。
- 上传文档:支持 TXT、DOC、DOCX,自动读取内容后检测,无需手动复制。
- 上传图片:从笔记截图或海报中提取文字后检测(仅识别图中文字)。
- 粘贴链接:提供网页地址,自动读取页面文字内容后检测。
- 长文案处理:单次建议 3000 字以内;更长内容可分批检测并汇总优化结果。
- 一键导出:生成纯文本优化文案文件,便于下载后直接发布。
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接用自然语言描述需求即可,无需记忆固定命令。可说「小红书违禁词」「笔记敏感词」「限流词」「种草文案合规」等触发检测。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 检测笔记文案 | 「帮我看下这段笔记有没有违禁词:这款美白神器真的太有效了……」 | 标出违禁词、给出替换建议与优化后文案 |
| 检测上传文档 | 直接上传 TXT、DOC、DOCX 文件 | 自动读取文档内容并完成检测 |
| 检测图片文字 | 上传笔记截图或海报 | 提取图中文字后检测 |
| 检测网页内容 | 「帮我检测这个网页:https://example.com/article」 | 自动读取页面文字后检测 |
| 长文案分批 | 提交超过 3000 字的文案后,按提示回复 1 / 2 / 3 选择检测方式 | 单次检测前段、分批检测全部或取消 |
输出示例
检测完成后,你将依次收到以下三块内容(示意):
🔍 违禁词检测结果
- 检测平台:小红书
- 违禁词数量、类型
- 原文中违禁词以加粗标出
💡 修改建议
| 违禁词 | 替换词 | 更换理由 |
|---|---|---|
| … | … | … |
✏️ 建议优化文案
仅替换违禁词后的完整文案,已替换处加粗显示;同时提供可下载的纯文本优化文件。
未检测到违禁词时,将提示「未检测到违禁词,文案内容合规✅」。
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 发布前自查 | 博主 / 创作者 | 粘贴种草笔记全文,询问是否有违禁词 | 一次改对,安心发布 |
| 批量文案扫雷 | 品牌 / 电商运营 | 上传含多篇推广文案的 Word 文档 | 批量检测,避免活动上线后违规 |
| 投放话术过筛 | 投放 / 营销人员 | 逐条提交卖点话术或广告文案 | 按建议修改后提交合规审核,提高通过率 |
| 页面合规抽查 | 增长 / 内容审核 | 提供落地页或 H5 链接,检查页面文字是否含违禁词 | 快速完成页面抽查,降低违规风险 |
---
小红书违禁词查询 · 核心工作流
本文档包含本 Skill 的完整执行规范:鉴权、数据源说明、任务目标、前置准备、操作步骤、输出模板、格式铁律、示例、脚本说明与注意事项。处理违禁词检测请求时必须全文遵循,不得删减或改写约束含义。
数据源说明
本 Skill 的违禁词匹配通过独立后端 API 完成检测。执行脚本时,会将待检测内容通过 HTTPS POST 发往对接服务端(JSON),不在本地计算词库。
| 项目 | 说明 |
|---|---|
| API 地址 | https://redfox.hk/story/api/cozeSkill/sensitiveWordSearch |
| 请求方式 | POST,application/json |
| 请求体字段 | content(待检测文案)、platform(固定为"小红书")、source(来源标识) |
| 凭证机制 | REDFOX_API_KEY 环境变量(格式 ak_xxxxxxxx),脚本自动从环境变量或 Shell 配置文件读取 |
| HTTP 库 | urllib.request(标准库,内置重试与超时处理) |
对话指引:首次为用户检测前,应用一两句话说明「文案将通过加密连接发送至检测服务」;若用户拒绝外传数据,则不应调用检测脚本。
鉴权
获取 API Key
1. 访问 红狐Hub 官网 了解服务详情 2. 前往 注册页面 注册账号 3. 新注册用户将获赠免费积分,可立即开始使用 API 服务 4. 注册登录后,在个人中心获取 API Key,格式为 ak_xxxxxxxx
配置 API Key
配置 REDFOX_API_KEY 环境变量,脚本按以下优先级自动获取:
1. 环境变量:直接读取当前设备 REDFOX_API_KEY 环境变量 2. Shell 配置文件回退:若环境变量未设置,自动扫描以下配置文件查找 REDFOX_API_KEY 定义:
~/.zshrc~/.bashrc~/.bash_profile~/.profile~/.zprofile
3. 提示配置:以上均未找到时,抛出异常提示用户配置
配置示例:
export REDFOX_API_KEY=ak_xxxxxxxx任务目标
- 本 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,原文中违禁词用 **加粗** 标记,单独成段展示】
⚠️ 数据说明:以上查询结果仅供参考,请您根据企业经营范围和产品实际效果或功效,自行核对。
💡 修改建议
针对每个违禁词,提供安全的替换表达。
| 违禁词 | 替换词 | 更换理由 |
|---|---|---|
| 【违禁词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动态页面,回退到 urllib 静态提取);--extract-only仅提取文本不检测,返回 content 和 length;平台已硬编码为小红书;API调用需配置 REDFOX_API_KEY 环境变量)
注意事项
- 文案内容上限为3000字符;所有输入类型(文本/文件/网页/图片)超过3000字符且不超过10000字符时均必须暂停并询问用户"⚠ 单次查询内容字数建议不超过3000字,现在已超过单次执行字数是否进行分批查询?\n回复1:执行单次查询(仅检测前3000字符)\n回复2:执行分批查询(检测全部内容)\n回复3:取消执行"——必须等待用户回答后再继续,禁止未等用户回复就自行执行后续流程——用户回复"1"则仅检测前3000字符,用户回复"2"则按自然断句处切割分批检测(每批不超过3000字符),分批检测完成后必须汇总所有批次的替换结果输出一份完整的优化文案文件不可遗漏,用户回复"3"则结束任务;超过10000字符时直接提示用户"⚠ 当前内容字数超过10000字,查询将会消耗过多的时间和积分,强烈建议手动分批查询。"并中断后续逻辑,不执行任何检测
- 网络请求由 urllib 自动处理重试与超时
- 脚本已内置英文误匹配过滤: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 ssl
import sys
import time
import urllib.error
import urllib.request
from pathlib import Path
from urllib.parse import urlencode
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)
# 内容长度上限(字符数)
MAX_CONTENT_LENGTH = 3000
# API地址
API_URL = "https://redfox.hk/story/api/cozeSkill/sensitiveWordSearch"
# 环境变量名
ENV_KEY_NAME = "REDFOX_API_KEY"
# Shell 配置文件列表(按优先级排序,跨平台通用)
SHELL_CONFIG_FILES = [
".zshrc",
".bashrc",
".bash_profile",
".profile",
".zprofile",
]
def _get_api_key():
"""
获取 红狐Hub API Key。
优先级:
1. 环境变量 REDFOX_API_KEY
2. 从 Shell 配置文件中读取
3. 抛出异常提示用户配置
"""
# 1) 环境变量
api_key = os.environ.get(ENV_KEY_NAME)
if api_key and api_key.strip():
return api_key.strip()
# 2) 从 Shell 配置文件中查找
home = Path.home()
for config_name in SHELL_CONFIG_FILES:
config_path = home / config_name
if not config_path.is_file():
continue
try:
content = config_path.read_text(encoding="utf-8", errors="replace")
except Exception:
continue
# 匹配 export REDFOX_API_KEY="value" 或 export REDFOX_API_KEY=value 或 REDFOX_API_KEY=value
for pattern in [
rf'export\s+{ENV_KEY_NAME}\s*=\s*["\']([^"\']+)["\']',
rf'export\s+{ENV_KEY_NAME}\s*=\s*([^\s]+)',
rf'^{ENV_KEY_NAME}\s*=\s*["\']([^"\']+)["\']',
rf'^{ENV_KEY_NAME}\s*=\s*([^\s]+)',
]:
m = re.search(pattern, content, re.MULTILINE)
if m:
api_key = m.group(1).strip()
if api_key:
return api_key
# 3) 未找到
raise ValueError(
f"未检测到 红狐Hub API Key。请将 {ENV_KEY_NAME} 设置为环境变量,格式为 ak_xxxxxxxx。\n"
"获取方式:访问 https://redfox.hk/login 注册登录后,在个人中心获取 API Key。\n"
"配置示例:export REDFOX_API_KEY=ak_xxxxxxxx"
)
def _http_request(url, method="GET", json_body=None, query_params=None, headers_extra=None, timeout=30, max_retries=2):
"""
使用标准库 urllib 发起 HTTP/HTTPS 请求。
POST 时使用 application/json 正文。对 5xx 及网络类错误按 max_retries 自动重试。
Returns:
dict: {"status_code": int, "body": str}
"""
method_u = method.upper()
last_error = None
for attempt in range(max_retries + 1):
try:
full_url = url
if method_u == "GET" and query_params:
qs = urlencode(query_params)
full_url = f"{url}?{qs}" if qs else url
payload = None
headers = {
"Accept": "application/json, text/html, */*",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Encoding": "identity",
}
if headers_extra:
headers.update(headers_extra)
if method_u == "POST":
payload = json.dumps(json_body or {}, ensure_ascii=False).encode("utf-8")
headers["Content-Type"] = "application/json"
req = urllib.request.Request(full_url, data=payload, headers=headers, method=method_u)
with urllib.request.urlopen(req, timeout=timeout) as resp:
status_code = resp.status
body = resp.read().decode("utf-8", errors="replace")
if status_code >= 500 and attempt < max_retries:
time.sleep(1 * (attempt + 1))
continue
return {"status_code": status_code, "body": body}
except urllib.error.HTTPError as e:
body = e.read().decode("utf-8", errors="replace") if e.fp else ""
if e.code >= 500 and attempt < max_retries:
time.sleep(1 * (attempt + 1))
continue
return {"status_code": e.code, "body": body}
except urllib.error.URLError as e:
last_error = e
if attempt < max_retries:
time.sleep(1 * (attempt + 1))
continue
break
if last_error is not None:
msg = str(last_error.reason) if getattr(last_error, "reason", None) is not None else str(last_error)
if "timed out" in msg.lower() or msg.lower().endswith("timeout"):
raise Exception(f"连接超时,已重试{max_retries}次仍失败")
raise Exception(f"网络异常: {msg},已重试{max_retries}次仍失败")
raise Exception(f"请求失败,已重试{max_retries}次仍失败")
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),
若不可用则回退到 urllib 拉取静态 HTML 再解析。
"""
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',
'.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
if not text:
text = page.inner_text('body')
browser.close()
return text.strip()
except Exception:
pass
# 回退:urllib 静态提取
response = _http_request(url, method="GET", timeout=30)
if response["status_code"] >= 400:
raise Exception(f"网页请求失败: HTTP {response['status_code']}")
soup = BeautifulSoup(response["body"], 'html.parser')
for tag in soup(["script", "style", "noscript"]):
tag.decompose()
text = soup.get_text(separator='\n', strip=True)
return text.strip()
def check_sensitive_words(content):
"""
调用小红书违禁词检测 API(POST,application/json 正文)。
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_key = _get_api_key()
except ValueError as e:
return {
"status": "error",
"platform": "小红书",
"original_content": content,
"error": str(e)
}
headers_extra = {
"X-API-KEY": api_key,
}
payload = {
"content": content,
"platform": "小红书",
"source": "小红书违禁词查询-GitHub"
}
try:
response = _http_request(
API_URL,
method="POST",
json_body=payload,
headers_extra=headers_extra,
timeout=30,
max_retries=2,
)
status_code = response["status_code"]
resp_body = response["body"]
if status_code >= 400:
raise Exception(f"HTTP请求失败: {status_code}, {resp_body[:500]}")
# 解析响应
resp = json.loads(resp_body)
# 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_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
)
# 过滤英文误匹配
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 = [w for w in sensitive_words if w not in false_positive_words]
for fpw in false_positive_words:
escaped = re.escape(fpw)
html_content = re.sub(
rf'<span style="color:red">{escaped}</span>',
fpw,
html_content
)
return {
"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
}
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
# 仅提取模式
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()
Description: <br>
基于站长之家官方违禁词库,专攻小红书平台审核规则,支持文案、文件(TXT/DOC/DOCX)、图片、链接多形式输入,快速输出违禁词标记和上下文智能替换建议。 <br>
This skill is ready for commercial/non-commercial use. <br>
Publisher: <br>
if530770 <br>
License/Terms of Use: <br>
MIT-0 <br>
Use Case: <br>
External creators, brand and e-commerce operators, marketing teams, and content reviewers use this skill to check Xiaohongshu copy, uploaded text documents, images with extracted text, or webpage text for prohibited terms before publishing. It returns flagged terms, replacement suggestions, and an optimized Markdown draft. <br>
Deployment Geography for Use: <br>
Global <br>
Known Risks and Mitigations: <br>
Risk: Checked copy, extracted file text, or fetched webpage text is sent to an external detection service. <br> Mitigation: Use only with content that may be shared with that service, or configure a controlled endpoint with XHS_SENSITIVE_WORD_API_URL before handling confidential material. <br> Risk: Prohibited-word results and replacement suggestions are advisory and may not fully reflect current Xiaohongshu policy or a publisher's compliance obligations. <br> Mitigation: Review flagged terms and suggested replacements against the actual product claims, operating scope, and publication policy before posting. <br>
Reference(s): <br>
- Core workflow <br>
- ClawHub skill page <br>
Skill Output: <br>
Output Type(s): [Markdown, Guidance, Shell commands] <br> Output Format: [Markdown with tables, inline emphasis, and script command examples] <br> Output Parameters: [1D] <br> Other Properties Related to Output: [Does not generate files; long inputs are gated at 3000 and 10000 characters; supports extracted text from TXT, DOC, DOCX, images, and webpages.] <br>
Skill Version(s): <br>
1.0.5 (source: server release metadata; artifact frontmatter states 1.0.4) <br>
Ethical Considerations: <br>
Users should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>