对标账号采集
把「小红书博主主页链接」变成对标账号表里的一行。
安装方法
- 先问使用者用的是什么 AI 工具,选项按这个顺序列:1. WorkBuddy 2. Claude Code 3. Codex 4. 其他(用户直接说工具名),回答记作 X
- 只安装给 X,不安装或链接其他任何工具:
-
X 是 WorkBuddy:把本技能下载后放进
~/.workbuddy/skills/(WorkBuddy 的技能目录;skills CLI 不支持 WorkBuddy,由你直接放置) -
X 是其他工具:
npx -y --registry=https://registry.npmmirror.com skills add https://modelscope.cn/skills/sunny31221/account-collect-buheliwa -a X -y(不带
-a会安装给本机所有检测到的工具,禁止;--registry为 npmmirror 镜像,保证国内不翻墙也能拉到 CLI) -
X 不在上述范围时,按该工具自身的技能机制安装,装完确认 X 能识别本技能即可
-
- 装完后询问是否现在使用本技能
依赖什么
| 依赖 | 作用 | 装不上怎么办 |
|---|---|---|
| opencli | 驱动本机已登录的 Chrome 打开博主主页取数据 | npm i -g @jackwener/opencli;装不上就跳过并报原因 |
| Chrome + opencli 浏览器扩展 | 真浏览器登录态,风控比脚本直连低 | 按 opencli 提示装扩展 |
| 小红书登录态 | 未登录看不到完整主页数据 | 提示使用者本人登录小红书,不要代替登录 |
去哪装(推荐降级链:国际源失败 → 国内镜像):
npm i -g @jackwener/opencli
npm i -g @jackwener/opencli --registry=https://registry.npmmirror.com # 国内镜像
验证是否就绪:
opencli xiaohongshu whoami # 能返回当前登录的小红书账号就说明通了
触发场景
- "采集对标账号" / "把这个博主加进对标账号" / "对标账号入库"
- "采集这个主页" + 一条
xiaohongshu.com/user/profile/...链接 - 采集编排器在关卡前发现
对标账号链接.md里有未处理的user/profile链接时提醒
不适用:
- 采的是笔记内容(
xiaohongshu.com/explore/...)→ 那是内容采集那条线的活,本技能只处理user/profile主页链接 - 平台不是小红书 → 本技能目前只支持小红书;其他平台提示暂无
少花调用次数
有些链路按请求次数计费(第三方兼容接口的每日额度多是这样),不按 token。一次模型回复里发多个工具调用,只算 1 次请求;串行一次发一个,就一次一个数。同一个任务排得好坏,能差三倍次数。
- 能串的串成一条命令:
python3 a.py && python3 b.py,中间结果用$(...)接住。互不依赖的命令别分成两次 Bash。 - 无依赖的一轮发完:抓取、下载、读文件这些互不依赖的动作,放在同一条回复里一起发。
- 脚本能批量就别逐条调:先看脚本的
--help,支持一次处理多条或整个目录的,就一次跑完。 - 输出要过滤:脚本输出配
head/grep再看。全量输出进上下文既拖速度,也容易把关键信息淹掉。
工作流
第 1 步:取链接
两种来源,先看对话框,没有再看文件:
- 使用者直接给了链接 → 用给的(一条或几条)
- 说"采集对标账号"没给链接 → 读
规律研究/对标账号/对标账号链接.md,取里面所有user/profile链接
只挑主页链接:.../user/profile/... 是要处理的;.../explore/... 是笔记链接,跳过并在报告里单独列出"这几条是笔记链接,不归本技能管"。
第 2 步:逐条采集
对每条链接跑两步(<session> 自己起个名字,比如 xhs;同一个会话复用,不用每次重建):
# 1) 打开博主主页
opencli browser <session> open "<主页链接>"
# 2) 提取主页字段
opencli browser <session> eval "(() => { const s=window.__INITIAL_STATE__; const r=s&&s.user&&s.user.userPageData; if(!r) return 'NO_DATA'; const v=r._value||r.value||r._rawValue; if(!v||!v.basicInfo) return 'NO_PROFILE'; const b=v.basicInfo; const it={}; (v.interactions||[]).forEach(x=>it[x.name]=x.count); return JSON.stringify({nickname:b.nickname, redId:b.redId, gender:b.gender, ip:b.ipLocation, desc:b.desc||'', fans:it['粉丝'], likes:it['获赞与收藏'], follows:it['关注']}); })()"
要点:
- 返回
NO_DATA/NO_PROFILE→ 多半是没登录或页面没加载完,等两秒重跑一次;仍不行就提示使用者本人登录小红书 - 昵称、简介里的换行要保留(表格里用
<br>表示换行) - 拿不到的字段留空,不猜、不估
第 3 步:算转粉率、格式化数字
- 转粉率 = 粉丝数 ÷ 获赞与收藏 × 100%,保留一位小数(例:228102 ÷ 1364387 = 16.7%)
- 粉丝数 / 获赞与收藏:过万写成
X.X万(236666 → 23.7万;1433365 → 143.3万);不到万写原数
第 4 步:写入对标账号表
目标文件:规律研究/对标账号/小红书对标博主.md
表格列(照现有表头,不要改):
| 账号名称 | 粉丝数 | 转粉率 | 博主简介 | 获赞与收藏 | 博主链接 | 状态 | 小红书号 | 博主ID | |---|---|---|---|---|---|---|---|---|
三条规则:
- 去重:按博主ID 比对,已在表里的更新原有那一行(粉丝数、获赞与收藏会涨),不新增行
- 排序:1万–5万粉丝的排前面,其余排后面;两组内部都按转粉率从高到低
- 状态列:新采集的留空;使用者说这条账号已经采过内容了,才写「已入库」
第 5 步:回写链接文档
如果链接是从 对标账号链接.md 读的,采完在那条链接后面标上「已入库 ✓ <日期>」。已经是标记状态的不重复处理。
第 6 步:报告
一行汇总:本次处理了几条、新增几行、更新几行、哪几条不是主页链接被跳过。
字段对应关系
| 表格列 | 从哪来 |
|---|---|
| 账号名称 | nickname |
| 粉丝数 | interactions 里 粉丝 的 count |
| 转粉率 | 算的:粉丝数 ÷ 获赞与收藏 |
| 博主简介 | desc(换行转 <br>) |
| 获赞与收藏 | interactions 里 获赞与收藏 的 count |
| 博主链接 | 使用者给的那条原始链接 |
| 状态 | 默认空;已采过内容才写「已入库」 |
| 小红书号 | redId |
| 博主ID | 主页链接 user/profile/ 后面那串(basicInfo.userId 也可) |
约定(每条带来由与适用范围)
-
只用使用者本人的登录态:走本机已登录的 Chrome,不代替使用者登录、不绕过风控 适用与边界:管数据获取这一段。不适用:使用者自己复制粘贴过来的主页数据——那种直接入表,不走 opencli。
-
拿不到就留空:字段取不到不猜不估 适用与边界:没有例外。宁可空着让人一眼看出缺了,也不填一个看着像真的的假数。
-
不改表头、不重排他人手工加的备注 适用与边界:管
小红书对标博主.md的表格结构。不适用:使用者明确要求调整表格格式时,按他说的改。 -
只处理主页链接:笔记链接不碰 适用与边界:管输入识别。不适用:使用者明确说"这条笔记里的博主也要加进来"——那就先解析出博主,再按主页处理。
不做什么
- 不采笔记内容:笔记抓取归内容采集那条线(
xiaohongshu-collect-buheliwa),本技能只管账号主页 - 不判断账号值不值得对标:方向合不合、粉丝量够不够,那是使用者的判断,本技能只负责把数据填准
- 不重写已有表格:只增行、只更新同 ID 的行,不动别人手工写的内容
- 不主动批量跑全表:使用者没说就只处理他给的那几条;要批量处理
对标账号链接.md里的全部链接,等他明确说
Scan to join WeChat group