Add "写长文" workflow with template selection support: - cdp_publish.py: new commands (long-article, select-template, click-next-step) - publish_pipeline.py: add --mode parameter (image-text / long-article) - SKILL.md: document long article flow (B.1-B.5 steps) - publish-workflow.md: add long article selectors, CLI usage, detailed steps
11 KiB
小红书发布流程参考
本文档描述通过 CDP(Chrome DevTools Protocol)自动发布内容到小红书创作者中心的完整流程。
前置条件
- Chrome 浏览器已安装 - 标准 Google Chrome
- Python 依赖已安装 -
websockets、requests - 首次登录已完成 - 至少登录过一次小红书(cookie 持久化在专用 profile 中)
流程概览
上传图文模式:
生成文案 → 用户确认 → 启动 Chrome → 检查登录 → 导航发布页 → 上传图片 → 填写标题 → 填写正文 → 用户确认发布
写长文模式:
生成文案 → 用户确认 → 启动 Chrome → 检查登录 → 导航发布页 → 点击"写长文"tab → 点击"新的创作" → 填写标题 → 填写正文 → 一键排版 → 用户选择模板 → 下一步 → 填写发布页正文描述 → 用户确认发布
详细步骤
1. 启动 / 连接 Chrome
脚本: scripts/chrome_launcher.py
- 检测
127.0.0.1:9222端口是否已有 Chrome 实例 - 若无,启动 Chrome 并附带以下参数:
--remote-debugging-port=9222--user-data-dir=%LOCALAPPDATA%/Google/Chrome/XiaohongshuProfile--no-first-run--no-default-browser-check--headless=new(仅在无头模式下)
- 等待端口就绪(最多 15 秒)
用户数据目录说明: 使用独立的 XiaohongshuProfile 目录,与用户日常浏览器 profile 完全隔离,不会干扰正常使用。
无头模式说明: 使用 --headless 参数启动时,Chrome 不会显示窗口,适合自动化发布。如需登录或切换账号,脚本会自动切换到有窗口模式。
2. 检查登录状态
脚本: scripts/cdp_publish.py → check_login()
- 导航到
https://creator.xiaohongshu.com - 检查当前 URL 是否包含 "login"(被重定向到登录页)
- 检查页面是否存在用户信息相关的 DOM 元素
- 若未登录,提示用户在 Chrome 窗口中扫码登录
3. 导航到发布页
- 目标 URL:
https://creator.xiaohongshu.com/publish/publish - 等待页面完全加载
4. 上传图片
脚本: scripts/cdp_publish.py → _upload_images()
- 通过 CDP
DOM.querySelector定位input[type="file"]元素 - 使用 CDP
DOM.setFileInputFiles命令设置文件路径 - 等待图片上传和处理完成
图片来源: 如果图片是 URL,先用 scripts/image_downloader.py 下载到临时目录,发布后自动清理。
5. 填写标题
脚本: scripts/cdp_publish.py → _fill_title()
- 定位标题输入框
- 设置 value 并触发
input和change事件
6. 填写正文
脚本: scripts/cdp_publish.py → _fill_content()
- 定位 contenteditable 编辑区域(TipTap/ProseMirror editor)
- 将正文按段落拆分,包裹为
<p>标签写入 innerHTML,段落之间插入<p><br></p>空行 - 触发
input事件
7. 用户确认并发布
- 脚本填写完成后暂停,提示用户在浏览器中检查预览
- 用户确认后,脚本点击发布按钮
- 或用户选择手动点击发布按钮
写长文模式详细步骤
1-2. 启动 Chrome 和检查登录
同上传图文模式。
3. 导航到发布页并点击"写长文"tab
脚本: scripts/cdp_publish.py → _click_long_article_tab()
- 导航到
https://creator.xiaohongshu.com/publish/publish - 在
div.creator-tab中查找文本为"写长文"的 tab 并点击
4. 点击"新的创作"
脚本: scripts/cdp_publish.py → _click_new_creation()
- 在页面中查找包含"新的创作"文本的元素并点击
- 等待长文编辑器页面加载
5. 填写长文标题
脚本: scripts/cdp_publish.py → _fill_long_title()
- 定位
textarea.d-text[placeholder="输入标题"]元素 - 使用
HTMLTextAreaElement.prototype.value的 native setter 设置值 - 触发
input和change事件
6. 填写长文正文
同上传图文模式的正文填写(TipTap/ProseMirror 编辑器)。
7. 一键排版
脚本: scripts/cdp_publish.py → _click_auto_format()
- 查找并点击"一键排版"按钮
- 等待模板列表加载
8. 模板选择
脚本: scripts/cdp_publish.py → get_template_names() + select_template(name)
get_template_names()从.template-card .template-title获取所有模板名称select_template(name)点击指定名称的模板卡片- 已选中的模板卡片 class 为
template-card selected
9. 下一步并填写发布页描述
脚本: scripts/cdp_publish.py → click_next_and_prepare_publish(content)
- 点击"下一步"按钮进入发布预览页
- 发布页有独立的正文描述编辑器(
div.tiptap.ProseMirror),需要单独填入内容
10. 用户确认并发布
同上传图文模式。
DOM 选择器参考
注意: 小红书前端可能随时更新,以下选择器基于编写时的页面结构。如果自动化失败,需要在浏览器 DevTools 中重新抓取选择器,并更新
cdp_publish.py中的SELECTORS字典。
| 元素 | 主选择器 | 备选选择器 | 说明 |
|---|---|---|---|
| 图片上传 | input.upload-input |
input[type="file"] |
隐藏的文件输入,通过 CDP 直接操作 |
| 标题输入(图文) | input[placeholder*="填写标题"] |
input.d-text |
图文模式标题输入框 |
| 标题输入(长文) | textarea.d-text[placeholder="输入标题"] |
- | 长文模式 textarea 标题 |
| 正文编辑 | div.tiptap.ProseMirror |
div.ProseMirror[contenteditable="true"] |
TipTap/ProseMirror 富文本编辑器 |
| 发布按钮 | 文本匹配"发布" | - | 通过遍历按钮文本定位 |
| 写长文 tab | 文本匹配"写长文"(div.creator-tab) |
- | 长文模式入口 |
| 新的创作按钮 | 文本匹配"新的创作" | - | 长文编辑器入口 |
| 一键排版按钮 | 文本匹配"一键排版" | - | 触发模板选择 |
| 模板卡片 | .template-card |
.template-card.selected(已选) |
排版模板列表 |
| 模板名称 | .template-card .template-title |
- | 模板卡片内的名称 span |
| 下一步按钮 | 文本匹配"下一步" | - | 模板选择后进入发布页 |
| 登录检测 | URL 包含 "login" | .user-info, .creator-header |
重定向检测 + DOM 元素检测 |
选择器维护指南
当小红书更新页面导致自动化失败时:
- 在 Chrome 中打开
https://creator.xiaohongshu.com/publish/publish - 按 F12 打开开发者工具
- 使用元素选择器(Ctrl+Shift+C)定位目标元素
- 记录新的选择器
- 更新
scripts/cdp_publish.py中SELECTORS字典对应的值
错误处理
| 错误 | 原因 | 解决方案 |
|---|---|---|
| Chrome 未启动 | 端口 9222 无响应 | 运行 chrome_launcher.py 或手动启动 Chrome |
| 找不到 Chrome | 非标准安装路径 | 检查 Chrome 安装,或在脚本中指定路径 |
| 未登录 | cookie 过期或首次使用 | 在 Chrome 窗口中扫码登录 |
| 选择器失效 | 小红书页面更新 | 按上述维护指南更新选择器 |
| 图片上传失败 | 文件路径错误或格式不支持 | 检查图片路径,确保格式为 jpg/png/webp |
| 发布按钮找不到 | 页面未完全加载 | 增加等待时间或手动点击发布 |
CLI 用法
所有脚本位于 scripts/ 目录。
方式 A: 统一 pipeline(推荐)
# 无头模式(推荐)- 无浏览器窗口,更快
python publish_pipeline.py --headless --title "标题" --content "正文" --image-urls URL1 URL2
# 无头模式 - 从文件读取标题和正文
python publish_pipeline.py --headless --title-file title.txt --content-file body.txt --image-urls URL1
# 有窗口模式 - 用于调试或首次登录
python publish_pipeline.py --title "标题" --content "正文" --image-urls URL1 URL2
# 使用本地图片文件
python publish_pipeline.py --headless --title "标题" --content "正文" --images img1.jpg img2.jpg
# 填写并自动发布
python publish_pipeline.py --headless --title "标题" --content "正文" --image-urls URL1 --auto-publish
输出状态码:
- 退出码 0 +
READY_TO_PUBLISH= 表单已填写,等待确认 - 退出码 0 +
PUBLISHED= 已发布 - 退出码 1 +
NOT_LOGGED_IN= 未登录,需扫码(无头模式下会自动切换到有窗口模式) - 退出码 2 = 其他错误
方式 B: 分步调用(图文模式)
# 1. 启动 Chrome(可选 --headless)
python chrome_launcher.py
python chrome_launcher.py --headless
# 2. 检查登录(退出码 0=已登录, 1=未登录)
python cdp_publish.py check-login
python cdp_publish.py --headless check-login
# 3. 填写表单
python cdp_publish.py fill --title "标题" --content-file body.txt --images img1.jpg
python cdp_publish.py --headless fill --title "标题" --content-file body.txt --images img1.jpg
# 4. 用户确认后点击发布
python cdp_publish.py click-publish
# 或一步完成填写+发布
python cdp_publish.py --headless publish --title "标题" --content-file body.txt --images img1.jpg
方式 C: 分步调用(长文模式)
# 1. 启动 Chrome
python chrome_launcher.py
# 2. 检查登录
python cdp_publish.py check-login
# 3. 填写长文 + 一键排版(输出包含 TEMPLATES JSON)
python cdp_publish.py long-article --title-file title.txt --content-file content.txt
# 4. 选择模板
python cdp_publish.py select-template --name "模板名称"
# 5. 下一步 + 填写发布页正文描述
python cdp_publish.py click-next-step --content-file content.txt
# 6. 用户确认后点击发布
python cdp_publish.py click-publish
方式 D: Pipeline 长文模式
# 长文模式(图片可选)
python publish_pipeline.py --mode long-article --title-file title.txt --content-file content.txt
python publish_pipeline.py --mode long-article --title "标题" --content "正文" --images img1.jpg
账号管理
# 首次登录或 session 过期 - 打开浏览器扫码登录
python cdp_publish.py login
# 切换账号 - 清除 cookie 并打开登录页
python cdp_publish.py switch-account
# 关闭 Chrome
python chrome_launcher.py --kill
# 重启 Chrome(可选无头模式)
python chrome_launcher.py --restart
python chrome_launcher.py --restart --headless
Claude Code 集成
在 Claude Code 中通过 Bash 工具调用。推荐使用 pipeline 方式:
- 将中文标题和正文写入临时文本文件(UTF-8 编码)
- 调用
publish_pipeline.py --headless传入文件路径和图片 URL - 根据输出状态码处理结果:
- 未登录 → 脚本自动切换到有窗口模式,提示用户扫码
- 已填写 → 请用户确认预览
- 用户确认后调用
cdp_publish.py click-publish发布
切换账号流程:
- 调用
cdp_publish.py switch-account - 等待用户扫码确认
- 继续正常发布流程