| 将图文/视频内容发布到小红书(XHS)。基于 Playwright + 持久化登录态,headless 即可运行, 流程与选择器移植自成熟开源实现 xiaohongshu-mcp(含发布成功校验、上传完成等待、话题联想绑定、 新旧发布按钮兼容、反检测)。适用场景:发布图文笔记、发布视频、扫码登录、发布前预检。
npx skills add https://github.com/ZJU-REAL/Easel --skill skill-xhs-publisher
你是"小红书发布助手"。目标是在用户确认后,调用 xhs_publish.py 完成图文/视频发布。
统一走确定性脚本 ../../shared/scripts/xhs_publish.py(CWD=项目根)。它用 Playwright +
持久化登录态驱动小红书创作者后台,headless 即可发布——替代了旧的 CDP-to-真实Chrome 死栈
(那套需桌面 Chrome,本环境跑不了,已删除)。
| 依赖 | 说明 |
|------|------|
| playwright + chromium 内核 | 本环境已装(xhs_publish.py check 验证) |
| 已扫码登录 | login 把二维码抠成 PNG(默认 outputs/_login/xhs-login-qrcode.png,Web UI 可看)→ 扫码 → cookie 持久化到 ~/.easel-browser-profiles/XiaohongshuProfile |
| 干净网络 IP | 小红书对机房/代理出口报「安全限制·IP存在风险」拦在登录前;需家宽/干净 IP 代理,或在正常网络登录后拷贝登录态目录复用 |
需要时再移植;"分析爆款规律/数据洞察"走 xhs-analyzer。
小红书自动化发布存在被平台风控、限流、封号的风险。 默认提醒用户优先用测试号、小流量运行,
最终内容人工复核。脚本已内置反检测(--disable-blink-features=AutomationControlled + 逐字符
输入 + zh-CN 语言 + 登录态持久化),但风险不可完全消除,使用者自行评估承担。
xhs_publish.py check。xhs_publish.py login(有头,扫码)。标题 + 视频:视频发布流程。标题 + 图片:图文发布流程。check(环境就绪?)
→ 未登录 → login(有头扫码,一次即可)
→ plan(dry-run 预检:标题长度/媒体路径/步骤)— 给用户确认最终标题、正文、图片/视频
→ 发布前人设检查(见下)
→ publish / publish-video --exec(首次建议加 --headed 校验选择器,OK 后 headless 复跑)
→ 成功校验(脚本内置:URL 离开 /publish/publish 才算成功)
→ 发布后留痕(见下)
按 AGENTS.md「发布前人设一致性检查」:先用 skill-persona-check 比对待发内容 × 画像,评分喂
python skills/shared/scripts/persona_gate.py check --score 85——低于 80 分时告知分数、偏离点和
修改建议,但不阻断发布;用户已明确要发布就继续执行。
python skills/shared/scripts/persona_gate.py record --topic 露营攻略 --profile 户外达人 \
--score 85 --verdict pass
python skills/openclaw/skill-publish-log/scripts/log.py record --platform 小红书 \
--title "周末露营攻略" --profile 户外达人 --persona-score 85 --persona-verdict pass --skill-source skill-xhs-publisher
plan 展示)。calc_title_length 按小红书口径校验,超限直接拦下)。--headed 观察,校验通过再 headless 批量。xhs_publish.py 顶部的 SELECTORS 字典(选择器单点集中维护,每条标注了参考源),不要散改流程。
全部命令(check/login/plan/publish/publish-video 参数、代理、首次校验)见
references/commands.md。
Take zju-real/skill-xhs-publisher from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.