抖音「我的关注」全量提取(公开版)
提取抖音账号关注的全部博主(名字 + sec_uid),为批量下载做准备。
⚠️ 隐私说明:本技能不含任何用户的登录凭据。流程需要用户自行登录抖音网页版,登录成功后告知 AI 继续。
前置条件
- 本机安装了 Chrome 浏览器
- 用户愿意自行扫码登录抖音网页版(本技能不接触账号密码)
执行流程
Step 0 — 启动浏览器并让用户登录(关键)
# 1. 用独立调试端口启动 Chrome(用户自己的浏览器,或独立实例均可)
chrome.exe --remote-debugging-port=9222 --user-data-dir="<任意独立目录>" --no-first-run about:blank
# 注意:Windows 136+ 默认 profile 不支持调试端口,必须用 --user-data-dir 指定独立目录
# 2. 打开抖音网页版
curl -s http://localhost:9222/json # 确认 Chrome 调试端口就绪
# 导航到 https://www.douyin.com/
3. 提示用户自行登录:弹窗/消息告诉用户「请在打开的 Chrome 窗口里登录你的抖音账号(扫码即可)」,然后**等待用户反馈「已登录」**再继续。绝不代填账号密码,也不读取用户登录态。
Step 1 — 导航到我的主页
node scripts/extract_following.mjs <chromePort默认9222>
脚本自动完成(前提:用户已登录):
Step 2 — 提取关注列表
脚本内部流程:
- 导航 self 主页(
/user/self),等 8s(需已登录,页面显示"关注 N") - 召唤弹窗:找
P标签文本/^关注\d+$/→ 取__reactProps$.onClick直接调用(弹窗是异步渲染,等 4-5s) - 滚动加载:找弹窗(含"关注 ("+"已关注",矩形 300×300)→ 找内部最大滚动容器(scrollHeight>clientHeight+200)→ 循环 8 轮
scrollTop=scrollHeight+ 触发 scroll 事件 + 等 2s,直到高度连续 2 轮不增长(约 6 轮:4376→14699) - 提取:遍历弹窗内
a[href*="/user/MS4"]按 sec_uid 去重(权威数量 = 页面标注数)→ 名字三源补全:①头像img[alt*="头像"]的 alt 去"头像"后缀 ②a 文本 ③祖先卡片清理文本(去"已关注/移除/确认/X个作品未看") - 输出:
following_extract_<时间戳>.json([{name, sec}])+ 控制台打印数量
输出数据格式
[
{ "name": "用户A", "sec": "MS4wLjABAAAASxtOYwnx06k96..." },
{ "name": "用户B", "sec": "MS4wLjABAAAA9GJjWKRac0j4ZcE-..." }
]
精度说明(2026-08-26 实测验证)
- 弹窗内
img[alt*="头像"]数量 =a[href*="/user/MS4"]去重数量 = 页面标注关注数 - 以 sec_uid 去重为权威,不依赖"已关注"按钮找卡片(按钮有变体/缺失会导致漏项)
- 两次独立跑结果完全一致(差异 0,无未命名)
后续对接
提取的 sec 列表可配合其他工具做批量数据抓取或下载(进主页拿粉丝/作品等)。
踩坑记录(技术通用)
- "关注 N" 数字不可点:self 主页 P 标签
width=0不可见,hover/click/真实鼠标全无效 → 直接调用 React fiber 的__reactProps$.onClick召唤弹窗。 - React onClick 调用法:
const rk = Object.keys(el).find(k => k.startsWith('__reactProps')); el[rk].onClick({preventDefault(){},stopPropagation(){},target:el,currentTarget:el}),弹窗异步渲染需等 4-5s。 - 滚动必须带等待:设置
scrollTop后虚拟列表需要时间懒加载,立即读 scrollHeight 不变。必须循环 [设置→等 2s→重读],连续 2 轮不增长才算到底。 - 弹窗滚动容器 class 随机(
.aQVXLJB7等),必须用"弹窗内最大可滚动容器"动态定位,不能硬编码 class。 - 提取别依赖"已关注"按钮:按钮文本可能变体/缺失,导致漏项。以
a[href*="/user/MS4"]的 sec 去重为权威,名字从img[alt*="头像"]alt 取(去"头像"后缀),三源补全保证名字非空。 - 虚拟列表边界:如果首次提取数量低于标注数,把滚动条拉回顶部再拉到底一次(两轮全遍历)。
Scan to join WeChat group