feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。

**目前能用的(真环境实测,非推断)**:

    profile/other : 200, 7075 字节  —— 博主主页指标(粉丝/获赞/作品数/昵称)
    aweme/detail  : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)

**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
  1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
     带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
     同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
     挑中的恰好是「批量拉作品列表」这个最敏感的动作。
  2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
     代价,过几小时要重测)。

  所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。

**排查中控住变量后得到的两条事实**(都写进注释了):
  · `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
    UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
    (我先前猜的 sec-ch-ua 不是关键。)
  · 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
    从 CDP 取齐 cookie + UA + hints,而不是各自写死。

「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。

测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
This commit is contained in:
2026-10-10 17:12:25 +08:00
parent 21ff01b894
commit 2112c1a870
1601 changed files with 367425 additions and 0 deletions
@@ -0,0 +1,224 @@
# mc 命令参考手册 — Matrix v5.2
> 统一 CLI 入口,替代旧版 matrix.py。
> 智能体通过 mc 命令调用 Matrix,不需要直接操作 Python 脚本。
---
## 安装
```bash
cd ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix
chmod +x mc
# 可选:ln -s $(pwd)/mc /usr/local/bin/mc
```
Python 路径自动检测(AGENTOS_PYTHON > agent-os venv > 系统 python3),换机无需修改。
---
## 命令一览
### 录制系统(v5.1 新增)
```bash
# 开始录制
mc record start --account douyin_test
# → 启动 Camoufox,你在浏览器操作,关键节点按数字键 1-8 标记
# 按 0 结束录制
# 查看录制包
mc record list
# 分析录制包
mc record analyze <录制包路径>
# 导出为蓝图+代码
mc record export <录制包路径>
# 删除录制包
mc record delete <录制包路径>
```
### 定向评论(v5.1 新增)
```bash
# 创建一个仅包含 "打开视频→评论" 的蓝图,然后执行:
mc run --accounts douyin_test --blueprints douyin_comment_test --rounds 1 --keep
# 或手动创建自定义蓝图:
# 1. 在 blueprints/ 下创建 JSON 文件
# 2. 包含 goto_url → wait_watch → open_comments → post_comment
# 3. 用 mc run 执行
```
### 养号执行
```bash
# 批量养号(推荐)
mc run --accounts douyin_01,douyin_02 --blueprints nurture_v1 --rounds 3 --mix --interval 45-90
# 指定语料库
mc run --accounts douyin_01 --blueprints nurture_v1 --rounds 3 --corpus daily_hot
# 查看帮助
mc run --help
```
| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--accounts` | 逗号分隔的账号列表 | 必填 |
| `--blueprints` | 逗号分隔的蓝图列表 | 必填 |
| `--rounds` | 每账号执行轮数 | 10 |
| `--mix` | 混合随机模式(每轮随机选蓝图) | 顺序模式 |
| `--interval` | 轮间间隔(秒),支持范围 `45-90` | 30-60 |
| `--corpus` | 逗号分隔的语料库分类 | 无 |
| `--daemon` | 后台运行模式 | 否 |
| `--engine` | 引擎(auto/camoufox) | auto |
| `--keep` | 执行完后保留浏览器(需手动关) | 否 |
| `--json` | 输出 JSON 格式结果 | 否 |
### 账号管理
```bash
mc account list # 列出所有账号及状态
mc account login <name> # 首次手动登录(打开浏览器等用户操作)
mc account status [name] # 查看账号登录状态
mc account export # 导出账号配置
mc account import <path> # 导入账号配置
```
### 注册新账号(Dashboard 推荐)
在 Dashboard 上完成:
1. 启动 Dashboard → 左侧「矩阵」→「短信与管理」
2. 底部「注册新账号」表单
3. 选平台、填手机号、填备注名 → 点确认
4. 浏览器自动打开 → 扫码登录 → 后续可采集昵称
5. 登录后点「采集昵称」获取昵称/粉丝数
也可以通过 CLI:
```bash
python scripts/matrix.py account create --platform douyin --phone 138xxxx
```
### 短信 API(Dashboard 推荐)
Dashboard 短信页面:
1. 左侧「矩阵」→「短信与管理」
2. 下拉选账号 → 点「查短信」
3. 系统自动解析抖音/小红书验证码
API:
```bash
# 查短信
GET /api/matrix/sms/test/{phone_or_account}
# 查看所有账号手机号
GET /api/matrix/sms/accounts
```
### Dashboard 启动
```bash
cd ~/workbuddy-agent-os/agent-sync/05_tools/10_dashboard
nohup ~/.workbuddy/binaries/python/envs/agent-os/bin/uvicorn app:app --host 0.0.0.0 --port 9988 &
# 浏览器打开 http://localhost:9988
# 左侧「矩阵」:短信 / 录制 / 账号管理
```
### 新机部署说明
新机部署后同步账号:
```bash
bash ~/workbuddy-agent-os/agent-sync/00_bootstrap/init.sh
# 自动拉取仓库 → 安装依赖 → 同步本机账号
```
`accounts_registry.yaml` 中 `assigned_machine` 标记为当前机器 UID 的账号会自动同步到本机。
### 蓝图管理
```bash
mc blueprint list # 列出所有蓝图
mc blueprint show <name> # 查看蓝图详情
```
### 语料库
```bash
mc corpus list # 查看语料分类
mc corpus add <平台> "语料" # 添加语料
```
### 状态查询
```bash
mc status all # 全局状态(浏览器+账号)
mc status accounts # 账号登录状态
mc status browsers # 浏览器运行状态
```
### 代理管理
```bash
mc proxy list # 代理列表
mc proxy test <name> # 测试代理
```
---
## 自动化任务
### 每日养号(定时执行)
```bash
# 完整执行
bash ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/scripts/nurture_daily.sh
# 仅查看命令(不执行)
bash ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/scripts/nurture_daily.sh --dry
# 仅跑第1组
bash ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/scripts/nurture_daily.sh --group 1
```
日志:`/tmp/nurture_daily_YYYYMMDD.log`
### 结构化日志
每次 mc run 执行后自动写入:
`agent-local/tools/matrix/logs/run_{date}_{account}.jsonl`
查询:
```python
from mc.runlog import get_today_summary
print(get_today_summary())
# → {"date": "20260609", "accounts": {"douyin_01": {"runs": 3, "last_success": 8, ...}}}
```
---
## 与旧版 matrix.py 对照
| 旧命令 | 新命令 |
|--------|--------|
| `python matrix.py account list` | `mc account list` |
| `python matrix.py account login X` | `mc account login X` |
| `python matrix.py nurture run -a X -r 10` | `mc run --accounts X --rounds 10 ...` |
| `python matrix.py status all` | `mc status all` |
| `python matrix.py config blueprint list` | `mc blueprint list` |
---
## 智能体调用约定
智能体通过 WorkBuddy 技能 `matrix` 触发。SKILL.md 定义了触发词和对应的 mc 命令。
当用户说"养号"、"执行蓝图"、"账号状态"时,智能体:
1. 加载 `02_skills/matrix/SKILL.md`
2. 根据触发词匹配对应的 mc 命令
3. 执行命令并汇报结果
**不需要读源码。不需要知道 engine.py 内部细节。**