75 lines
4.4 KiB
Markdown
75 lines
4.4 KiB
Markdown
# 直接传 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 中保持字符串,避免大整数精度损失。
|