xhs-smart-publisher
小红书智能发布:内容适配→排版→Playwright自动发布/存草稿。覆盖标题公式(≤20字+emoji+数字)、正文排版(空行分段+emoji点缀)、标签策略(热门+长尾3-8个)、封面规格(3:4竖版1080×1440)、CES算法优化。支持图文笔记和轮播。触发:'发小红书'、'小红书发布'、'xhs publish'、'红书笔记'、'小红书草稿'。
Best use case
xhs-smart-publisher is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
小红书智能发布:内容适配→排版→Playwright自动发布/存草稿。覆盖标题公式(≤20字+emoji+数字)、正文排版(空行分段+emoji点缀)、标签策略(热门+长尾3-8个)、封面规格(3:4竖版1080×1440)、CES算法优化。支持图文笔记和轮播。触发:'发小红书'、'小红书发布'、'xhs publish'、'红书笔记'、'小红书草稿'。
Teams using xhs-smart-publisher should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/xhs-smart-publisher/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How xhs-smart-publisher Compares
| Feature / Agent | xhs-smart-publisher | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
小红书智能发布:内容适配→排版→Playwright自动发布/存草稿。覆盖标题公式(≤20字+emoji+数字)、正文排版(空行分段+emoji点缀)、标签策略(热门+长尾3-8个)、封面规格(3:4竖版1080×1440)、CES算法优化。支持图文笔记和轮播。触发:'发小红书'、'小红书发布'、'xhs publish'、'红书笔记'、'小红书草稿'。
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# 小红书智能发布
- Author: Daniel Li
- Copyright © Daniel Li. All rights reserved.
## ⚡ 快速工作流
```
触发词 → 填写内容 → 🔍 截图确认 → ⏳ 等待指令 → ✅ 发布/存草稿
```
**关键:截图确认步骤不可跳过!**
| 步骤 | 操作 | 阻塞? |
|------|------|-------|
| 1 | 填写标题、正文、标签、上传封面 | ❌ |
| 2 | **截图发送到群** | ⚠️ 必须 |
| 3 | **等待用户确认** | ✅ 阻塞 |
| 4 | 收到"发布"→点击发布 | ❌ |
| 4 | 收到"存草稿"→点击暂存 | ❌ |
**用户指令:**
- `发布` / `确认发布` → 执行发布
- `存草稿` / `暂存` → 保存到草稿箱
## 排版规则
| 项 | 规则 |
|----|------|
| 标题 | ≤20字,emoji+关键词+数字,公式:人群+关键词+数字+悬念+emoji |
| 正文 | 300-1000字,双换行分段,每段1-2个emoji开头,前3行放核心 |
| 标签 | #话题名(无空格) 3-8个,精准在前泛话题在后 |
| 封面 | 3:4竖版(1080×1440),大字+对比色+人物/产品占60%+ |
| 图片 | 1-18张,JPG/PNG,≤20MB/张 |
| 最佳时间 | 工作日18-22点,周末20-23点 |
## 内容适配模板
将任意内容转化为小红书格式时:
1. **标题**:提炼核心卖点,套用公式 `人群定位+关键词+数字+悬念词+emoji`
- 例:`打工人必看🔥5个效率工具让你准时下班`
2. **正文排版**:
```
emoji 开头金句/痛点(抓注意力)
emoji 正文第一段(核心信息,≤3行)
emoji 正文第二段(展开论述)
emoji 正文第三段(补充/案例)
emoji 总结/互动引导(提问/投票)
#精准话题1 #精准话题2 #泛话题3 #泛话题4
```
3. **emoji策略**:每段开头1个,正文中关键词旁适度点缀,不超过正文的5%
4. **标签策略**:2个精准话题(搜索量高) + 2-4个泛话题(曝光量大) + 1-2个长尾话题
## 发布流程(Browser工具操作)
### 通用流程
**Step 0: 确认发布内容类型**
- 视频 → 走视频发布流程
- 图文 → 走图文发布流程
- 长文 → 走长文发布流程
---
### 📷 图文发布流程(7步)
**Step 1: 打开发布页面**
```
browser(action="navigate", profile="openclaw",
targetUrl="https://creator.xiaohongshu.com/publish/publish?source=official&target=image")
```
**Step 2: 确认发布类型**
- 点击「上传图文」
**Step 3: 上传封面图片**
- 点击上传按钮或 `input[type='file']` 上传封面图
- 等待图片加载完成
**Step 4: 填写标题**
- ⚠️ 定位标题输入框:placeholder="填写标题会有更多赞哦"
- 使用 JavaScript 精确填充(防止UI错位):
```javascript
// 找到标题输入框并设置值
const titleInput = document.querySelector('input[placeholder*="标题"]');
if(titleInput) {
titleInput.value = '标题内容(≤20字)';
titleInput.dispatchEvent(new Event('input', {bubbles: true}));
}
```
**Step 5: 填写正文(⚠️ 最关键一步)**
- **先点击正文编辑器获取焦点**:
```
browser(action="act", kind="click", ref="<正文框ref>")
```
- **等待 500ms** 让 Tiptap/ProseMirror 编辑器初始化
- **使用 Tiptap/ProseMirror API 填写正文**:
```javascript
// 将 Markdown 转换为 HTML
const text = `要粘贴的正文内容`;
const paragraphs = text.split('\n').filter(p => p.trim());
const htmlParts = paragraphs.map(p => {
// 处理 **粗体**
p = p.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
return '<p>' + p + '</p>';
});
const html = htmlParts.join('');
// 写入编辑器
const editor = document.querySelector('.tiptap.ProseMirror');
if (editor) {
editor.focus();
editor.innerHTML = html;
editor.dispatchEvent(new Event('input', {bubbles: true}));
}
```
- **验证**:正文框字数统计应显示 `X/1000`(X>0),如果仍显示 `0/1000`,尝试方案B/C/D(见"UI问题与解决方案")
- ⚠️ 如果使用 browser evaluate,fn 中不能有 await,用 setTimeout 包裹:`new Promise(r=>setTimeout(r,500)).then(()=>{...})`
**Step 6: 检查排版**
- ⚠️ **必须先验证正文已写入**:正文框字数应 > 0
- 截图确认格式
- 确认标题框内只有标题(≤20字),字数 `X/20`
- 确认正文框内有完整正文,字数 `X/1000`
- 如正文 0/1000 → 正文未写入 → 回到 Step 5 尝试其他方案
- 如有排版问题,手动调整
**Step 7: 🔍 截图确认(必须步骤)**
- ⚠️ **在点击发布/保存草稿之前**,必须执行此步骤
- 使用 browser 截图当前页面内容:
```
browser(action="screenshot", target="host")
```
- 将截图发送到群中汇报:
```
message(action="send", channel="telegram", target="-1003890797239",
message="📝 小红书内容已填写完毕,请确认后回复'发布'或'存草稿'",
accountId="xiaocode")
```
- **必须等待用户确认后才能继续**(不自动发布)
**Step 8: ⏳ 等待用户确认**
- 用户回复以下指令之一:
- `发布` / `确认发布` → 执行发布
- `存草稿` / `暂存` → 保存到草稿箱
- `修改` / `取消` → 停止流程,等待重新触发
- ⚠️ **此步骤是阻塞的**,在收到明确指令前不执行任何操作
**Step 9: ✅ 执行发布/存草稿**
*根据用户确认选择:*
**发布模式:**
- 点击「发布」按钮
- 等待发布成功提示
- 截图确认发布结果
- 发送完成通知到群
**草稿模式:**
- 点击「暂存离开」按钮
- 确认草稿保存成功
- 发送完成通知到群
---
### 📝 长文发布流程(6步)
相比图文,少去上传图片封面步骤
**Step 1: 打开发布页面**
- URL: `https://creator.xiaohongshu.com/publish/publish?source=official`
**Step 2: 确认发布类型**
- 点击「写长文」
**Step 3: 填写标题**
- 同图文 Step 4
**Step 4: 填写正文**
- 同图文 Step 5
**Step 5: 🔍 截图确认(必须步骤)**
- 同图文 Step 7:必须先截图发送到群等待确认
**Step 6: ⏳ 等待用户确认**
- 同图文 Step 8:等待用户回复「发布」或「存草稿」
**Step 7: ✅ 执行发布/存草稿**
- 同图文 Step 9
---
### 🎬 视频发布流程(3步)
**Step 1: 上传视频**
- 点击「上传视频」
- 选择视频文件上传
**Step 2: 🔍 截图确认(必须步骤)**
- 填写标题、描述等内容后
- 执行 `browser(action="screenshot", target="host")` 截图
- 发送到群中等待确认
- ⚠️ 必须等待用户确认后才能发布
**Step 3: ⏳ 等待用户确认**
- 同图文 Step 8
**Step 4: ✅ 执行发布**
- 用户确认后点击「发布」
---
### 自动化脚本用法
```bash
python scripts/xhs_publish.py \
--title "标题文字" \
--content "正文内容" \
--tags "话题1,话题2,话题3" \
--image "/path/to/cover.jpg" \
--mode draft \
--auto-login
```
**参数说明:**
- `--auto-login`: 自动连接 openclaw 浏览器获取登录态
- `--mode draft`: 保存到草稿箱(默认)
- `--mode publish`: 直接发布
## 浏览器自动化注意事项
### 已登录态获取
使用 openclaw 浏览器 profile="openclaw",通过 CDP 连接 (http://127.0.0.1:18800) 自动复用登录态。
### UI 问题与解决方案
#### ❌ 问题1:正文框 0/1000 写不进去(已确认 2026-03-20)
**现象**:标题正确(8字),但正文框显示 0/1000,browser 的 fill/type 均无法写入内容。
**根因**:小红书创作者平台已从 Quill.js 迁移到 **Tiptap/ProseMirror**(class=`tiptap.ProseMirror`)。普通 DOM 操作(设置 innerText/value)不触发 React 状态更新,导致:
- 内容虽然视觉上出现,但 Tiptap 内部状态为空
- 字数统计不变(0/1000)
- 保存草稿后正文丢失
**✅ 解决方案(推荐方案)**:
**方案A:Tiptap/ProseMirror API 直接写入(推荐)**
```javascript
// 将 Markdown 转换为 HTML 段落
const text = '要粘贴的正文内容\n第二段内容';
const paragraphs = text.split('\n').filter(p => p.trim());
const htmlParts = paragraphs.map(p => {
// 处理 **粗体**
p = p.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
return '<p>' + p + '</p>';
});
const html = htmlParts.join('');
// 写入 Tiptap 编辑器
const editor = document.querySelector('.tiptap.ProseMirror');
if (editor) {
editor.focus();
editor.innerHTML = html;
editor.dispatchEvent(new Event('input', {bubbles: true}));
}
```
**方案B:Clipboard API 模拟粘贴(备选)**
```javascript
// 先点击正文编辑器获取焦点
document.querySelector('.tiptap.ProseMirror')?.click();
// 等待 300ms 让编辑器初始化
await new Promise(r => setTimeout(r, 300));
// 使用 Clipboard API 粘贴
const text = '要粘贴的正文内容';
const clipboardData = new DataTransfer();
clipboardData.setData('text/plain', text);
const pasteEvent = new ClipboardEvent('paste', {
clipboardData: clipboardData,
bubbles: true,
cancelable: true
});
document.querySelector('.tiptap.ProseMirror')?.dispatchEvent(pasteEvent);
```
**方案C:executeCommand(兼容方案)**
```javascript
document.querySelector('.tiptap.ProseMirror')?.focus();
document.execCommand('selectAll');
document.execCommand('insertText', false, '正文内容');
```
**验证标准**:写入后正文框字数统计应显示 `X/1000`(X>0)。
---
#### ❌ 问题2:标题和正文内容混串
**现象**:标题输入框显示字符计数如 "510/20",内容被粘贴到了标题位置。
**根因**:编辑器 UI 的 contenteditable 字段定位错误。
**解决**:
1. **先填标题**:使用 `input[placeholder*="标题"]` 定位
2. **再点击正文框**:点击 `.ql-editor` 后等待 500ms
3. **最后填正文**:使用方案A粘贴
4. 验证标题框字数 ≤ 20,正文框字数 > 0
### 手动修正流程(最终兜底)
1. 打开草稿箱
2. 点击"编辑"进入文章
3. 手动复制正文到正确位置,修正标题
4. 点击发布
## 错误处理
| 错误 | 处理 |
|------|------|
| 登录过期 | 提示用户重新扫码,保存新cookie |
| 滑块验证 | 暂停等待手动完成,设置 `--headless false` |
| 标题超长 | 自动截断到20字并警告 |
| 图片上传失败 | 重试3次,每次间隔5秒 |
| 网络超时 | 重试3次,指数退避(5s/15s/45s) |
| 发布频率限制 | 等待60秒后重试 |
| 内容混入标题 | 保存草稿后手动修正 |
## 发布前检查清单
- [ ] 标题 ≤20字,含emoji和关键词
- [ ] 正文 ≥100字(新规要求)
- [ ] 标签 3-8个,#格式
- [ ] 封面图 3:4竖版
- [ ] 无其他平台水印
- [ ] 非AI搬运内容(原创要求)
## 文件结构
```
xhs-smart-publisher/
├── SKILL.md
├── scripts/
│ └── xhs_publish.py # Playwright 自动发布脚本
├── references/
│ └── platform-rules.md # 完整平台规则(从调研文档提取)
└── templates/
└── content-template.md # 排版模板示例
```Related Skills
zsxq-smart-publish
Publish and manage content on 知识星球 (zsxq.com). Supports talk posts, Q&A, long articles, file sharing, digest/bookmark, homework tasks, and tag management. Use when publishing content to 知识星球, creating/editing posts, uploading files/images/audio, managing digests, batch publishing, or formatting content for 知识星球.
ziliu-publisher
字流(Ziliu) - AI驱动的多平台内容分发工具。用于一次创作、智能适配排版、一键分发到16+平台(公众号/知乎/小红书/B站/抖音/微博/X等)。当用户需要多平台发布、内容排版、格式适配时使用。触发词:字流、ziliu、多平台发布、一键分发、内容分发、排版发布。
xhs-publisher
将 Markdown 文章自动发布到小红书(XHS)草稿箱。支持多图上传(封面+素材)。
media-auto-publisher
> 多平台自动发布——内容一键分发到多个社交媒体平台
juejin-smart-publish
掘金技术社区智能发布:Markdown编辑器全功能支持。覆盖标题(15-35字)、分类(必选)、标签(1-5个)、封面上传、摘要填写、GFM排版。Playwright自动化+API双通道发布。触发:发掘金、掘金发布、juejin publish、掘金文章、技术博客发布。
juejin-publisher-custom
> 掘金自定义发布——掘金平台内容创作与发布
gzh-publisher
微信公众号统一发布技能:通过 OpenClaw Browser 自动化完成登录、写文章、一键排版、封面、存草稿。
douyin-smart-publish
抖音创作者平台智能发布(视频/图文):内容适配→上传→填描述/#话题→封面→存草稿→截图回传确认。默认只存草稿;只有在 Daniel 明确确认后才允许点击发布。覆盖标题(≤55字)、描述(建议≤200字)、#话题标签(3-5个)、封面设置、定时发布、可见性、合拍/下载开关。Playwright 自动化。触发:'发抖音'、'抖音发布'、'douyin publish'、'抖音图文'、'抖音视频'、'发布短视频'。
douyin-publisher
抖音图文/视频发布(OpenClaw Browser 自动化):登录检测→内容校验→上传页导航→填标题/正文→上传封面+素材→暂存离开。
wemp-operator
> 微信公众号全功能运营——草稿/发布/评论/用户/素材/群发/统计/菜单/二维码 API 封装
zoom-automation
Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.
zoho-crm-automation
Automate Zoho CRM tasks via Rube MCP (Composio): create/update records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.