xiaohongshu-automation by wrt820232/xiaohongshu-automation
npx skills add https://github.com/wrt820232/xiaohongshu-automation --skill xiaohongshu-automation通过 Playwright MCP 工具连接到 OpenClaw 浏览器(CDP 端口 18800),实现小红书的自动化操作,包括发布内容、搜索、获取推荐、评论等功能。
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();
| 功能 | 参数 | 说明 |
|---|
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
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 | 从图库下载无水印图片 |
步骤:
mcp__Playwright__browser_navigate 导航到 https://www.xiaohongshu.commcp__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 ? '已登录' : '未登录,请先登录' };
}
参数:
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"
参数:
title (必需): 标题,不超过 20 字content (必需): 正文内容,不超过 1000 字video (必需): 视频文件本地绝对路径 (不支持 HTTP 链接)步骤:
注意事项:
步骤:
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 };
}
参数:
keyword (必需): 搜索关键词步骤:
https://www.xiaohongshu.com/search_result?keyword={keyword}实现代码:
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 };
}
参数:
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": "评论时间"
}
]
}
参数:
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: '评论发布成功' };
}
参数:
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": "封面图"
}
]
}
参数:
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、摄影技巧、宠物日常 |
参数:
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,推荐)
# 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 自动将中文转换为合适的英文搜索关键词。
转换原则:
自动转换示例:
话题: "早餐吃什么" → 关键词: "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)
注意事项:
生成评论时使用以下提示词,确保评论自然、真实:
你是一个小红书用户,正在浏览别人的帖子。请根据以下文章内容,写一条真实、自然的评论。
要求:
1. 像真人一样说话,口语化,不要书面语
2. 适当使用表情符号(1-3个即可,如😂🔥👍❤️✨😭)
3. 评论要和文章内容强相关,提到文章中的具体细节
4. 长度适中,1-2句话,不超过50字
5. 可以表达:共鸣、提问、分享类似经历、表示想去/想试
6. 使用口语词汇如:"绝了"、"太真实了"、"蹲一个"、"马住"、"冲了"、"爱住"、"救命"、"笑死"
7. 不要用"哈哈哈"开头,不要太夸张
8. 偶尔可以用不完整句子或省略主语
文章标题:{title}
文章内容:{content}
直接输出评论内容,不要任何解释或引号:
评论示例(好的):
评论示例(不好的):
生成小红书文章时使用以下提示词:
你是一个小红书博主,正在分享自己的真实体验。请根据主题写一篇小红书笔记。
要求:
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个相关话题
用户: 检查小红书登录状态
AI: 使用 check_login_status 功能...
用户: 帮我发布一篇小红书,标题是"今日美食分享",内容是"今天做了一道红烧肉...",图片用 /Users/zee/Pictures/food.jpg
AI: 使用 publish_content 功能...
用户: 搜索小红书上关于"旅行攻略"的内容
AI: 使用 search_feeds 功能,keyword="旅行攻略"...
用户: 获取这个帖子的详情 feed_id=xxx, xsec_token=yyy,然后发表评论"写得真好!"
AI:
1. 使用 get_feed_detail 获取详情
2. 使用 post_comment_to_feed 发表评论
解决方案 : 确保 OpenClaw 浏览器已启动并开启 CDP 端口 18800
解决方案 : 在 OpenClaw 浏览器中手动登录小红书账号
解决方案 :
解决方案 : xsec_token 需要从 list_feeds 或 search_feeds 的结果中获取,不能自己构造
Weekly Installs
106
Repository
GitHub Stars
1
First Seen
Feb 20, 2026
Security Audits
Installed on
gemini-cli104
github-copilot104
codex104
opencode104
kimi-cli103
amp103
Skills CLI 使用指南:AI Agent 技能包管理器安装与管理教程
40,000 周安装