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

75 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 直接传 UID 关注:调研、实现及实测
## 结论与变更
`src/follow_user.py` 改为只接收目标数字 UID,不再要求或解析用户主页链接。无需打开目标主页,仍通过已有抖音标签页的登录态与运行环境调用接口,不是脱离浏览器的 HTTP 客户端。
旧文档 `2026-09-06-00-13-follow-user.md` 中传主页链接的命令属于历史版本,现以本文命令为准。依赖与安装方式不变。
## 调研日志
1. 检查调用关系:生产代码中只有脚本 main 调用 follow_user;同步更新离线测试。
2. 使用既有 `get_user_from_browser()` 确认登录有效,不执行任何登录操作。
3. 只发送资料 GET,验证 `/aweme/v1/web/user/profile/other/` 除了 `sec_user_id`,也支持查询参数 `user_id=4432868004606158`。返回 UID 完全一致,昵称 `tico168888`,关注状态 `0`。没有打开或导航到此用户主页。
4. 将资料查询参数改为 `user_id`,返回 UID 必须与输入字符串完全一致;不依赖返回 sec_uid 来发起关注。
5. 保留关注前状态检查、禁止关注自己、已关注跳过、关注后回查和异常不重试。输入校验发生在连接浏览器之前;只接受不带前导零的正整数 ASCII 数字字符串,拒绝主页链接、空串、零、负号、小数及全角数字。
6. 离线 4 项测试通过后,运行 CLI 的 `--check` 确认目标未关注,再执行一次真实关注。
7. 关注成功并回查确认 `follow_status=1`;重复运行返回 `already_following`,不再次提交关注。
## 请求参数与完整流程
公共查询参数:`device_platform=webapp&aid=6383&channel=channel_pc_web`
1. 当前登录态检查:沿用 `/aweme/v1/web/user/profile/self/?device_platform=webapp&aid=6383`
2. 目标状态:`GET /aweme/v1/web/user/profile/other/`,公共参数加 `user_id=<uid>`
3. 仅未关注时:`POST /aweme/v1/web/commit/follow/user/`,公共查询参数;表单正文 `user_id=<uid>&type=1`Content-Type 为 `application/x-www-form-urlencoded; charset=UTF-8`
4. 关注成功后:重复步骤 2,只读确认同一个 UID 已关注。
返回 JSON 为 `action``uid``sec_uid`(资料附带)、`nickname``follow_status`;输入不需要 sec_uid。脚本没有取消关注分支,不自动重试写请求。HTTP 200 和 `status_code=0` 之外,必须同时检查关注响应与回查状态为 1 或 2。私密账号审批等其他状态仍停止,不推测成功。
这些是脚本明确传入的参数;Cookie 由浏览器携带,页面 SDK 可能附加安全字段,未逐项抓取最终网络层字段。
## 命令与实测输出
```bash
python3 src/follow_user.py 4432868004606158 --check
python3 src/follow_user.py 4432868004606158
```
实际新增关注输出摘要:
```json
{
"action": "followed",
"uid": "4432868004606158",
"nickname": "tico168888",
"follow_status": 1
}
```
再次执行相同关注命令:`action=already_following, follow_status=1`。未取消或修改此前测试对象的关注关系。
```bash
python3 -m unittest discover -s src -p 'test_follow_user.py'
```
4 项离线测试通过:UID 边界、首次关注及状态回查、只查/已关注/相互关注跳过、身份不匹配/失效登录/自己/未知状态停止、写入不确定时不自动重试。测试使用标准库 unittest/mock,不访问浏览器。
## 空白环境安装与复用
项目 Python 3.10+,保留同目录 `src/get_current_user.py`;无需新 Python 依赖。另需 Chrome/Chromium 和 browser-harness
```bash
# uv 尚未安装时,可通过系统包管理器或用户级 pip 安装
python3 -m pip install --user uv
export PATH="$HOME/.local/bin:$PATH"
uv tool install --python 3.12 --upgrade --force browser-harness
uv tool update-shell
export BU_CDP_URL=http://localhost:9222
browser-harness --doctor
```
已有 CDP 浏览器直接复用;空白环境须自行开启 Chrome 远程调试、打开抖音并手动登录,详细步骤见前一篇文档安装章节。端点可通过环境变量指定,不固化账号、目标 UID 或标签 ID。遇到登录失效停止,不尝试自动登录。只串行使用,不并发切换账号或标签。
若从通知文件取目标,使用 `notifications[].users[].uid`;原始通知的顶层 `user_id` 是通知接收账号,不是互动用户。UID 在调用和 JSON 中保持字符串,避免大整数精度损失。