小红书自动化控制 Skill
概述
通过 Playwright MCP 工具连接到 OpenClaw 浏览器(CDP 端口 18800),实现小红书的自动化操作,包括发布内容、搜索、获取推荐、评论等功能。
前置条件
- OpenClaw 浏览器已启动:确保 OpenClaw 浏览器运行并开启 CDP 端口 18800
- 已登录小红书:首次使用需在 OpenClaw 浏览器中手动登录小红书账号
- Playwright MCP 可用:确保
mcp__Playwright__*工具集已配置
连接方式
使用 Playwright 的 browser_run_code 工具通过 CDP 连接到 OpenClaw 浏览器:
// 连接到 OpenClaw 浏览器
const { chromium } = require('playwright');
const browser = await chromium.connectOverCDP('http://localhost:18800');
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
功能清单
| 功能 | 参数 | 说明 |
|---|---|---|
check_login_status | 无 | 检查小红书登录状态 |
publish_content | title, content, images | 发布图文内容 |
publish_with_video | title, content, video | 发布视频内容 |
list_feeds | 无 | 获取首页推荐列表 |
search_feeds | keyword | 搜索小红书内容 |
get_feed_detail | feed_id, xsec_token | 获取帖子详情 |
post_comment_to_feed | feed_id, xsec_token, content | 发表评论 |
user_profile | user_id, xsec_token | 获取用户主页信息 |
get_hot_topics | category (可选) | 获取热门话题列表 |
download_stock_images | keyword, count | 从图库下载无水印图片 |
功能实现指南
1. check_login_status - 检查登录状态
步骤:
- 使用
mcp__Playwright__browser_navigate导航到https://www.xiaohongshu.com - 使用
mcp__Playwright__browser_snapshot获取页面快照 - 检查快照中是否包含用户头像或登录按钮
- 返回登录状态
实现代码:
async (page) => {
await page.goto('https://www.xiaohongshu.com');
await page.waitForLoadState('networkidle');
// 检查是否有登录用户的头像
const userAvatar = await page.$('.user-avatar, .login-btn');
const isLoggedIn = await page.$('.user-avatar') !== null;
return { isLoggedIn, message: isLoggedIn ? '已登录' : '未登录,请先登录' };
}
2. publish_content - 发布图文内容
参数:
title(必需): 标题,不超过 20 字content(必需): 正文内容,不超过 1000 字images(必需): 图片数组,支持本地绝对路径或 HTTP 链接
步骤:
- 导航到发布页面
https://creator.xiaohongshu.com/publish/publish - 等待页面加载完成
- 上传图片(点击上传区域,选择文件)
- 填写标题
- 填写正文内容
- 点击发布按钮
- 等待发布完成
实现代码:
async (page) => {
const title = '你的标题'; // ≤20字
const content = '你的正文内容'; // ≤1000字
const images = ['/path/to/image1.jpg', '/path/to/image2.jpg'];
// 1. 导航到发布页面
await page.goto('https://creator.xiaohongshu.com/publish/publish');
await page.waitForLoadState('networkidle');
// 2. 上传图片
const uploadInput = await page.$('input[type="file"]');
await uploadInput.setInputFiles(images);
await page.waitForTimeout(3000); // 等待上传完成
// 3. 填写标题
const titleInput = await page.$('[placeholder*="标题"]');
await titleInput.fill(title);
// 4. 填写正文
const contentInput = await page.$('[placeholder*="正文"], .ql-editor');
await contentInput.fill(content);
// 5. 点击发布
const publishBtn = await page.$('button:has-text("发布")');
await publishBtn.click();
// 6. 等待发布完成
await page.waitForTimeout(5000);
return { success: true, message: '发布成功' };
}
使用 Playwright MCP 工具的方式:
1. mcp__Playwright__browser_navigate: url="https://creator.xiaohongshu.com/publish/publish"
2. mcp__Playwright__browser_snapshot: 获取页面结构
3. mcp__Playwright__browser_file_upload: paths=["/path/to/image.jpg"]
4. mcp__Playwright__browser_type: ref="标题输入框ref", text="标题内容"
5. mcp__Playwright__browser_type: ref="正文输入框ref", text="正文内容"
6. mcp__Playwright__browser_click: ref="发布按钮ref"
3. publish_with_video - 发布视频内容
参数:
title(必需): 标题,不超过 20 字content(必需): 正文内容,不超过 1000 字video(必需): 视频文件本地绝对路径(不支持 HTTP 链接)
步骤:
- 导航到发布页面
- 上传视频文件
- 等待视频处理完成(可能需要较长时间)
- 填写标题和正文
- 点击发布
注意事项:
- 仅支持本地视频文件
- 视频处理时间较长,建议文件大小不超过 1GB
- 需要等待视频处理完成后才能发布
4. list_feeds - 获取首页推荐列表
步骤:
- 导航到
https://www.xiaohongshu.com - 等待页面加载
- 获取页面快照
- 解析推荐列表中的帖子信息
返回数据结构:
{
"feeds": [
{
"feed_id": "帖子ID",
"xsec_token": "安全令牌",
"title": "帖子标题",
"author": "作者名称",
"likes": "点赞数",
"cover_url": "封面图URL"
}
]
}
实现代码:
async (page) => {
await page.goto('https://www.xiaohongshu.com');
await page.waitForLoadState('networkidle');
// 获取推荐列表
const feeds = await page.$$eval('.note-item, .feed-item', items => {
return items.map(item => ({
feed_id: item.getAttribute('data-id') || item.querySelector('a')?.href?.match(/\/explore\/(\w+)/)?.[1],
title: item.querySelector('.title')?.textContent,
author: item.querySelector('.author')?.textContent,
likes: item.querySelector('.like-count')?.textContent
}));
});
return { feeds };
}
5. search_feeds - 搜索小红书内容
参数:
keyword(必需): 搜索关键词
步骤:
- 导航到搜索页面
https://www.xiaohongshu.com/search_result?keyword={keyword} - 等待搜索结果加载
- 解析搜索结果列表
- 返回帖子列表(包含 feed_id 和 xsec_token)
实现代码:
async (page) => {
const keyword = '搜索关键词';
await page.goto(`https://www.xiaohongshu.com/search_result?keyword=${encodeURIComponent(keyword)}`);
await page.waitForLoadState('networkidle');
// 解析搜索结果
const results = await page.$$eval('.note-item', items => {
return items.map(item => {
const link = item.querySelector('a')?.href || '';
const match = link.match(/\/explore\/(\w+)\?xsec_token=([^&]+)/);
return {
feed_id: match?.[1],
xsec_token: match?.[2],
title: item.querySelector('.title')?.textContent,
author: item.querySelector('.author')?.textContent
};
});
});
return { keyword, results };
}
6. get_feed_detail - 获取帖子详情
参数:
feed_id(必需): 帖子 IDxsec_token(必需): 安全令牌(从 list_feeds 或 search_feeds 获取)
步骤:
- 导航到帖子详情页
https://www.xiaohongshu.com/explore/{feed_id}?xsec_token={xsec_token} - 等待页面加载
- 获取帖子内容、互动数据、评论列表
返回数据结构:
{
"feed_id": "帖子ID",
"title": "标题",
"content": "正文内容",
"images": ["图片URL数组"],
"author": {
"user_id": "用户ID",
"nickname": "昵称",
"avatar": "头像URL"
},
"stats": {
"likes": "点赞数",
"collects": "收藏数",
"comments": "评论数",
"shares": "分享数"
},
"comments": [
{
"user": "评论用户",
"content": "评论内容",
"time": "评论时间"
}
]
}
7. post_comment_to_feed - 发表评论
参数:
feed_id(必需): 帖子 IDxsec_token(必需): 安全令牌content(必需): 评论内容
步骤:
- 导航到帖子详情页
- 定位评论输入框
- 输入评论内容
- 点击发送按钮
- 等待评论发布成功
实现代码:
async (page) => {
const feed_id = '帖子ID';
const xsec_token = '安全令牌';
const comment = '评论内容';
await page.goto(`https://www.xiaohongshu.com/explore/${feed_id}?xsec_token=${xsec_token}`);
await page.waitForLoadState('networkidle');
// 定位评论输入框
const commentInput = await page.$('[placeholder*="评论"], .comment-input');
await commentInput.click();
await commentInput.fill(comment);
// 点击发送
const sendBtn = await page.$('button:has-text("发送"), .send-btn');
await sendBtn.click();
await page.waitForTimeout(2000);
return { success: true, message: '评论发布成功' };
}
8. user_profile - 获取用户主页信息
参数:
user_id(必需): 用户 IDxsec_token(必需): 安全令牌
步骤:
- 导航到用户主页
https://www.xiaohongshu.com/user/profile/{user_id}?xsec_token={xsec_token} - 获取用户基本信息
- 获取统计数据
- 获取笔记列表
返回数据结构:
{
"user_id": "用户ID",
"nickname": "昵称",
"bio": "简介",
"avatar": "头像URL",
"verified": "是否认证",
"stats": {
"following": "关注数",
"followers": "粉丝数",
"likes": "获赞数",
"notes": "笔记数"
},
"notes": [
{
"feed_id": "笔记ID",
"title": "标题",
"cover": "封面图"
}
]
}
9. get_hot_topics - 获取热门话题
参数:
category(可选): 话题分类,可选值:美食、美妆、时尚、出行、知识、兴趣爱好
入口URL:
https://creator.xiaohongshu.com/new/inspiration
步骤:
- 导航到创作者中心笔记灵感页面
- 等待页面加载完成
- 如果指定了分类,点击对应分类标签
- 解析热门话题列表
返回数据结构:
{
"category": "美食",
"topics": [
{
"name": "早餐吃什么",
"participants": "275.9万人",
"views": "101.6亿次",
"hot_notes": [
{
"title": "十分钟搞定✅好吃到光盘的番茄荷包蛋焖面‼️",
"likes": "4.3万"
}
]
},
{
"name": "高颜值巧克力",
"participants": "27.9万人",
"views": "13.5亿次",
"hot_notes": [...]
}
]
}
实现代码:
async (page) => {
const category = '美食'; // 可选:美食、美妆、时尚、出行、知识、兴趣爱好
// 1. 导航到笔记灵感页面
await page.goto('https://creator.xiaohongshu.com/new/inspiration');
await page.waitForLoadState('networkidle');
// 2. 如果指定分类,点击分类标签
if (category) {
const categoryTab = await page.$(`h6:has-text("${category}")`);
if (categoryTab) await categoryTab.click();
await page.waitForTimeout(1000);
}
// 3. 解析话题列表
const topics = await page.$$eval('[class*="topic-card"]', cards => {
return cards.map(card => ({
name: card.querySelector('[class*="topic-name"]')?.textContent,
participants: card.querySelector('[class*="participants"]')?.textContent,
views: card.querySelector('[class*="views"]')?.textContent
}));
});
return { category, topics };
}
使用 Playwright MCP 工具的方式:
1. mcp__Playwright__browser_navigate: url="https://creator.xiaohongshu.com/new/inspiration"
2. mcp__Playwright__browser_wait_for: time=2
3. mcp__Playwright__browser_snapshot: 获取页面结构
4. 解析快照中的话题信息
可用分类:
| 分类 | 包含话题示例 |
|---|---|
| 美食 | 早餐吃什么、高颜值巧克力、面条的花式做法、咖啡topping |
| 美妆 | 化妆教程、护肤心得、美甲分享 |
| 时尚 | 穿搭分享、包包推荐、饰品搭配 |
| 出行 | 旅行攻略、酒店推荐、景点打卡 |
| 知识 | 学习方法、职场技能、理财知识 |
| 兴趣爱好 | 手工DIY、摄影技巧、宠物日常 |
10. download_stock_images - 下载无水印图片
参数:
keyword(必需): 搜索关键词(必须用英文)count(可选): 下载数量,默认 3 张save_dir(可选): 保存目录,默认当前项目目录
图片来源:Unsplash(唯一来源)
Unsplash 是全球最大的免费高清图库,所有图片均可免费商用,无需标注来源。
方式一:使用 Playwright 从 Unsplash 下载
async (page) => {
const keyword = 'coffee shop'; // 搜索关键词(英文)
const count = 3; // 下载数量
const saveDir = '/Users/zee/Desktop/小红书自动化控制/images';
// 1. 导航到 Unsplash 搜索页
await page.goto(`https://unsplash.com/s/photos/${encodeURIComponent(keyword)}`);
await page.waitForLoadState('networkidle');
await page.waitForTimeout(2000);
// 2. 获取图片下载链接
const imageUrls = await page.$$eval('figure a[itemprop="contentUrl"]', (links, max) => {
return links.slice(0, max).map(link => link.href + '/download?force=true');
}, count);
// 3. 逐个下载图片
for (let i = 0; i < imageUrls.length; i++) {
const downloadPage = await page.context().newPage();
await downloadPage.goto(imageUrls[i]);
// 图片会自动下载到默认下载目录
await downloadPage.waitForTimeout(3000);
await downloadPage.close();
}
return { success: true, count: imageUrls.length };
}
方式二:使用 Unsplash Source API(简单直接)
# 从 Unsplash 随机下载指定主题的图片
keyword="coffee,cafe" # 用逗号分隔多个关键词
save_dir="/Users/zee/Desktop/小红书自动化控制/images"
mkdir -p "$save_dir"
# 下载 3 张 1080x1440 的竖版图片(适合小红书 3:4 比例)
for i in 1 2 3; do
curl -L "https://source.unsplash.com/random/1080x1440/?${keyword}" \
-o "${save_dir}/unsplash_$(date +%s)_${i}.jpg"
echo "Downloaded image ${i}"
sleep 2 # 避免请求过快,确保获取不同图片
done
echo "Done! Images saved to ${save_dir}"
方式三:使用 Unsplash API(需要免费 API Key,推荐)
- 注册获取 API Key: https://unsplash.com/developers
- 使用以下代码:
# Unsplash API 下载(更精准的搜索结果)
ACCESS_KEY="your_unsplash_access_key"
keyword="coffee shop dali"
save_dir="/Users/zee/Desktop/小红书自动化控制/images"
mkdir -p "$save_dir"
# 搜索图片
response=$(curl -s -H "Authorization: Client-ID ${ACCESS_KEY}" \
"https://api.unsplash.com/search/photos?query=${keyword}&per_page=3&orientation=portrait")
# 解析并下载原图
echo "$response" | jq -r '.results[].urls.full' | while read url; do
filename="${save_dir}/unsplash_$(date +%s%N).jpg"
curl -L "$url" -o "$filename"
echo "Downloaded: $filename"
sleep 1
done
Playwright MCP 工具实现步骤:
1. mcp__Playwright__browser_navigate: url="https://unsplash.com/s/photos/coffee"
2. mcp__Playwright__browser_wait_for: time=2
3. mcp__Playwright__browser_snapshot: 获取页面结构,找到图片链接
4. mcp__Playwright__browser_click: 点击下载按钮
5. 或者直接获取图片 URL 后用 curl 下载
关键词转换规则:
根据话题/主题内容,AI 自动将中文转换为合适的英文搜索关键词。
转换原则:
- 将中文话题翻译成对应的英文词汇
- 添加相关的场景词(如 photography, aesthetic, lifestyle)
- 使用 2-4 个关键词组合,用空格分隔
- 优先使用具体、描述性的词汇
自动转换示例:
话题: "早餐吃什么" → 关键词: "breakfast food morning meal"
话题: "咖啡探店" → 关键词: "coffee shop cafe interior latte"
话题: "穿搭分享" → 关键词: "outfit fashion style ootd"
话题: "旅行攻略" → 关键词: "travel landscape adventure"
话题: "家居装饰" → 关键词: "home interior decor cozy"
图片尺寸参数:
| 参数 | 尺寸 | 适用场景 |
|---|---|---|
1080x1440 | 3:4 竖版 | 小红书推荐比例 |
1080x1080 | 1:1 方形 | 小红书方形图 |
1440x1080 | 4:3 横版 | 横版展示 |
1920x1080 | 16:9 宽屏 | 视频封面 |
完整工作流程示例:
用户: 获取最新的小红书热点,发布图文并且寻找配图
AI 执行步骤:
1. 调用 get_hot_topics 获取热门话题
→ 获取到话题: "早餐吃什么"
2. 将话题转换为英文关键词
→ "breakfast food morning delicious"
3. 调用 Unsplash 搜索并下载相关图片
→ searchAndDownload("breakfast food morning", "./images", 3, {orientation: "portrait"})
4. 根据话题生成文章内容
→ 标题、正文、推荐话题标签
5. 使用下载的图片发布到小红书
→ publish_content(title, content, images)
注意事项:
- Unsplash 图片完全免费商用,无需标注来源
- AI 根据话题内容智能生成英文关键词,无需固定映射表
- 下载间隔建议 2 秒以上,避免被限流
- 小红书推荐使用 3:4 竖版图片(orientation: portrait)
AI 内容生成提示词
评论生成提示词
生成评论时使用以下提示词,确保评论自然、真实:
你是一个小红书用户,正在浏览别人的帖子。请根据以下文章内容,写一条真实、自然的评论。
要求:
1. 像真人一样说话,口语化,不要书面语
2. 适当使用表情符号(1-3个即可,如😂🔥👍❤️✨😭)
3. 评论要和文章内容强相关,提到文章中的具体细节
4. 长度适中,1-2句话,不超过50字
5. 可以表达:共鸣、提问、分享类似经历、表示想去/想试
6. 使用口语词汇如:"绝了"、"太真实了"、"蹲一个"、"马住"、"冲了"、"爱住"、"救命"、"笑死"
7. 不要用"哈哈哈"开头,不要太夸张
8. 偶尔可以用不完整句子或省略主语
文章标题:{title}
文章内容:{content}
直接输出评论内容,不要任何解释或引号:
评论示例(好的):
- "5r美式也太香了吧 下次去大理必冲!"
- "救命这个院子就是我梦想中的样子😭"
- "蹲一个具体地址 想去打卡"
- "同款体验!上次去也是一呆一下午"
- "看完立马收藏了 下个月就去✨"
评论示例(不好的):
- "哈哈哈哈哈写得真好!" ❌ 太空洞
- "感谢博主的分享,非常有帮助!" ❌ 太正式
- "这篇文章写得很详细,我学到了很多。" ❌ 像机器人
发布文章提示词
生成小红书文章时使用以下提示词:
你是一个小红书博主,正在分享自己的真实体验。请根据主题写一篇小红书笔记。
要求:
1. 标题:不超过20字,要有吸引力,可用|分隔,适当加emoji
2. 正文:口语化、有画面感、像在和朋友聊天
3. 分段清晰,每段2-3句话,用空行分隔
4. 适当使用emoji点缀(每段1-2个),不要堆砌
5. 内容要具体:有细节、有感受、有实用信息
6. 结尾可以互动:提问或邀请评论
7. 不要在正文里写#标签(标签要单独通过话题按钮添加)
主题:{topic}
关键词:{keywords}
图片内容描述:{image_description}
输出格式:
标题:xxx
正文:xxx
推荐话题:xxx, xxx, xxx(3-5个相关话题)
文章示例(好的):
标题:大理旅居|终于找到我的咖啡乌托邦☕
正文:
在大理的第15天,每天最期待的就是去这家小店坐坐
推门进去就是阳光和咖啡香,老板是个不爱说话的大叔,但手冲技术一绝。点了杯云南日晒,果香炸裂,才18块😭
最喜欢下午四五点来,坐在院子里看苍山的云慢慢飘,时间好像停住了
有没有姐妹也在大理?求组队探店!
话题标签添加方式(重要!)
错误方式:直接在正文里写 #大理旅居 #咖啡
- 这样写只是普通文本,不会生成可点击的话题标签
正确方式:
- 写完正文后,点击输入框下方的「话题」按钮
- 搜索并选择相关话题
- 或者点击系统推荐的话题标签
Playwright 实现步骤:
1. 填写完正文后
2. 点击「话题」按钮 (button "话题")
3. 在弹出的搜索框中输入话题关键词
4. 点击搜索结果中的话题进行添加
5. 重复添加3-5个相关话题
小红书运营知识
内容限制
- 标题: 不超过 20 字
- 正文: 不超过 1000 字(不含话题标签)
- 话题标签: 建议 3-5 个
- 每日发帖上限: 约 50 篇
最佳实践
- 图文优于视频: 图文内容的流量通常比视频更好
- 话题标签: 通过话题按钮添加,不要直接写在正文里
- 热门话题: 选择浏览量高的话题能获得更多曝光
- 单设备登录: 同一账号不允许在多个网页端登录,否则会被踢出
- 发布时间: 晚上7-10点是流量高峰
风险提示
- 避免频繁操作,建议间隔发布(2-5分钟)
- 不要发布违规内容
- Cookie 过期需要重新登录
- 评论内容不要太模板化,容易被识别
使用示例
示例 1: 检查登录状态
用户: 检查小红书登录状态
AI: 使用 check_login_status 功能...
示例 2: 发布图文
用户: 帮我发布一篇小红书,标题是"今日美食分享",内容是"今天做了一道红烧肉...",图片用 /Users/zee/Pictures/food.jpg
AI: 使用 publish_content 功能...
示例 3: 搜索内容
用户: 搜索小红书上关于"旅行攻略"的内容
AI: 使用 search_feeds 功能,keyword="旅行攻略"...
示例 4: 获取帖子详情并评论
用户: 获取这个帖子的详情 feed_id=xxx, xsec_token=yyy,然后发表评论"写得真好!"
AI:
1. 使用 get_feed_detail 获取详情
2. 使用 post_comment_to_feed 发表评论
故障排除
问题 1: 无法连接到浏览器
解决方案: 确保 OpenClaw 浏览器已启动并开启 CDP 端口 18800
问题 2: 显示未登录
解决方案: 在 OpenClaw 浏览器中手动登录小红书账号
问题 3: 发布失败
解决方案:
- 检查标题是否超过 20 字
- 检查正文是否超过 1000 字
- 检查图片路径是否正确
- 检查账号是否被风控
问题 4: 获取不到 xsec_token
解决方案: xsec_token 需要从 list_feeds 或 search_feeds 的结果中获取,不能自己构造