| name | xhs-auto-publisher |
| description | 小红书一键自动化发布 — 从任意链接/文件到精美文章发布+评论的全流程编排 |
XHS Auto Publisher
从链接到发布的自动化管道。用户在项目根目录发送链接(GitHub/网页/飞书/本地 md),即自动完成内容抓取→文章生成→封面制作→发布→评论。
核心原则
- 全自动:登录检测 → 抓取 → 生成 → 发布 → 评论,中间不提问
- 风格统一:复用 xhs-ai-writer 爆款公式,紧凑提示词减少 token
- 登录持久化:依赖 Chrome profile 持久 cookie,发布前检测登录态
- 一次成功:所有步骤使用
--reuse-existing-tab,避免重复打开浏览器标签
输入类型检测
| 输入特征 | 类型 | 抓取方式 |
|---|
github.com/* | GitHub 仓库 | curl -s https://api.github.com/repos/$owner/$repo + README |
https?://* | 网页 | WebFetch 工具 |
*.md 且本地存在 | 本地 Markdown | Read 工具 |
自动化流程
Step 0: 确保环境就绪
python3 .claude/skills/redbook-skills/scripts/chrome_launcher.py --headless
python3 .claude/skills/redbook-skills/scripts/cdp_publish.py check-login
如果输出 NOT LOGGED IN:
- 告知用户:「需要扫码登录小红书,请在弹出的 Chrome 窗口中扫码」
- 启动 headed Chrome:
python3 .claude/skills/redbook-skills/scripts/chrome_launcher.py
- 等待用户扫码后重新
check-login
Step 1: 抓取内容
GitHub 仓库:
curl -s "https://api.github.com/repos/$owner/$repo" | python3 -c "
import sys,json
d=json.load(sys.stdin)
print(f'name: {d[\"name\"]}')
print(f'description: {d.get(\"description\",\"\")}')
print(f'stars: {d[\"stargazers_count\"]}')
print(f'forks: {d[\"forks_count\"]}')
print(f'language: {d.get(\"language\",\"\")}')
print(f'url: {d[\"html_url\"]}')
"
curl -s "https://api.github.com/repos/$owner/$repo/readme" | python3 -c "
import sys,json,base64
d=json.load(sys.stdin)
content=base64.b64decode(d['content']).decode('utf-8')
print(content[:8000])
"
网页/飞书文档:
使用 WebFetch 工具,prompt:「提取这篇文章/页面的全部正文内容和关键信息,包括标题、核心论点、代码示例、数据等。返回完整的 Markdown 格式内容。」
本地 Markdown:
使用 Read 工具读取文件。
Step 2: 生成小红书文章
基于抓取的内容,使用下方提示词生成文章。必须先给出文章让用户扫一眼,不要直接发布。
文章生成提示词(紧凑版,约 500 tokens)
你是小红书 AI 科技博主,粉丝 5 万。基于下面的素材写一篇小红书文章。
**硬性风格要求:**
- 标题 ≤20 字,制造悬念/共鸣/反常识,用下面 5 种之一:
1. 数字清单型:"3个让程序员疯狂的..."
2. 反差反常识:"这个AI工具可能改变..."
3. 情绪共鸣+利益承诺:"终于有人把...讲清楚了"
4. 悬念发现型:"发现一个宝藏项目..."
5. 保姆级直接给:"手把手教你..."
- 正文 150-300 字,STAR 框架:
S 情境:制造共鸣痛点
T 任务:引出这个工具/方法
A 行动:怎么用、核心功能
R 结果:能获得什么效果
- 每个段落配 1 个相关 emoji 开头
- 口语化,大量"我""你",短句(≤20 字)
- 禁止:AI 书面语、"首先/其次/最后"、"此外/总而言之"、"显著地"、过于完美的表达
- 结尾引导互动(评论/点赞/收藏)
**输出格式(严格遵守,用 --- 分隔):**
标题:<≤20字>
---
正文:
<多段落,每段 ≤3 行,段落间空一行>
---
标签:<3-5个标签空格分隔>
Step 3: 生成封面图
python3 .claude/skills/xhs-auto-publisher/scripts/cover_gen.py \
--title "$TITLE" \
--subtitle "$SUBTITLE" \
--output /tmp/xhs_cover.png
若无 subtitle,用 repo 的 description 或网页标题。
封面参数:1080×1440 (3:4),渐变背景 + 大字标题,字体清晰醒目。
Step 4: 发布+评论(一键完成)
python3 .claude/skills/redbook-skills/scripts/publish_pipeline.py --headless \
--reuse-existing-tab \
--title "解析后的标题" \
--content "解析后的正文" \
--images "/tmp/xhs_cover.png" \
--comment "📂 源码/原文链接:$SOURCE_URL" \
--comment-pin
正文最后一行如果包含 # 前缀词,publish_pipeline.py 会自动提取为话题标签。
关键参数说明:
| 参数 | 说明 |
|---|
--reuse-existing-tab | 复用已有浏览器标签,不重复打开 |
--comment | 发布后用 feed_id/xsec_token 直接添加评论(无需搜索) |
--comment-pin | 评论后尝试置顶 |
评论和置顶机制:
发布后 _click_publish 返回 {feed_id, xsec_token, note_url},评论和置顶操作使用这两个 token 无需搜索,避免了新笔记索引延迟(2-5 分钟)的问题。
⚠️ 已知限制:置顶功能仅在小红书 App 端可用。 网页版评论菜单(comment-menu > delete-dropdown)只有「删除评论」选项,没有「置顶」。--comment-pin 在网页版会尝试置顶但会返回 pin_option_not_in_menu 警告,不影响评论发布主流程。
Step 5: 输出结果
发布完成后输出:
- 笔记链接
- 评论发布结果(成功/失败)
- 置顶结果(网页版会警告,属正常现象)
评论失败为非关键步骤,输出 Warning 不中断流程。
错误处理
| 场景 | 处理 |
|---|
| 未登录 | 启动 headed Chrome → 等用户扫码 → 重试 |
| Chrome 未启动 | 运行 chrome_launcher.py --headless |
| 发布失败 | 检查标题是否超 20 字 → 截断重试 |
| 评论输入框未找到 | 已修复:自动先点击 .engage-bar .input-box 激活编辑器再填充 |
| 图片下载失败 | 改用 GitHub og:image 或手动截图 |
| GitHub API 限流 | 等 60s 或用 WebFetch 抓页面 |
| 抓取内容过短 | 提示用户内容不足以生成文章 |
| 评论失败 | 非关键步骤,输出 Warning 继续;可用 cdp_publish.py post-comment-to-feed 手动重试 |
| 置顶失败 | 网页版正常现象,笔记链接+评论仍生效;可用小红书 App 手动置顶评论 |
| 脚本路径报错 | 始终 cd /path/to/redbook 再执行,或使用绝对路径 |
发布前检查清单
技术细节
评论输入激活(2026-04 修复)
XHS 网页版评论输入框(#content-textarea)需要先点击 .engage-bar .input-box 激活才能填充内容。_fill_comment_content 方法已加入激活步骤:
- 查找
.engage-bar .input-box 并点击 → 隐藏 placeholder 层、显示 contenteditable 编辑器
- 查找
#content-textarea 或 p.content-input[contenteditable='true']
- 填充文本内容
- 触发 input/change 事件
- 点击「发送」按钮提交
置顶功能说明
小红书网页版评论菜单结构:
<div class="comment-menu">
<div class="delete-dropdown">
<svg class="reds-icon more"><use xlink:href="#more"></use></svg>
</div>
</div>
展开后仅包含「删除评论」选项。pin_own_comment 方法已适配 SVG 图标按钮(无文本的「...」菜单),但网页版不提供置顶选项。如需置顶评论,请在手机 App 端手动操作。
完整示例
用户输入:https://github.com/gsd-build/get-shit-done.git
执行序列:
check-login ✓
curl api.github.com/repos/gsd-build/get-shit-done → 获取元数据
curl api.github.com/repos/gsd-build/get-shit-done/readme → 获取 README
- 生成文章 → 给用户看预览
cover_gen.py --title "GSD" --subtitle "AI 项目管理系统,58K star" → 封面 /tmp/xhs_cover.png
publish_pipeline.py --headless --reuse-existing-tab --title "..." --content "..." --images /tmp/xhs_cover.png --comment "📂 源码:https://github.com/gsd-build/get-shit-done" --comment-pin
- 输出笔记链接(置顶警告无需关注,App 端手动置顶即可)