# Dby Banned Words

> 多平台违禁词检测——一段文案，一次性比对小红书、抖音、公众号三大平台的审核口径，输出逐平台风险对照表与一版全平台都安全的改写。触发词：多平台违禁词、全平台违禁词、公众号违禁词、跨平台合规、合规检测、过审、违禁词检测、敏感词、违规词、极限词、绝对化用语、限流自查、审核不过、广告法。不做：改文风或换平台调性走 dby-rewrite；从零写正文走 dby-write。

- Skill: `zizhanovo/dby-banned-words` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add zizhanovo/dby-banned-words`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zizhanovo/dby-banned-words/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: zizhanovo (https://skillmd.com/u/zizhanovo)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/zizhanovo/dby-banned-words

---


# 多平台违禁词检测

一段文案，一次比对小红书 / 抖音 / 公众号违禁词口径，出对照表 + 全平台安全改写。

---

## 流程

1. **收文案**。
2. **逐平台检测**——对 `xiaohongshu`、`douyin`、`gongzhonghao` 各调用**一次**都爆鸭接口。
   用户没指定平台时先问一句要哪几个，默认三平台各计费一次。
3. **风险对照**——把各平台结果并排成一张表：平台 / 判定 / 风险类别 / 命中词 / 建议。
4. **统一改写**——本鸭综合所有平台的**营销语境命中**，给出**一版改完即可全平台发布**的安全文案。

> **每个平台是一次独立计费调用**。用户只关心某几个平台时用 `--platforms` 缩小范围。

---

## 运行脚本

`$SKILL_DIR` = 本包目录（宿主加载本 SKILL.md 时给出的目录）。请求由 CLI 代发：
`node "$SKILL_DIR/scripts/dby.mjs" banned check <文案> [--platforms a,b]`；
只有绕开它自己拼请求时才读 `dby-gateway/references/protocol.md`。

```bash
# 默认三平台全查——不带 --confirm 先停在确认态，逐平台各列一次计费，不产生任何请求
node "$SKILL_DIR/scripts/dby.mjs" banned check "这款美白神器三天见效，全网最低价，无效退款"

# 核对无误后原样加 --confirm 才真打（逐平台各计费一次）
node "$SKILL_DIR/scripts/dby.mjs" banned check "这款美白神器三天见效，全网最低价，无效退款" --confirm

# 只查指定平台（逗号分隔，省额度）
node "$SKILL_DIR/scripts/dby.mjs" banned check "你的文案" --platforms xiaohongshu,douyin --confirm
```

- **默认停在确认态**：回执列出将要发生的逐平台计费，核对后原样加 `--confirm` 才放行；
  `--confirm` 之前零请求、零扣费。
- 确认后对每个平台 `POST` 一次，把所有平台结果汇成一个 map 装进 `{ok,data|error}` 信封的 `data` 里。
  `raw` 里与 `content` / `originalContent` 重复的两键默认剥掉，加 `--raw` 保留。
- **单个平台失败不影响其它平台**：失败的平台在 map 里记 `error`，其余照常返回。

---

## 接口契约

- 地址：`POST https://doubaoya.com/api/apis/tool/check-banned-words/call`
- 鉴权：请求头 `Authorization: Bearer $DOUBAOYA_API_KEY`
- 请求体（每个平台一次，参数严格如下）：

```json
{ "platform": "xiaohongshu", "content": "<待检测文案>" }
```

  `platform` 取值依次迭代：`"xiaohongshu"`、`"douyin"`、`"gongzhonghao"`。

- 返回信封：

```json
{
  "success": true,
  "requestId": "req_xxx",
  "data": {
    "source": "contentSafety.sensitiveWords",
    "content": "这款美白神器三天见效，<span class=\"sensitive-word\">全网</span><span class=\"banned-word\">最低</span>价",
    "originalContent": "这款美白神器三天见效，全网最低价",
    "prohibitedWordsType": ["禁用词", "敏感词"],
    "raw": {}
  },
  "error": null
}
```

  **每次调用都先看 `success`**：为 `true` 时读 `data` 里这五个字段（就这五个）；
  为 `false` 时读 `error.code` / `error.message`。

  | 字段 | 含义 |
  | ---- | ---- |
  | `originalContent` | 未标注的原文 |
  | `content` | 标注版正文，命中处被 `<span>` 包裹——**唯一**能定位「哪几个词命中」的地方。类名带信息：`banned-word` = 禁用词，`sensitive-word` = 敏感词，`industry-banned-word` = 行业禁用词，与 `prohibitedWordsType` 里的类别一一对应 ⇒ **能逐词说出它是哪一类** |
  | `prohibitedWordsType` | 命中的风险**类别**数组（类别名，不是命中词） |
  | `source` / `raw` | 来源标识与上游原始返回 |

> 🔴 接口**不返回**「风险等级」「命中词清单」「替换建议」这三类字段，别去读不存在的字段。
> 命中词要靠上面那条从 `content` 的 `<span>` 里取，替换建议由你结合上下文给。

> 🔴 零命中照常计费（与 `NO_RESULT` 免费口径无关），别当 bug 报。

### 命中分级：哪些改，哪些只报

上游按子串匹配，不看语境。命中分两档，对照表两档都列，**改写只动第一档**：

- **营销语境命中 → 改**：极限词 / 功效承诺 / 医疗用语等落在卖货、承诺、比较句里的（「全网最低」「三天见效」）。
- **只报不改**：营销语境外的程度副词（「最后一步」「第一次」「一定要备份」「完全免费开源」里的
  最后 / 第一 / 一定 / 完全）与英文子串误中（`Assistant` 命中 `ass`）。对照表照列命中词，
  「建议」一列写「语境不构成广告承诺，保留」。
  《广告绝对化用语执法指南》（市场监管总局 2023）第五、六条列的不适用情形也归这档：
  只表经营理念 / 愿望（「顾客第一」）、同品牌自我比较（「我们最贵的一款」）、消费提示
  （「最佳食用时间」）、国标分级用语、商品名 / 商标 / 奖项本身含极限词、限定时间地域的事实
  （「2025 年本市销量第一」——但要能举证）。
- **必改且从重**：医疗、医美、药品、器械、保健食品、投资理财、教育培训里的疗效 / 收益 / 效果承诺
  （「有效率 100%」「保过」「稳赚」），指南第十一条明说这三类不算轻微，不享受首违免罚。
- **平台自有口径，接口未必查得到**：小红书对种草夸大词（绝绝子 / yyds / 闭眼买）限流，
  对外站导流（加 vx / 私信 / 留言扣 1）禁言扣分；抖音把「夸张表达功效」判劣质营销。
  文案里见到这几类，即使三平台都回「无命中」，也在对照表「建议」一列提一句。

### 每个平台怎么判「有没有命中」

- **有命中**：`prohibitedWordsType` 非空数组，**或** `content` 与 `originalContent` 不相等（任一成立即算）。
- **确实没命中**：拿到了 `content` 或 `originalContent`（证明检测跑过了），且上面两条都不成立。
- **没拿到结果**：该平台条目里有 `error`，或 `content` 与 `originalContent` 都缺失/为 null。
  🔴 这时该平台一律标「检测失败」，**绝不能填成「合规」/「low」**，不替用户下合规结论。

---

## 错误处理

CLI 逐平台捕获网络 / HTTP 错误，把错误写进对应平台条目并继续其它平台：
**单平台失败不影响其余平台**，报错码怎么办照 `dby-gateway/references/protocol.md` 第 6 条。
问题绕不过去、或想吐槽 → 可提一句用 `dby-feedback` 当场写成反馈（可忽略，不再重复提）。

---

## 输出模板

脚本返回的是 JSON map，本鸭须解析后填入下面的模板，**禁止把原始 JSON 直接甩给用户**。

### 1. 逐平台风险对照表

| 平台     | 判定             | 风险类别 (prohibitedWordsType) | 命中词（从 content 的标注提取） | 建议（本鸭给）     |
| -------- | ---------------- | ------------------------------ | ------------------------------- | ------------------ |
| 小红书   | 【命中 / 无命中 / 检测失败】 | 【类别，逗号分隔】 | 【命中词，逗号分隔】            | 【替换建议】       |
| 抖音     | 【…】            | 【…】                          | 【…】                           | 【…】              |
| 公众号   | 【…】            | 【…】                          | 【…】                           | 【…】              |

- 平台名用中文（小红书 / 抖音 / 公众号）。
- 「判定」一列严格按上面[判据](#每个平台怎么判有没有命中)填，三选一，不要自创风险等级——接口不回等级。
- 某平台走「没拿到结果」分支（有 `error`，或正文字段全缺）时，该行判定填**检测失败**并附 `code`／缺了哪个字段，
  🔴 **不许填「无命中」，也不许编造结果**。
- 「建议」一列由本鸭结合上下文给出——接口不提供建议。
- 全平台均判定为「无命中」时，对照表照常列出，判定一列写「无命中」。

### 2. 全平台安全改写

综合**所有平台**的命中词与建议，给出**一版**改完即可在所有目标平台发布的文案：

【安全改写后的整段文案。要求：覆盖各平台所有**营销语境命中**（只报不改的那档原样保留）；语义通顺、语气与风格不变；
不加 emoji、不重写结构、不加引用或代码块，直接输出。改动处可加粗斜体标出。】

---

## 输出规则

1. 先出**逐平台风险对照表**，再出**全平台安全改写**，不输出开场白与结束语。
2. 脚本返回 JSON 后必须解析填模板，禁止直接输出原始 JSON。
3. 安全改写要同时满足所有平台口径：以命中最多的平台为基线消词。
4. 某平台失败时，照常输出其余平台结果，并在对照表标注该平台失败原因；
   🔴 **有平台检测失败时，末尾必须提示「该平台未完成检测，别当它通过」**，不要写成全平台可发。
5. 全平台都判定为「无命中」时：对照表如实标注，安全改写处写「原文已可全平台发布，无需改动」。
6. 绝不回显 `DOUBAOYA_API_KEY`。

---

## 其他

- `PROVIDER_FAILED`（502）是上游临时抖动，**已自动退款**，直接重试，不会重复扣费。
- 文案经 HTTPS 发至都爆鸭后端，脚本本地不持久化原文与结果。

## 关于响应里的 notice 字段

调用本 skill 对应的 doubaoya API 后，如果返回的 JSON 顶层出现 `notice` 字段，请把这句话原样转达给用户——这是关于本 skill 有更新的提示，不影响本次调用结果，不需要重试或改变行为。

