docs: 完善 README — 添加 Skill 安装指南和使用说明
- 新增 ZIP 下载安装方式(推荐),适配 OpenClaw 及所有 SKILL.md 兼容平台 - 新增自然语言使用示例,展示连贯操作能力 - 补全 CLI 命令参考(20 个子命令) - 更新项目结构和技术架构说明
Showing
1 changed file
with
161 additions
and
75 deletions
| 1 | # xiaohongshu-skills | 1 | # xiaohongshu-skills |
| 2 | 2 | ||
| 3 | -小红书自动化 Claude Code Skills,基于 Python CDP 浏览器自动化引擎。 | 3 | +小红书自动化 Skills,基于 Python CDP 浏览器自动化引擎。 |
| 4 | 4 | ||
| 5 | -为 OpenClaw 生态提供小红书操作能力,同时兼容 Claude Code Skills 格式。 | 5 | +支持 [OpenClaw](https://github.com/anthropics/openclaw) 及所有兼容 `SKILL.md` 格式的 AI Agent 平台(如 Claude Code)。 |
| 6 | 6 | ||
| 7 | ## 功能概览 | 7 | ## 功能概览 |
| 8 | 8 | ||
| 9 | -| 技能 | 说明 | 核心命令 | | 9 | +| 技能 | 说明 | 核心能力 | |
| 10 | |------|------|----------| | 10 | |------|------|----------| |
| 11 | -| **xhs-auth** | 认证管理 | `check-login`, `login`, `delete-cookies` | | ||
| 12 | -| **xhs-publish** | 内容发布 | `publish`, `publish-video` | | ||
| 13 | -| **xhs-explore** | 内容发现 | `list-feeds`, `search-feeds`, `get-feed-detail`, `user-profile` | | ||
| 14 | -| **xhs-interact** | 社交互动 | `post-comment`, `reply-comment`, `like-feed`, `favorite-feed` | | ||
| 15 | -| **xhs-content-ops** | 复合运营 | 竞品分析、热点追踪、内容创作、互动管理 | | 11 | +| **xhs-auth** | 认证管理 | 登录检查、扫码登录、多账号切换 | |
| 12 | +| **xhs-publish** | 内容发布 | 图文 / 视频 / 长文发布、定时发布、分步预览 | | ||
| 13 | +| **xhs-explore** | 内容发现 | 关键词搜索、笔记详情、用户主页、首页推荐 | | ||
| 14 | +| **xhs-interact** | 社交互动 | 评论、回复、点赞、收藏 | | ||
| 15 | +| **xhs-content-ops** | 复合运营 | 竞品分析、热点追踪、批量互动、内容创作 | | ||
| 16 | + | ||
| 17 | +支持**连贯操作** — 你可以用自然语言下达复合指令,Agent 会自动串联多个技能完成任务。例如: | ||
| 18 | + | ||
| 19 | +> "搜索刺客信条最火的图文帖子,收藏它,然后告诉我讲了什么" | ||
| 20 | + | ||
| 21 | +Agent 会自动执行:搜索 → 筛选图文 → 按点赞排序 → 收藏 → 获取详情 → 总结内容。 | ||
| 16 | 22 | ||
| 17 | ## 安装 | 23 | ## 安装 |
| 18 | 24 | ||
| 25 | +### 前置条件 | ||
| 26 | + | ||
| 27 | +- Python >= 3.11 | ||
| 28 | +- [uv](https://docs.astral.sh/uv/) 包管理器 | ||
| 29 | +- Google Chrome 浏览器 | ||
| 30 | + | ||
| 31 | +### 方法一:下载 ZIP 安装(推荐) | ||
| 32 | + | ||
| 33 | +最简单稳妥的方式,适用于 OpenClaw 及所有支持 `SKILL.md` 的 Agent 平台。 | ||
| 34 | + | ||
| 35 | +1. 在 GitHub 仓库页面点击 **Code → Download ZIP**,下载项目压缩包。 | ||
| 36 | +2. 解压到你的 Agent 的 skills 目录下: | ||
| 37 | + | ||
| 38 | +``` | ||
| 39 | +# OpenClaw 示例 | ||
| 40 | +<openclaw-project>/skills/xiaohongshu-skills/ | ||
| 41 | + | ||
| 42 | +# Claude Code 示例 | ||
| 43 | +<your-project>/.claude/skills/xiaohongshu-skills/ | ||
| 44 | +``` | ||
| 45 | + | ||
| 46 | +3. 安装 Python 依赖: | ||
| 47 | + | ||
| 48 | +```bash | ||
| 49 | +cd xiaohongshu-skills | ||
| 50 | +uv sync | ||
| 51 | +``` | ||
| 52 | + | ||
| 53 | +安装完成后,Agent 会自动识别 `SKILL.md` 并加载小红书技能。 | ||
| 54 | + | ||
| 55 | +### 方法二:Git Clone | ||
| 56 | + | ||
| 19 | ```bash | 57 | ```bash |
| 58 | +# 进入 skills 目录 | ||
| 59 | +cd <your-agent-project>/skills/ | ||
| 60 | + | ||
| 20 | # 克隆项目 | 61 | # 克隆项目 |
| 21 | -git clone https://github.com/autoclaw-cc/xiaohongshu-skills.git | 62 | +git clone https://github.com/anthropics/xiaohongshu-skills.git |
| 22 | cd xiaohongshu-skills | 63 | cd xiaohongshu-skills |
| 23 | 64 | ||
| 24 | -# 安装依赖(需要 uv) | 65 | +# 安装依赖 |
| 25 | uv sync | 66 | uv sync |
| 26 | ``` | 67 | ``` |
| 27 | 68 | ||
| 28 | -### 前置条件 | 69 | +> 其他支持 SKILL.md 格式的 Agent 框架安装方式类似 — 将本项目放入其 skills 目录即可。 |
| 29 | 70 | ||
| 30 | -- Python >= 3.11 | ||
| 31 | -- [uv](https://docs.astral.sh/uv/) 包管理器 | ||
| 32 | -- Google Chrome 浏览器 | 71 | +## 使用方式 |
| 33 | 72 | ||
| 34 | -## 快速开始 | 73 | +### 作为 AI Agent 技能使用(推荐) |
| 35 | 74 | ||
| 36 | -### 1. 启动 Chrome | 75 | +安装到 skills 目录后,直接用自然语言与 Agent 对话即可。Agent 会根据你的意图自动路由到对应技能。 |
| 76 | + | ||
| 77 | +**认证登录:** | ||
| 78 | +> "登录小红书" / "检查登录状态" | ||
| 79 | + | ||
| 80 | +**搜索浏览:** | ||
| 81 | +> "搜索关于露营的笔记" / "查看这条笔记的详情" | ||
| 82 | + | ||
| 83 | +**发布内容:** | ||
| 84 | +> "帮我发一条图文笔记,标题是…,配图是…" | ||
| 85 | + | ||
| 86 | +**社交互动:** | ||
| 87 | +> "给这条笔记点赞" / "收藏这条帖子" / "评论:写得太好了" | ||
| 88 | + | ||
| 89 | +**复合操作:** | ||
| 90 | +> "搜索竞品账号最近的爆款笔记,分析他们的选题方向" | ||
| 91 | + | ||
| 92 | +### 作为 CLI 工具使用 | ||
| 93 | + | ||
| 94 | +所有功能也可以通过命令行直接调用,输出 JSON 格式,便于脚本集成。 | ||
| 95 | + | ||
| 96 | +#### 1. 启动 Chrome | ||
| 37 | 97 | ||
| 38 | ```bash | 98 | ```bash |
| 39 | -# 有窗口模式(推荐首次登录) | 99 | +# 有窗口模式(首次登录必须) |
| 40 | python scripts/chrome_launcher.py | 100 | python scripts/chrome_launcher.py |
| 41 | 101 | ||
| 42 | # 无头模式 | 102 | # 无头模式 |
| 43 | python scripts/chrome_launcher.py --headless | 103 | python scripts/chrome_launcher.py --headless |
| 44 | ``` | 104 | ``` |
| 45 | 105 | ||
| 46 | -### 2. 登录小红书 | 106 | +#### 2. 登录 |
| 47 | 107 | ||
| 48 | ```bash | 108 | ```bash |
| 49 | -# 检查登录状态 | 109 | +# 检查登录状态(已登录时返回用户昵称和小红书号) |
| 50 | python scripts/cli.py check-login | 110 | python scripts/cli.py check-login |
| 51 | 111 | ||
| 52 | -# 登录(扫码) | 112 | +# 扫码登录 |
| 53 | python scripts/cli.py login | 113 | python scripts/cli.py login |
| 54 | ``` | 114 | ``` |
| 55 | 115 | ||
| 56 | -### 3. 搜索笔记 | 116 | +#### 3. 搜索笔记 |
| 57 | 117 | ||
| 58 | ```bash | 118 | ```bash |
| 59 | python scripts/cli.py search-feeds --keyword "关键词" | 119 | python scripts/cli.py search-feeds --keyword "关键词" |
| 60 | 120 | ||
| 61 | -# 带筛选 | 121 | +# 带筛选条件 |
| 62 | python scripts/cli.py search-feeds \ | 122 | python scripts/cli.py search-feeds \ |
| 63 | - --keyword "关键词" --sort-by 最新 --note-type 图文 | 123 | + --keyword "关键词" \ |
| 124 | + --sort-by "最多点赞" \ | ||
| 125 | + --note-type "图文" | ||
| 64 | ``` | 126 | ``` |
| 65 | 127 | ||
| 66 | -### 4. 查看笔记详情 | 128 | +#### 4. 查看笔记详情 |
| 67 | 129 | ||
| 68 | ```bash | 130 | ```bash |
| 69 | python scripts/cli.py get-feed-detail \ | 131 | python scripts/cli.py get-feed-detail \ |
| 70 | --feed-id FEED_ID --xsec-token XSEC_TOKEN | 132 | --feed-id FEED_ID --xsec-token XSEC_TOKEN |
| 71 | ``` | 133 | ``` |
| 72 | 134 | ||
| 73 | -### 5. 发布内容 | 135 | +#### 5. 发布内容 |
| 74 | 136 | ||
| 75 | ```bash | 137 | ```bash |
| 76 | -# 图文发布 | ||
| 77 | -python scripts/cli.py publish \ | 138 | +# 图文发布(分步:填写 → 预览 → 确认发布) |
| 139 | +python scripts/cli.py fill-publish \ | ||
| 78 | --title-file title.txt \ | 140 | --title-file title.txt \ |
| 79 | --content-file content.txt \ | 141 | --content-file content.txt \ |
| 80 | --images "/abs/path/pic1.jpg" "/abs/path/pic2.jpg" | 142 | --images "/abs/path/pic1.jpg" "/abs/path/pic2.jpg" |
| 81 | 143 | ||
| 144 | +# 用户在浏览器中预览确认后 | ||
| 145 | +python scripts/cli.py click-publish | ||
| 146 | + | ||
| 147 | +# 或保存为草稿 | ||
| 148 | +python scripts/cli.py save-draft | ||
| 149 | + | ||
| 82 | # 视频发布 | 150 | # 视频发布 |
| 83 | python scripts/cli.py publish-video \ | 151 | python scripts/cli.py publish-video \ |
| 84 | --title-file title.txt \ | 152 | --title-file title.txt \ |
| 85 | --content-file content.txt \ | 153 | --content-file content.txt \ |
| 86 | --video "/abs/path/video.mp4" | 154 | --video "/abs/path/video.mp4" |
| 155 | + | ||
| 156 | +# 长文发布 | ||
| 157 | +python scripts/cli.py long-article \ | ||
| 158 | + --title-file title.txt \ | ||
| 159 | + --content-file content.txt | ||
| 87 | ``` | 160 | ``` |
| 88 | 161 | ||
| 89 | -### 6. 社交互动 | 162 | +#### 6. 社交互动 |
| 90 | 163 | ||
| 91 | ```bash | 164 | ```bash |
| 92 | -# 发表评论 | 165 | +# 评论 |
| 93 | python scripts/cli.py post-comment \ | 166 | python scripts/cli.py post-comment \ |
| 94 | - --feed-id FEED_ID \ | ||
| 95 | - --xsec-token XSEC_TOKEN \ | 167 | + --feed-id FEED_ID --xsec-token XSEC_TOKEN \ |
| 96 | --content "评论内容" | 168 | --content "评论内容" |
| 97 | 169 | ||
| 98 | # 点赞 | 170 | # 点赞 |
| @@ -106,8 +178,6 @@ python scripts/cli.py favorite-feed \ | @@ -106,8 +178,6 @@ python scripts/cli.py favorite-feed \ | ||
| 106 | 178 | ||
| 107 | ## CLI 命令参考 | 179 | ## CLI 命令参考 |
| 108 | 180 | ||
| 109 | -所有命令通过 `scripts/cli.py` 统一入口调用,输出 JSON 格式。 | ||
| 110 | - | ||
| 111 | 全局选项: | 181 | 全局选项: |
| 112 | - `--host HOST` — Chrome 调试主机(默认 127.0.0.1) | 182 | - `--host HOST` — Chrome 调试主机(默认 127.0.0.1) |
| 113 | - `--port PORT` — Chrome 调试端口(默认 9222) | 183 | - `--port PORT` — Chrome 调试端口(默认 9222) |
| @@ -115,59 +185,67 @@ python scripts/cli.py favorite-feed \ | @@ -115,59 +185,67 @@ python scripts/cli.py favorite-feed \ | ||
| 115 | 185 | ||
| 116 | | 子命令 | 说明 | | 186 | | 子命令 | 说明 | |
| 117 | |--------|------| | 187 | |--------|------| |
| 118 | -| `check-login` | 检查登录状态 | | ||
| 119 | -| `login` | 获取登录二维码,等待扫码 | | ||
| 120 | -| `delete-cookies` | 清除 cookies | | 188 | +| `check-login` | 检查登录状态,返回用户昵称和小红书号 | |
| 189 | +| `login` | 获取登录二维码,等待扫码,登录后返回用户信息 | | ||
| 190 | +| `delete-cookies` | 清除 cookies(退出/切换账号) | | ||
| 121 | | `list-feeds` | 获取首页推荐 Feed | | 191 | | `list-feeds` | 获取首页推荐 Feed | |
| 122 | -| `search-feeds` | 关键词搜索笔记 | | ||
| 123 | -| `get-feed-detail` | 获取笔记详情和评论 | | ||
| 124 | -| `user-profile` | 获取用户主页信息 | | 192 | +| `search-feeds` | 关键词搜索笔记(支持排序/类型/时间/范围/位置筛选) | |
| 193 | +| `get-feed-detail` | 获取笔记完整内容和评论 | | ||
| 194 | +| `user-profile` | 获取用户主页信息和帖子列表 | | ||
| 125 | | `post-comment` | 对笔记发表评论 | | 195 | | `post-comment` | 对笔记发表评论 | |
| 126 | | `reply-comment` | 回复指定评论 | | 196 | | `reply-comment` | 回复指定评论 | |
| 127 | | `like-feed` | 点赞 / 取消点赞 | | 197 | | `like-feed` | 点赞 / 取消点赞 | |
| 128 | | `favorite-feed` | 收藏 / 取消收藏 | | 198 | | `favorite-feed` | 收藏 / 取消收藏 | |
| 129 | -| `publish` | 发布图文内容 | | ||
| 130 | -| `publish-video` | 发布视频内容 | | ||
| 131 | - | ||
| 132 | -退出码:0=成功,1=未登录,2=错误 | 199 | +| `publish` | 一步发布图文 | |
| 200 | +| `publish-video` | 一步发布视频 | | ||
| 201 | +| `fill-publish` | 填写图文表单(不发布,供预览) | | ||
| 202 | +| `fill-publish-video` | 填写视频表单(不发布,供预览) | | ||
| 203 | +| `click-publish` | 确认发布(点击发布按钮) | | ||
| 204 | +| `save-draft` | 保存为草稿 | | ||
| 205 | +| `long-article` | 长文模式:填写 + 一键排版 | | ||
| 206 | +| `select-template` | 选择长文排版模板 | | ||
| 207 | +| `next-step` | 长文下一步 + 填写描述 | | ||
| 208 | + | ||
| 209 | +退出码:`0` 成功 · `1` 未登录 · `2` 错误 | ||
| 133 | 210 | ||
| 134 | ## 项目结构 | 211 | ## 项目结构 |
| 135 | 212 | ||
| 136 | ``` | 213 | ``` |
| 137 | xiaohongshu-skills/ | 214 | xiaohongshu-skills/ |
| 138 | ├── scripts/ # Python CDP 自动化引擎 | 215 | ├── scripts/ # Python CDP 自动化引擎 |
| 139 | -│ ├── xhs/ # 核心自动化包(模块化) | 216 | +│ ├── xhs/ # 核心自动化包 |
| 140 | │ │ ├── cdp.py # CDP WebSocket 客户端 | 217 | │ │ ├── cdp.py # CDP WebSocket 客户端 |
| 141 | │ │ ├── stealth.py # 反检测保护 | 218 | │ │ ├── stealth.py # 反检测保护 |
| 142 | -│ │ ├── cookies.py # Cookie 持久化 | ||
| 143 | -│ │ ├── types.py # 数据类型 | ||
| 144 | -│ │ ├── errors.py # 异常体系 | ||
| 145 | -│ │ ├── selectors.py # CSS 选择器 | ||
| 146 | -│ │ ├── urls.py # URL 常量 | ||
| 147 | -│ │ ├── human.py # 人类行为模拟 | ||
| 148 | -│ │ ├── login.py # 登录 | 219 | +│ │ ├── selectors.py # CSS 选择器(集中管理,改版时只改此文件) |
| 220 | +│ │ ├── login.py # 登录 + 用户信息获取 | ||
| 149 | │ │ ├── feeds.py # 首页 Feed | 221 | │ │ ├── feeds.py # 首页 Feed |
| 150 | -│ │ ├── search.py # 搜索 | ||
| 151 | -│ │ ├── feed_detail.py # 笔记详情 | 222 | +│ │ ├── search.py # 搜索 + 筛选 |
| 223 | +│ │ ├── feed_detail.py # 笔记详情 + 评论加载 | ||
| 152 | │ │ ├── user_profile.py # 用户主页 | 224 | │ │ ├── user_profile.py # 用户主页 |
| 153 | -│ │ ├── comment.py # 评论 | ||
| 154 | -│ │ ├── like_favorite.py # 点赞/收藏 | 225 | +│ │ ├── comment.py # 评论、回复 |
| 226 | +│ │ ├── like_favorite.py # 点赞、收藏 | ||
| 155 | │ │ ├── publish.py # 图文发布 | 227 | │ │ ├── publish.py # 图文发布 |
| 156 | -│ │ └── publish_video.py # 视频发布 | ||
| 157 | -│ ├── cli.py # 统一 CLI(13 个子命令) | 228 | +│ │ ├── publish_video.py # 视频发布 |
| 229 | +│ │ ├── publish_long_article.py # 长文发布 | ||
| 230 | +│ │ ├── types.py # 数据类型 | ||
| 231 | +│ │ ├── errors.py # 异常体系 | ||
| 232 | +│ │ ├── urls.py # URL 常量 | ||
| 233 | +│ │ ├── cookies.py # Cookie 持久化 | ||
| 234 | +│ │ └── human.py # 人类行为模拟 | ||
| 235 | +│ ├── cli.py # 统一 CLI 入口(20 个子命令) | ||
| 158 | │ ├── chrome_launcher.py # Chrome 进程管理 | 236 | │ ├── chrome_launcher.py # Chrome 进程管理 |
| 159 | │ ├── account_manager.py # 多账号管理 | 237 | │ ├── account_manager.py # 多账号管理 |
| 160 | -│ ├── image_downloader.py # 媒体下载 | ||
| 161 | -│ ├── title_utils.py # 标题长度计算 | 238 | +│ ├── image_downloader.py # 媒体下载(SHA256 缓存) |
| 239 | +│ ├── title_utils.py # UTF-16 标题长度计算 | ||
| 162 | │ ├── run_lock.py # 单实例锁 | 240 | │ ├── run_lock.py # 单实例锁 |
| 163 | │ └── publish_pipeline.py # 发布编排器 | 241 | │ └── publish_pipeline.py # 发布编排器 |
| 164 | ├── skills/ # Claude Code Skills 定义 | 242 | ├── skills/ # Claude Code Skills 定义 |
| 165 | -│ ├── xhs-auth/SKILL.md # 认证管理 | ||
| 166 | -│ ├── xhs-publish/SKILL.md # 内容发布 | ||
| 167 | -│ ├── xhs-explore/SKILL.md # 内容发现 | ||
| 168 | -│ ├── xhs-interact/SKILL.md # 社交互动 | ||
| 169 | -│ └── xhs-content-ops/SKILL.md # 复合运营 | ||
| 170 | -├── SKILL.md # 统一入口 | 243 | +│ ├── xhs-auth/SKILL.md |
| 244 | +│ ├── xhs-publish/SKILL.md | ||
| 245 | +│ ├── xhs-explore/SKILL.md | ||
| 246 | +│ ├── xhs-interact/SKILL.md | ||
| 247 | +│ └── xhs-content-ops/SKILL.md | ||
| 248 | +├── SKILL.md # 技能统一入口(路由到子技能) | ||
| 171 | ├── CLAUDE.md # 项目开发指南 | 249 | ├── CLAUDE.md # 项目开发指南 |
| 172 | ├── pyproject.toml # uv 项目配置 | 250 | ├── pyproject.toml # uv 项目配置 |
| 173 | └── README.md | 251 | └── README.md |
| @@ -175,18 +253,22 @@ xiaohongshu-skills/ | @@ -175,18 +253,22 @@ xiaohongshu-skills/ | ||
| 175 | 253 | ||
| 176 | ## 技术架构 | 254 | ## 技术架构 |
| 177 | 255 | ||
| 178 | -### 双层结构 | 256 | +### 双层设计 |
| 179 | 257 | ||
| 180 | -1. **scripts/ — Python CDP 引擎** | ||
| 181 | - - 基于 xiaohongshu-mcp Go 源码从零重写 | ||
| 182 | - - 通过 Chrome DevTools Protocol (CDP) 直接控制浏览器 | ||
| 183 | - - 数据提取使用 `window.__INITIAL_STATE__` 模式 | ||
| 184 | - - 内置反检测保护(stealth flags + JS 注入) | ||
| 185 | - - JSON 结构化输出 | 258 | +``` |
| 259 | +用户 ──→ AI Agent ──→ SKILL.md(意图路由)──→ CLI ──→ CDP 引擎 ──→ Chrome ──→ 小红书 | ||
| 260 | +``` | ||
| 261 | + | ||
| 262 | +1. **Skills 层**(`skills/` + `SKILL.md`)— AI Agent 的能力定义,描述何时触发、如何调用、如何处理失败。Agent 读取 SKILL.md 后自动获得小红书操作能力。 | ||
| 263 | + | ||
| 264 | +2. **引擎层**(`scripts/`)— Python CDP 自动化引擎,通过 Chrome DevTools Protocol 直接控制浏览器。内置反检测保护、人类行为模拟、JSON 结构化输出。 | ||
| 186 | 265 | ||
| 187 | -2. **skills/ — Claude Code Skills 定义** | ||
| 188 | - - SKILL.md 格式,指导 AI agent 如何调用 scripts/ | ||
| 189 | - - 包含输入判断、约束规则、工作流程、失败处理 | 266 | +### 关键设计 |
| 267 | + | ||
| 268 | +- **数据提取**:通过 `window.__INITIAL_STATE__` 读取页面数据,与小红书前端框架对齐 | ||
| 269 | +- **反检测**:Stealth JS 注入 + CDP 真实输入事件(`isTrusted=true`)+ 随机延迟 | ||
| 270 | +- **选择器集中管理**:所有 CSS 选择器在 `xhs/selectors.py` 统一维护,小红书改版时只需改一个文件 | ||
| 271 | +- **分步发布**:fill → 预览 → confirm 三步流程,确保用户始终掌控发布内容 | ||
| 190 | 272 | ||
| 191 | ## 开发 | 273 | ## 开发 |
| 192 | 274 | ||
| @@ -196,3 +278,7 @@ uv run ruff check . # Lint 检查 | @@ -196,3 +278,7 @@ uv run ruff check . # Lint 检查 | ||
| 196 | uv run ruff format . # 代码格式化 | 278 | uv run ruff format . # 代码格式化 |
| 197 | uv run pytest # 运行测试 | 279 | uv run pytest # 运行测试 |
| 198 | ``` | 280 | ``` |
| 281 | + | ||
| 282 | +## License | ||
| 283 | + | ||
| 284 | +MIT |
-
Please register or login to post a comment