Skip to content
Back to skills

Xhs Publish

ASecurity

发布小红书图文、上传多图、处理话题并查询审核状态。接收 github-promo-post 的 title/body/topics/6 张 1080×1440 JPG artifact;用户要求发小红书、发布 GitHub 项目推文或直接发布图文时使用。

  • 5 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 3, 2026
ai-agentspythonshellvuenodedebugginggit

Works with

  • cli
  • mcp

Security analysis

A100/100

Pro scans all 7 files and shows the line behind each finding

Scanned September 3, 2026

npx -y skills add Natsummerance/skills --skill xhs-publish --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Xhs Publish?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Xhs Publish
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/natsummerance-xhs-publish/badge)](https://www.skillsdirectory.com/skills/natsummerance-xhs-publish)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: xhs-publish
description: 发布小红书图文、上传多图、处理话题并查询审核状态。接收 github-promo-post 的 title/body/topics/6 张 1080×1440 JPG artifact;用户要求发小红书、发布 GitHub 项目推文或直接发布图文时使用。
---

# xhs-publish — 小红书全自动发布

驱动已登录的小红书创作者中心,自动完成「切图文 → 上传封面+多图 → 填标题/正文 → 加话题 → 点击发布 → 跟踪审核状态」全流程。封装为 Hermes 工具(`xhs_publish`)与本脚本,不改动 Hermes 主智能体。

## Codex artifact 接口

优先读取上游 `github-promo-post` 生成的 `artifacts/metadata.json`:

- `title`:平台标题,必须 ≤20 字;
- `body`:不含话题行、真实 URL 或站外引流;
- `topics`:5 个不带 `#` 的话题;
- `images`:6 个绝对路径,顺序固定为封面到 CTA;
- `version_state`:记录版本是正式 Release、更新线还是准备中。

发布前不得自行补造标题、正文、话题或图片;缺字段时返回缺失清单。

## 自动化发布流程(Codex)

1. 读取上游 `artifacts/metadata.json`,运行 `github-promo-post/scripts/validate_artifacts.py <artifacts>`;不通过就停止。
2. 用户明确要求发布后,单命令执行 `publish --bootstrap-edge --restart-edge`。它会关闭所有 Edge 窗口、**用默认已登录 profile** 启动 Edge 143 的 CDP;绝不创建 `--user-data-dir` 临时 profile。
3. `--restart-edge` 只用于 CDP 未就绪或需重建时。它会关闭用户 Edge,必须在用户已明确授权发布且已知晓影响时使用。
4. 脚本完成输入校验、登录检查、六图上传、正文/话题填充、发布和 URL 成功判定;随后按标题查询审核状态。只返回平台实际状态或真实错误。
5. 若 `version_state` 不是正式 Release,保留「更新线/准备中」措辞,不改成「已发布」。

优先使用原生 `xhs_publish` 工具;工具不可用时才调用本 skill 内的 `scripts/xhs_publish.py`。禁止使用 `--force` 绕过敏感词或平台校验。

## When to Use

- 用户说「发一篇小红书」「把这篇笔记发出去」「发布 XX 电影笔记」
- 需要给小红书笔记配多张图(封面 + 电影海报/剧照)
- 需要查询某篇笔记的审核状态(审核中/已发布/未通过)

## 前置条件(一次性)

1. **浏览器调试端口**:Edge 143+ 没有 chrome://inspect 开关,用启动参数:
   ```powershell
   $flag = "--remote-allow-origins=*"
   & "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" "--remote-debugging-port=9222" "--remote-allow-origins=*"
   ```
   若代理报「未连上」,先启动浏览器再调用工具;代理会自动重连。
2. **CDP 代理**:`Z:\Natsumer\.codex\skills\web-access\scripts\cdp-proxy.mjs` 需在 3456 端口运行。
   - Edge 143 兼容补丁:代理 `discoverChromePort()` 的 fallback 分支已改为从 `/json/version` 取真实 wsPath(裸 `/devtools/browser` 会 404)。web-access 更新可能覆盖此补丁,遇到 404 时重新打补丁。
3. **登录态**:浏览器已登录 `creator.xiaohongshu.com`(登录由用户手动完成,不要代输密码)。
4. **风险提示**(每次自动化前向用户展示):
   > 部分站点对浏览器自动化操作检测严格,存在账号封禁风险。已内置防护措施但无法完全避免。

## 使用方法

### 方式 A:Hermes 工具(推荐)

`xhs_publish` 工具由 `plugins/xhs-publish` 插件注册到 hermes-cli toolset。
它属于非核心插件工具,默认被 Tool Search 渐进披露机制延迟加载:主 schema 里只有
`tool_search`/`tool_describe`/`tool_call` 三个桥接工具,当用户要求「发小红书」时先
`tool_search` 搜索到 `xhs_publish`,再用 `tool_call` 调用它(与 spotify/MCP 工具一致)。

调用示例:

```json
{"action": "publish", "title": "...", "body": "...", "cover": "C:/.../cover.png",
 "images": ["C:/.../poster1.jpg"], "topics": ["赫尔佐格", "中国电影资料馆"]}
```

- `action`:`publish`(全自动发布)/ `update`(编辑已发布笔记,需 `note_id`,改标题/正文/话题后重新发布)/ `draft`(只填充不发布)/ `status`(查状态,配 `note_title` 或 `note_id`)/ `login` / `tabs`
- `body` 不要包含话题行(`#xxx #yyy`),话题统一用 `topics` 传入,脚本会自动剥离正文尾部纯话题行。
- 标题硬限制 **≤20 字(含标点)**,超出会被平台拦截(toast「标题最多输入20字哦~」)。

### 方式 B:直接命令行(标准 artifact)

```powershell
$a = 'C:/.../artifacts'
python C:/.../github-promo-post/scripts/validate_artifacts.py $a
python scripts\xhs_publish.py publish --bootstrap-edge --restart-edge `
  --title-file "$a/title.txt" --body-file "$a/body.txt" `
  --cover "$a/images/xhs-01-cover.jpg" `
  --image "$a/images/xhs-02-pain.jpg" --image "$a/images/xhs-03-fast.jpg" `
  --image "$a/images/xhs-04-fix.jpg" --image "$a/images/xhs-05-convert.jpg" --image "$a/images/xhs-06-cta.jpg" `
  --topic "GitHub" --topic "开源项目" --topic "程序员" --topic "效率工具" --topic "Markdown"
python scripts\xhs_publish.py status --note-title "标题"
```

`bootstrap` 可独立诊断:`python scripts\xhs_publish.py bootstrap`;若端口未就绪,且用户已授权关闭 Edge,执行 `bootstrap --restart-edge`。CDP 代理保持在 `3456`,代理若在 Edge 重启前已运行会自动重连。

常用参数:`--title-file/--body-file`(长文本用文件避免转义)、`--no-publish`(草稿模式)、`--dry-run`(只校验)、`--force`(放行敏感词,不建议)、`status --note-title "标题"`。

编辑已发布笔记(改文案后重发,审核会重新走一遍):

```powershell
python scripts\xhs_publish.py update --note-id 6a74b839000000003303782b `
  --title "新标题(≤20字)" --body-file body_v2.txt `
  --topic "赫尔佐格" --topic "中国电影资料馆"
```

- update 会打开 `/publish/update?id=<noteId>`,清空旧正文 → 写新标题/正文 → 重新添加话题 → 点击发布。
- **仅配图模式**:`update` 也可只追加图片不改文案——不给 `--title/--body`,只给 `--note-id` + 一个或多个 `--image`,脚本保留原标题/正文/话题,只上传图片后点发布(审核会重新走一遍)。
- 成功后页面跳转(发布页跳 `published=true`,编辑页跳 `editSuccess` 或笔记管理页),脚本据此判定;发布被拦截(如标题超长)会读取校验 toast 并快速报错。

### 方式 C:剧照搜索→下载→配图(`xhs_enrich_stills` 工具)

Hermes 工具 `xhs_enrich_stills`(同插件注册,toolset=hermes-cli):从 TMDB 按社区评分下载高清剧照(原图,最高 4K),可选直接追加到已发布笔记。

```json
{"tmdb_id": 6404, "count": 6, "min_width": 1280,
 "out_dir": "T:/.../stills", "note_id": "6a7513720000000033008657"}
```

- `slug` 内置映射:`kaspar_hauser`(11710) / `stroszek`(11698) / `woyzeck`(10319) / `nosferatu`(6404);或直接给 `tmdb_id`。注意沃伊采克 1979 版是 **10319**(1368217 不是赫尔佐格版)。
- 选图逻辑:TMDB backdrops 页 `?image_sort=rating.desc`(社区评分最高在前)→ 按 `--min-width` 过滤 → 取前 `--count` 张 original 原图。
- 给 `note_id` 后自动走 `update` 的仅配图模式(不改文案)。`no_publish: true` 可停在发布前人工核对。
- 剧照版权归原出品方/发行方,公开笔记建议注明「剧照版权归出品方」;无版权风险的封面仍用自制的 `covers/cover_*.png`。

## 内容红线(发布前必查)

**站外引流是硬红线,除字面词外,隐含的「另一平台」表述同样违规。** 平台判定「推广第三方平台」包括:

1. 引导他人前往其他平台搜索/浏览(`公众号`、`微信`、`加我V`、`闲鱼`、`抖音`、`B站` 等字面词);
2. 通过种草/科普/教程/测评方式为其他平台宣传(例如「深度长文放公众号」「完整版在别处」这类暗示另一平台的对比表述——哪怕没写平台名,也会被判文本违规);
3. 福利红包/专属优惠诱导跳转、推荐其他平台付费内容。

- 公开正文/标题**禁止**出现:`公众号`、`微信`、`闲鱼`、`咸鱼`、`转卖`、`出票`、`转让`、`售票`、`二维码`、`淘口令`、`淘宝` 等。脚本默认拦截,命中会报错并列出词。
- **隐含表述也禁止**:不要写「这几部我会在别处写长文」「完整版在另一平台」;想表达内容规划,改成站内承诺(如「这几部我会在放映前一部一部细讲」)。
- 实测:正文含「公众号」→ 审核失败「笔记存在推广第三方平台的内容」。**修掉后必须重新走发布流程**(`update --note-id` 编辑页改文案 → 再次点发布),仅改前端展示不生效。
- 转票/承接信息只走私信与闲鱼(见 `ops/private_dm.md`),绝不进正文、标题、封面、评论区置顶。

## 内容准备建议(电影推广场景)

- 封面:`output/herzog_campaign/covers/cover_*.png`(3:4 文字大字报,非剧照,无版权风险)。
- 配图:`output/herzog_campaign/stills/` 已含官方海报(`*_poster.jpg`,Wikipedia REST 下载)与高清剧照(`*_still_*.jpg`,TMDB 原图,2026-08-07 按社区评分+分辨率筛选下载,已配到四篇笔记);新片可用 `xhs_enrich_stills` 工具现抓。
- 每篇发布前跑 `dbs-content` 五维诊断 + 标题用 `dbs-xhs-title` 公式候选。

### 高浏览笔记风格模板(实测要点)

**标题**:前 8 字定生死;≤20 字含标点。三种高点击型:数字型(地点/数字/影展,如「8月北京最值得蹲的影展:赫尔佐格全回顾」,公式 #26)、痛点/反常识型(如「17年没见过太阳的人,戳穿了『正常』」,公式 #24+#1)、好奇缺口型(如「看完这部,你会怀疑『正常』这回事」,公式 #12)。用 `dbs-xhs-title` 出 5-8 个候选并标注公式编号,再定稿。

**首图**:大字报文字 ≤15 字,信息流停留 0.5-1 秒;电影类常用拼贴多图/实景剧照风。

**正文结构**:开头一句话点明价值 → 分点阐述(`1️⃣2️⃣3️⃣` 短行 + 换行,替代加粗)→ 结尾总结 + 提问引导互动(评论区聊什么)。结构化才有收藏率;结尾提问直接给「评论区聊聊」话题。

**人味 > 正确**:避免 AI 腔(空洞排比、连续祈使句「请你记住」「真相是」);句子长短错落,允许口语化;数据/引语要具体(年份、片名、导演原话)。

## Common Pitfalls

0. **Edge 后台预加载实例抢占 profile → 调试端口静默失效(2026-08-14 实证)**:Windows 上 Edge 常驻 `--no-startup-window` 后台预加载实例,会抢占默认 profile 锁;此时再启动 `msedge.exe --remote-debugging-port=9222` 参数会被转交给现有实例且**被忽略**,9222 无响应、发布脚本报「请求失败 /targets: WinError 10061 目标计算机积极拒绝」。修复:先 `taskkill -F -IM msedge.exe` 杀光全部 Edge(含预加载),再用默认 profile 启动调试实例(登录态在默认 profile 里,保留)。排查顺序:`curl 127.0.0.1:9222/json/version` → `curl 127.0.0.1:3456/` → `xhs_publish.py login`。
1. **发布按钮是 closed shadow DOM**:`xhs-publish-btn` 内部内容查询不到,普通点击无效。正确触发:
   `document.querySelector("xhs-publish-btn").dispatchEvent(new CustomEvent("publish", {bubbles:true, composed:true}))`
2. **切换图文后 `.creator-tab` 会从 DOM 移除**:判断是否图文模式要查图片 input(`input[type=file]` accept 含 `.jpg`),不能只看 tab。
3. **多图上传**:第一张用 `input[type=file].upload-input`;后续图该 input 隐藏,改用 `input[type=file][accept*=".jpg"]`(DOM 里有 2 个隐藏副本,取第一个)。用 `div.status`(`n/18`)校验张数。
4. **标题**:必须用 `HTMLInputElement.prototype.value` 的原生 setter + `input`/`change` 事件,直接赋值 Vue 不认。
5. **正文**:`.tiptap.ProseMirror` contenteditable,用 `document.execCommand("insertText")`,`\n` 表示换段。
6. **话题**:正文输入 `#话题名` 会弹 `#creator-editor-topic-container` 浮层,点第一个 `.item`(精确匹配项在首位)即插入 `<a class="tiptap-topic">`。
7. **话题重复**:xhs_note.md 正文尾部自带一行 `#话题` 纯文本,脚本已自动剥离;不要手工再拼一遍。
8. **审核状态**:笔记管理页(`/new/note-manager`)卡片不直接显示状态,用「已发布/审核中/未通过」筛选 tab 判断笔记归属;未通过时点「查看修改建议」读 `.audit-modal` 原因。
9. **登录跳转**:若发布页跳到 `login/passport`,工具会报「未登录」,让用户手动登录后重试。
10. **Node/代理环境**:`check-deps.mjs` 需 Node 22+;`cdp-proxy.mjs` 用 `node scripts/cdp-proxy.mjs` 启动。
11. **标题 ≤20 字**:超长时发布被拦截并弹「标题最多输入20字哦~」。更新笔记时先写标题再检查字数。
12. **编辑已发布笔记**:正文编辑器要先清空再写入(`JS_CLEAR_BODY`),否则新正文会追加到旧正文后面;旧话题会随清空一起删除,需重新 `--topic` 添加。
13. **发布成功判定**:发布页成功后 URL 带 `published=true` 或跳走;编辑页成功后跳 `editSuccess` 或笔记管理页。`JS_PUBLISH_STATE` 同时检测校验失败 toast(标题超长/不能为空)快速报错,避免空等。

## Verification Checklist

- [ ] `python xhs_publish.py login` → `{"loggedIn": true}`
- [ ] `draft` 模式预览:标题正确、`div.status` 张数 = 封面+配图数、`a.tiptap-topic` 数量 = topics 数、正文无话题行
- [ ] 发布后 `status --note-title "<标题>"` → `审核中`(或 `已发布`)
- [ ] 改已发布笔记:`update --note-id <noteId> --title "≤20字" --body-file ...` → 页面跳 `editSuccess` → `status` 复查
- [ ] 未通过时读取 `.audit-modal` 原因,`update` 修改正文后重发
- [ ] 公开内容无敏感词(`公众号/微信/闲鱼/转卖/出票/转让`)
- [ ] 发布后按 `ops/private_dm.md` 补置顶评论与私信承接

Files in this skill

  • SKILL.md14.2 KB
  • agents/openai.yaml209 B
  • references/github-promo-artifact.md586 B
  • references/xhs-selectors.md2.7 KB
  • scripts/bootstrap_edge_cdp.py3.2 KB
  • scripts/enrich_stills.py6.4 KB
  • scripts/xhs_publish.py32.9 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…