一键导入
xhs-publisher
自动发布小红书图文笔记。使用 Playwright CLI 操作浏览器完成登录、上传图片、填写标题正文(20字以内)、设置隐私(默认仅自己可见)、点击发布等完整流程。触发关键词:"发小红书"、"发布小红书笔记"、"小红书自动发布"、"发布笔记到小红书"
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
自动发布小红书图文笔记。使用 Playwright CLI 操作浏览器完成登录、上传图片、填写标题正文(20字以内)、设置隐私(默认仅自己可见)、点击发布等完整流程。触发关键词:"发小红书"、"发布小红书笔记"、"小红书自动发布"、"发布笔记到小红书"
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
小红书文字笔记创作与卡片渲染技能。适用于以文字内容为主的笔记场景(干货分享、知识科普、清单排行、教程步骤、资源推荐等)。本技能负责:(1) 撰写小红书笔记文案(标题+正文+标签),(2) 通过本地渲染脚本生成排版精美的图片卡片(9 种 CSS 主题 + 多种分页模式)。本技能不再内置发布能力——发布请交由 xhs-publisher 技能,通过浏览器自动化以真实用户操作方式发布,规避直接调用平台接口的高风险。触发关键词:"写笔记"、"发小红书"、"小红书文案"、"撰写笔记"、"排版卡片"、"生成卡片"。注意:当用户需要 AI 生成插画/卡通/手绘风格的原创配图内容(非文字排版)时,应使用 xhs-images-design 技能而非本技能。
AI 生成小红书图文卡片技能。适用于需要 AI 原创插画/卡通/手绘配图的图文并茂内容(种草分享、手绘笔记、知识图解、插画教程、视觉冲击封面等)。本技能通过 AI 图像生成工具创建 1-10 张风格化图片卡片,支持 12 种视觉风格(cute/fresh/warm/bold/minimal/retro/pop/notion/chalkboard/study-notes/screen-print/sketch-notes)、8 种信息布局和 3 种配色方案。触发关键词:"小红书图片"、"生成图片"、"AI配图"、"插画卡片"、"手绘风格"、"图文并茂"、"XHS images"、"种草图"、"图解"。注意:当用户只需要撰写文字笔记并排版发布(不需要 AI 生成原创配图)时,应使用 xhs-note-creator 技能。
基于 SOC 职业分类
| name | xhs-publisher |
| description | 自动发布小红书图文笔记。使用 Playwright CLI 操作浏览器完成登录、上传图片、填写标题正文(20字以内)、设置隐私(默认仅自己可见)、点击发布等完整流程。触发关键词:"发小红书"、"发布小红书笔记"、"小红书自动发布"、"发布笔记到小红书" |
使用 Playwright CLI 自动将图文内容发布到小红书创作者平台。
已安装 playwright-cli
npm install -g @playwright/cli
首次使用需登录
--headed --persistent 扫码登录使用 --persistent 保存登录状态,下次无需重复扫码。
必须后台启动浏览器。 playwright-cli open 会保持浏览器会话,不会立即退出;agent 不要用前台命令等待它结束,也不要给 open 设置长超时。长时间等待只用于后面的登录检测脚本。
# PowerShell / Windows: 后台打开浏览器(使用 persistent 模式保存登录态)
Start-Process -FilePath "playwright-cli" -ArgumentList @("open", "https://www.xiaohongshu.com", "--browser=chrome", "--headed", "--persistent")
# bash: 后台打开浏览器(使用 persistent 模式保存登录态)
playwright-cli open https://www.xiaohongshu.com --browser=chrome --headed --persistent >/tmp/xhs-publisher-browser.log 2>&1 &
自动检测登录状态脚本:
playwright-cli run-code "async (page) => {
const MAX_WAIT = 120000; // 最多等待120秒
const CHECK_INTERVAL = 2000; // 每2秒检测一次
const checkLogin = async () => {
const currentUrl = page.url();
// 检测是否已登录:检查是否存在用户头像或用户名元素
const isLoggedIn = await page.evaluate(() => {
// 小红书登录后的特征元素
const hasAvatar = document.querySelector('.avatar img') !== null ||
document.querySelector('[class*="avatar"]') !== null ||
document.querySelector('img[src*="avatar"]') !== null;
const hasUserInfo = document.querySelector('.user-info') !== null ||
document.querySelector('[class*="user-name"]') !== null;
return hasAvatar || hasUserInfo;
});
return isLoggedIn;
};
// 轮询检测登录状态
for (let waited = 0; waited < MAX_WAIT; waited += CHECK_INTERVAL) {
const isLoggedIn = await checkLogin();
if (isLoggedIn) {
return { success: true, message: '登录成功' };
}
await page.waitForTimeout(CHECK_INTERVAL);
}
return { success: false, message: '等待登录超时,请手动扫码后重新执行' };
}"
如果返回登录成功,继续下一步;如果超时,需要用户手动扫码后重新执行流程。
playwright-cli goto "https://creator.xiaohongshu.com/publish/publish"
使用 JavaScript 点击"上传图文"按钮:
playwright-cli eval "document.querySelectorAll('span.title').forEach(el => { if(el.textContent.trim() === '上传图文') el.click(); })"
触发文件选择器:
playwright-cli eval "document.querySelector('input[type=file]')?.click()"
上传封面图:
playwright-cli upload "path/to/cover.png"
继续上传其他图片(每上传一张需重新触发文件选择器):
playwright-cli eval "document.querySelector('input[type=file]')?.click()"
playwright-cli upload "path/to/card_1.png"
# 重复...
# 标题超过20字会导致发布失败
playwright-cli fill "textbox '填写标题会有更多赞哦'" "你的标题"
注意:小红书限制标题不超过20个字,超过部分会被导致发布失败。
playwright-cli click "textbox[contenteditable]"
playwright-cli type "正文内容..."
playwright-cli click "button '话题'"
playwright-cli type "RAG"
playwright-cli press Enter
点击可见性设置:
playwright-cli eval "document.querySelector('div:contains(\"公开可见\")').click()"
选择"仅自己可见":
playwright-cli eval "document.querySelector('text=仅自己可见').click()"
使用 run-code 执行 CDP 脚本点击发布按钮:
playwright-cli run-code "async page => {
const client = await page.context().newCDPSession(page);
const { root } = await client.send('DOM.getDocument', { depth: -1, pierce: true });
let targetId = null;
const walk = (n) => {
if (!n) return;
if (n.nodeName === 'BUTTON') {
const cls = (n.attributes || []).join(' ');
if (cls.includes('bg-red')) targetId = n.nodeId;
}
for (const c of (n.children || [])) walk(c);
if (n.shadowRoots) for (const s of n.shadowRoots) walk(s);
};
walk(root);
if (!targetId) throw new Error('未找到发布按钮');
const { model } = await client.send('DOM.getBoxModel', { nodeId: targetId });
const p = model.content;
const cx = (p[0] + p[2] + p[4] + p[6]) / 4;
const cy = (p[1] + p[3] + p[5] + p[7]) / 4;
await page.mouse.click(cx, cy);
await page.waitForTimeout(2000);
return { success: true };
}"
检查页面 URL 是否变为 /publish/success:
playwright-cli eval "document.location.href"
小红书强制要求标题 不超过20个字:
发布按钮位于 closed shadow DOM 内,普通选择器无法选中,必须使用 CDP 协议:
DOM.getDocument({ pierce: true }) 穿透 shadow DOMbg-red 的 BUTTON 元素DOM.getBoxModel 获取坐标后点击