Files
xiaohongshu-mcp/skills/post-to-xhs/references/publish-workflow.md
Angiin 8572c8c5e0 feat: add long article publish mode to post-to-xhs skill
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
2026-02-27 16:27:16 +08:00

298 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 小红书发布流程参考
本文档描述通过 CDPChrome DevTools Protocol自动发布内容到小红书创作者中心的完整流程。
## 前置条件
1. **Chrome 浏览器已安装** - 标准 Google Chrome
2. **Python 依赖已安装** - `websockets``requests`
3. **首次登录已完成** - 至少登录过一次小红书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 元素检测 |
## 选择器维护指南
当小红书更新页面导致自动化失败时:
1. 在 Chrome 中打开 `https://creator.xiaohongshu.com/publish/publish`
2. 按 F12 打开开发者工具
3. 使用元素选择器Ctrl+Shift+C定位目标元素
4. 记录新的选择器
5. 更新 `scripts/cdp_publish.py``SELECTORS` 字典对应的值
## 错误处理
| 错误 | 原因 | 解决方案 |
|---|---|---|
| Chrome 未启动 | 端口 9222 无响应 | 运行 `chrome_launcher.py` 或手动启动 Chrome |
| 找不到 Chrome | 非标准安装路径 | 检查 Chrome 安装,或在脚本中指定路径 |
| 未登录 | cookie 过期或首次使用 | 在 Chrome 窗口中扫码登录 |
| 选择器失效 | 小红书页面更新 | 按上述维护指南更新选择器 |
| 图片上传失败 | 文件路径错误或格式不支持 | 检查图片路径,确保格式为 jpg/png/webp |
| 发布按钮找不到 | 页面未完全加载 | 增加等待时间或手动点击发布 |
## CLI 用法
所有脚本位于 `scripts/` 目录。
### 方式 A: 统一 pipeline推荐
```bash
# 无头模式(推荐)- 无浏览器窗口,更快
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: 分步调用(图文模式)
```bash
# 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: 分步调用(长文模式)
```bash
# 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 长文模式
```bash
# 长文模式(图片可选)
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
```
### 账号管理
```bash
# 首次登录或 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 方式:
1. 将中文标题和正文写入临时文本文件UTF-8 编码)
2. 调用 `publish_pipeline.py --headless` 传入文件路径和图片 URL
3. 根据输出状态码处理结果:
- 未登录 → 脚本自动切换到有窗口模式,提示用户扫码
- 已填写 → 请用户确认预览
4. 用户确认后调用 `cdp_publish.py click-publish` 发布
**切换账号流程**:
1. 调用 `cdp_publish.py switch-account`
2. 等待用户扫码确认
3. 继续正常发布流程