小红书自动发帖
自动化运营小红书账号:搜索资讯 → 写帖子 → 生成封面图 → 发布。
前置条件
- Node.js ≥ 18,已安装
puppeteer(npm install puppeteer) - 中文字体:封面图渲染需要中文字体,见 references/setup.md
- 登录会话:需通过
web-session-managerskill 完成小红书扫码登录,保存 session
核心文件
| 文件 | 说明 |
|---|---|
scripts/xhs_ai_publisher.js |
主脚本,导出 generateCoverImage, publishPost |
references/posting-guide.md |
帖子创作规范、话题库、封面模板说明 |
references/setup.md |
环境配置、登录会话、字体安装指南 |
内容安全规范(必读)
脚本内置内容安全检查,发布前自动拦截违规内容,触发则抛出错误提示修改。
🚫 会被拦截的内容
| 类型 | 示例(错误做法) | 原因 |
|---|---|---|
| 煽动站队标题 | 这事你支持谁? 谁对谁错? |
平台判定对立煽动 |
| 强烈倾向性定性 | 全是他的错 活该 罪有应得 |
不当言论风险 |
| 人身攻击 | 智障 脑残 去死 |
直接违规 |
| 未证实指控 | 故意侵权 明知故犯 |
名誉侵权风险 |
✅ 涉及争议话题的正确写法
原则:陈述事实 + 开放提问,不站队、不定性
❌ 标题:「李荣浩单依纯,这事我支持谁?」
✅ 标题:「李荣浩公开维权,版权这件事聊一聊」
❌ 正文:「单依纯全是她的错,活该被骂」
✅ 正文:「这件事有几个细节值得关注……你觉得版权问题
艺人和主办方各该负什么责任?」
结尾互动句推荐:
你怎么看这件事?✅这种情况你遇到过吗?✅你支持谁?❌(煽动对立)
脚本每次发布前自动检测登录态。Session 有效则直接发布;失效时提供两种登录方式:
方式一:手机号 + 验证码(推荐)
最稳定,不依赖二维码图片质量:
await publishPost({
title, content, topics, imagePath,
phone: '13812345678',
askCodeFn: async (prompt) => {
// 将 prompt 发给用户,等待回复验证码
// 例:return await agent.ask(prompt);
}
});
Agent 引导话术:
「小红书登录态已失效,需要重新登录。请告诉我你的小红书注册手机号,我来帮你发送验证码。」
方式二:扫码登录
⚠️ 重要:必须用 captureQRCode() 裁切二维码区域再发给用户,直接截全页分辨率太低无法扫码!
const { captureQRCode, waitForQRLogin } = require('./scripts/xhs_ai_publisher.js');
// 1. 截取二维码(自动裁切高清)
const qrPath = await captureQRCode(page, '/tmp/xhs_qr.png');
// 2. 发给用户扫码:MEDIA: /tmp/xhs_qr.png
// 3. 等待扫码完成(最多120秒)
const ok = await waitForQRLogin(page, 120);
if (!ok) {
// 二维码过期,重新截取
const qrPath2 = await captureQRCode(page, '/tmp/xhs_qr2.png');
}
登录失败排查
- 调试截图保存在
/tmp/xhs_login_debug.png、/tmp/xhs_after_login.png - 验证码错误:重新调用
loginWithPhone - 二维码过期:调用
captureQRCode重新生成后发给用户
发帖流程
1. 确定选题
根据你的账号定位搜索资讯,参见 references/posting-guide.md 了解选题策略。
通用选题原则:真实发生、有具体细节、目标读者能感知到价值。
2. 写帖子
参见 references/posting-guide.md 中的写作规范。
核心要求:
- 标题:严格 ≤20字(超出会被小红书截断)
- 正文:200-400字,自然口语风格,结尾有互动问句
- 话题标签:3-5个(从话题库选,每次不同)
3. 生成封面图
const { generateCoverImage } = require('./scripts/xhs_ai_publisher.js');
await generateCoverImage(
title, // 标题文字(≤20字)
subtitle, // 副标题:2-3句话,用 \n 换行,30-50字
outputPath // 图片输出路径(绝对路径,.png)
);
subtitle 示例:
「昨夜正式发布\n性能超越上一代50%\n普通人能用到什么程度?」
6套封面模板根据标题 hash 自动选择,见 references/posting-guide.md。
4. 发布
const { publishPost } = require('./scripts/xhs_ai_publisher.js');
const success = await publishPost({
title, // ≤20字
content, // 正文(纯文本,不含话题标签)
topics, // 字符串数组,如 ['AI工具', '大模型', 'ChatGPT']
imagePath // 封面图绝对路径
});
5. 随机延时(定时任务推荐)
避免固定时间模式,在执行前随机等待:
const delayMs = Math.floor(Math.random() * 30 * 60 * 1000); // 0-30分钟
await new Promise(r => setTimeout(r, delayMs));
常见问题
- 封面图中文乱码:字体未安装,见 references/setup.md
- 发布按钮未找到:脚本会自动截图
xhs_pre_publish.png到 workspace,用于诊断 - 话题未插入:话题面板弹出较慢,脚本自动等待2秒后尝试 Enter 兜底
- 会话过期:用 Puppeteer 截图
https://creator.xiaohongshu.com确认登录状态,失效则重登(见 setup.md)
