Files
douyin-pc/docs/2026-09-06-00-13-follow-user.md
T
2026-09-06 01:00:17 +08:00

7.6 KiB
Raw Blame History

用户主页资料与关注接口:调研日志、方案和安装说明

目标与边界

实现传入用户主页 URL,读取目标资料并关注。根据 AGENTS.md,页面操作仅用于调研,产物不以导航和点击按钮作为实现。最终脚本为 src/follow_user.py,复用 src/get_current_user.py 的登录态检查函数,可直接命令行运行。

脚本在已有已登录抖音标签页内发起接口请求,不操作关注按钮,也不必打开目标主页。仍依赖浏览器运行时和登录态,并非脱离浏览器的纯 HTTP 客户端。没有复制 Cookie、固化账号/标签 ID,或自行实现签名算法。仅支持串行运行;browser-harness 当前标签状态共享,不要并发切换标签或账号。

调研过程与证据

  1. 查看现有脚本:当前用户通过 /aweme/v1/web/user/profile/self/ 获取;沿用 browser-harness 和 Python 解析原始响应的模式,避免 JS 数值解析引起大整数 ID 精度损失。
  2. 首个目标主页“肉宝儿”已登录可访问,无障碍树显示“相互关注”。资料接口返回 follow_status=2。未点击按钮、未取消关注。
  3. 最初在调研页安装过只读 XHR 捕获器,但由于已关注,没有触发关注请求,不能把它算作按钮请求抓包证据。
  4. 搜索页面 window.webpackChunkdouyin_web 已加载模块中的 /aweme/v1/web/commit/follow/user/ 字符串。模块 651926 中函数 x 使用 {user_id: e, type: i} 调用该接口,默认 type=1;枚举明确 follow=1, unfollow=0。模块 599090 的导出 v_ 对应 POST,并把对象编码为 URL 表单,Content-Type 为 application/x-www-form-urlencoded; charset=UTF-8
  5. 模块 916858 同时检查 status_codefollow_status,说明不能仅凭 HTTP 200 判定成功。页面还存在针对关注接口的安全 SDK 配置,因此选择沿用已加载页面环境,而不是导出一次性签名重放。
  6. 用户选择更换未关注的测试对象,并提供第二个主页。首次导航采用 new_tab(),登录态检查成功;新主页“诗和远方”无障碍树显示“关注”。
  7. 编写最小 XHR 接口版本;先执行 --check,返回 follow_status=0
  8. 通过 Python 脚本实际提交一次 type=1,响应通过检查,再读取资料确认 follow_status=1。无需点击按钮,即已完成真实新增关注。
  9. 再次运行脚本返回 already_following;原目标“肉宝儿”仍为 follow_status=2,同样跳过,不发送关注 POST。

模块 ID 仅是本次调研定位信息,会随网站发布变化;最终脚本不使用模块 ID,不调用内部 webpack 导出函数。此次只证明当前已登录页面中的最小请求可用,没有证明脱离浏览器时哪些签名或安全字段必需。

已确认接口

公共查询参数:

device_platform=webapp&aid=6383&channel=channel_pc_web

当前登录用户

GET /aweme/v1/web/user/profile/self/?device_platform=webapp&aid=6383

复用既有 get_user_from_browser(),错误或无有效 uid 即停止。不会自动登录。

读取用户主页资料

GET /aweme/v1/web/user/profile/other/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id=<URL中的sec_uid>

检查 user.sec_uid 与输入一致,user.uid 为数字字符串,再读取 follow_status

状态 本次处理
0 未关注;非 --check 时允许关注
1 已关注,跳过
2 相互关注,跳过
其他或缺失 不推测含义,停止

关注

POST /aweme/v1/web/commit/follow/user/?device_platform=webapp&aid=6383&channel=channel_pc_web
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

user_id=<资料接口返回的uid>&type=1

注意表单使用数字字符串 uid,而不是 URL 中的 sec_uid。脚本没有取消关注功能,不发送 type=0

成功条件:HTTP 200、status_code=0、响应 follow_status 为 1 或 2,并且重新读取主页资料得到相同 uid 及已关注状态。超时、网络错误、风控或回查不一致都报错,不自动重发写请求;此时应先 --check 查询服务器实际状态。私密账号待审批等状态尚未实测,遇到未知状态会停止,不冒充成功。

实测结果

本次用户授权的新目标:

https://www.douyin.com/user/MS4wLjABAAAAzlI7zJsPpgNcSn4SxJ5wqqVRDpx5FEx3Dr8qQcyZ1a4ug19S9Zm_MaY22nXdI6lM?from_tab_name=main

实际关注命令输出:

{
  "action": "followed",
  "uid": "2480100375004072",
  "sec_uid": "MS4wLjABAAAAzlI7zJsPpgNcSn4SxJ5wqqVRDpx5FEx3Dr8qQcyZ1a4ug19S9Zm_MaY22nXdI6lM",
  "nickname": "诗和远方",
  "follow_status": 1
}

随后重复运行:action=already_following, follow_status=1。 原目标“肉宝儿”:action=already_following, follow_status=2,关系未变。

空白环境安装

需求:Chrome/Chromium、项目 Python 3.10+、browser-harness CLI。项目脚本只使用标准库,保留 follow_user.py 和同目录 get_current_user.py 即可;无需 requests、Playwright 或签名包。

安装 browser-harness(官方推荐使用 Python 3.12 的隔离工具环境):

# 如尚未安装 uv;也可通过系统包管理器安装 uv
python3 -m pip install --user uv
# 确保用户级命令目录在 PATH 中
export PATH="$HOME/.local/bin:$PATH"
uv tool install --python 3.12 --upgrade --force browser-harness
uv tool update-shell

如系统禁止用户 pip 安装,改用系统包管理器安装 uv,或参照 https://docs.astral.sh/uv/getting-started/installation/ 。重新打开终端后检查 browser-harness --help

启用 Chrome 的远程调试,按现有环境连接 localhost:9222。需要新建独立调试环境时,Linux 示例:

google-chrome --remote-debugging-port=9222 \
  --user-data-dir="$HOME/.local/share/douyin-debug-profile"

该新配置目录没有原账号登录态,必须由用户自行访问抖音并登录。已有可用 CDP 浏览器时不要另建配置或启动第二个浏览器。也可按当前 Chrome 支持情况在 chrome://inspect/#remote-debugging 手动启用调试。CDP 只开放给本机,不要暴露到公网。

export BU_CDP_URL=http://localhost:9222
browser-harness --doctor
browser-harness <<'PY'
print(page_info())
PY

脚本选择已有 www.douyin.com 标签页,不自动创建登录页。登录态失效时停止,由用户手动登录。安装参考:https://github.com/browser-use/browser-harness/blob/main/install.md

运行说明

在项目根目录:

# URL 替换为用户明确允许关注的主页,首次建议仅查状态
python3 src/follow_user.py 'https://www.douyin.com/user/<sec_uid>' --check

# 确认对象后关注;已关注会跳过
python3 src/follow_user.py 'https://www.douyin.com/user/<sec_uid>'

# 离线回归测试,不连浏览器,不产生真实关注
python3 -m unittest discover -s src -p 'test_follow_user.py'

URL 必须为 https://www.douyin.com/user/<sec_uid>;允许原有查询串,不支持分享短链接和 /user/self。当前账号不能关注自己。输出 JSON 到 stdout,不把资料或凭据写入文件;退出码 0 表示成功查询/关注/跳过,1 表示运行失败,2 表示命令行用法错误。

离线回归 4 项测试全部通过,覆盖 URL 边界、首次关注与回查、只读查询、已关注/相互关注跳过、用户身份不匹配、自己、无效登录态、未知关注状态和不确定结果不重试。真实验证覆盖 0→1 及 1/2 跳过;未实测风控、私密账号审批、失效登录态或账号并发切换。