7.6 KiB
用户主页资料与关注接口:调研日志、方案和安装说明
目标与边界
实现传入用户主页 URL,读取目标资料并关注。根据 AGENTS.md,页面操作仅用于调研,产物不以导航和点击按钮作为实现。最终脚本为 src/follow_user.py,复用 src/get_current_user.py 的登录态检查函数,可直接命令行运行。
脚本在已有已登录抖音标签页内发起接口请求,不操作关注按钮,也不必打开目标主页。仍依赖浏览器运行时和登录态,并非脱离浏览器的纯 HTTP 客户端。没有复制 Cookie、固化账号/标签 ID,或自行实现签名算法。仅支持串行运行;browser-harness 当前标签状态共享,不要并发切换标签或账号。
调研过程与证据
- 查看现有脚本:当前用户通过
/aweme/v1/web/user/profile/self/获取;沿用 browser-harness 和 Python 解析原始响应的模式,避免 JS 数值解析引起大整数 ID 精度损失。 - 首个目标主页“肉宝儿”已登录可访问,无障碍树显示“相互关注”。资料接口返回
follow_status=2。未点击按钮、未取消关注。 - 最初在调研页安装过只读 XHR 捕获器,但由于已关注,没有触发关注请求,不能把它算作按钮请求抓包证据。
- 搜索页面
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。 - 模块
916858同时检查status_code和follow_status,说明不能仅凭 HTTP 200 判定成功。页面还存在针对关注接口的安全 SDK 配置,因此选择沿用已加载页面环境,而不是导出一次性签名重放。 - 用户选择更换未关注的测试对象,并提供第二个主页。首次导航采用
new_tab(),登录态检查成功;新主页“诗和远方”无障碍树显示“关注”。 - 编写最小 XHR 接口版本;先执行
--check,返回follow_status=0。 - 通过 Python 脚本实际提交一次
type=1,响应通过检查,再读取资料确认follow_status=1。无需点击按钮,即已完成真实新增关注。 - 再次运行脚本返回
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 跳过;未实测风控、私密账号审批、失效登录态或账号并发切换。