移植自 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 带网关原话 / 正常返回)。
9.5 KiB
TOOL.md — 矩阵养号系统 Matrix
工具版本: v4.1
接入日期: 2026-04-29
维护者: ghai
路径方案: local.yaml + local_paths.py(无软链接,多机安全)
更新日期: 2026-05-03
平台支持: 抖音 ✅ | 小红书 🔄 | 知乎 🔄 | 快手 📋
一句话说明
通过 Chrome CDP 和 Camoufox(Firefox 内核)程序化控制浏览器,自动完成多平台社交账号的日常养号任务(浏览、点赞、评论、收藏等),模拟真实用户行为。
架构概览(v4.1)
matrix.py ← 统一 CLI 入口(account/nurture/config/status 四域)
│
├── account/ ← 账号管理域
│ ├── create_identity.py ← 身份工厂(BrowserForge 固化指纹)
│ ├── login_identity.py ← 首次登录(持久化保存登录态)
│ ├── sms/ ← 短信验证码接口(预留)
│ └── captcha/ ← 图形验证码接口(预留)
│
├── nurture/ ← 养号执行域
│ ├── runner.py ← 常驻循环引擎(Chrome CDP + Camoufox 双引擎)
│ └── behavior.py ← 行为模拟参数化(13项可配置)
│
├── engine/ ← 浏览器引擎层
│ └── cdp_connector.py ← Chrome CDP / Camoufox 持久化连接
│
├── ops/ ← 操作层(多平台)
│ └── douyin/
│ ├── browse.py ← 浏览类操作
│ └── interact.py ← 交互类操作
│
└── config/ ← 配置管理
└── accounts.yaml ← 账号配置(含 identity_dir)
└── screenshots/ # 截图快照
⭐ 路径解析方式 (v4.0): local_paths.py → 读取 local.yaml → 获取 data_root → config_path("x") → data_root/config/x → data_path("x") → data_root/data/x → logs_path("x") → data_root/logs/x → profiles_path("x") → data_root/profiles/x → screenshots_path("x")→ data_root/screenshots/x → code_dir() → 05_tools/07_matrix/(代码目录)
---
## 快速使用
```bash
cd ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix
# 启动抖音账号(Chrome CDP)
python scripts/switch_account.py --method profile --target douyin_01 --port 9222
# 执行日常浏览蓝图
python scripts/task_engine.py --blueprint douyin_browse_v2 --account douyin_01
# 定时调度
python scripts/task_scheduler.py
# 查看账号状态
python scripts/switch_account.py --status
环境依赖
| 依赖 | 版本 | 说明 |
|---|---|---|
| Python | 3.10+ | 使用 agent-os venv |
| Google Chrome | 最新版 | CDP 直连 |
| Camoufox | 最新版 | Firefox 内核,反检测 |
| playwright | ≥1.40 | 浏览器自动化 |
完整依赖见 requirements.txt,安装:
pip install -r ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/requirements.txt
新机恢复
# 一键恢复(建立本地目录骨架 + 生成 local.yaml + 安装依赖)
bash ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/install.sh
# 然后将账号配置复制/重新填写
cp ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/config_template/accounts.yaml \
~/workbuddy-agent-os/agent-local/tools/matrix/config/accounts.yaml
# 编辑 accounts.yaml 填入本机账号信息
统一 CLI 使用(v4.1 推荐)
cd ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/scripts
# 账号管理
python matrix.py account list # 列出所有账号
python matrix.py account create <name> # 创建新身份
python matrix.py account login <name> # 首次登录
python matrix.py account status [name] # 查看状态
# 养号执行
python matrix.py nurture run -a <name> -r 10 # 单账号循环
python matrix.py nurture run -a a -a b -r 10 # 多账号并发
python matrix.py nurture run -a <name> -r 10 --daemon # 保持连接不退出
# 配置管理
python matrix.py config show # 查看配置
python matrix.py config blueprint list # 查看蓝图
# 状态监控
python matrix.py status all # 全局状态
python matrix.py status browsers # 浏览器状态
核心机制
双引擎架构
| 引擎 | 适用账号 | 连接方式 | 窗口控制 | 视口控制 |
|---|---|---|---|---|
| Chrome CDP | douyin_01/02 | CDP WebSocket | --window-size 参数 | UA + viewport + touchEmulation 三合一 |
| Camoufox 持久化 | douyin_camo01 | launch_persistent_context | window.open(features) | 启动前 config 注入 DOM 属性 |
Chrome 反检测方案(三合一)
Chrome CDP 模式下,抖音识别移动端需要三个设置缺一不可:
# 1) UA 覆盖 — 告诉抖音是安卓平板
await cdp.send("Network.setUserAgentOverride", {"userAgent": ANDROID_TABLET_UA})
# 2) 视口尺寸 — 告诉抖音是小屏设备
await page.set_viewport_size({"width": 702, "height": 783})
# 3) 触摸模拟 — 告诉抖音是触摸设备(关键!缺这个就是桌面版)
await cdp.send("Emulation.setTouchEmulationEnabled", {
"enabled": True, "maxTouchPoints": 5, "configuration": "mobile"
})
⚠️ 注意:Emulation.setDeviceMetricsOverride 在 Chrome 148 上 width/height 参数失效,不要使用。
Camoufox 窗口/视口控制方案(v4.1 修复)
问题:Playwright 的 Firefox launch_persistent_context 模式完全接管了窗口管理和视口设置,
--width/--height 参数、window.resizeTo、page.set_viewport_size 均无效。
解决方案(双层控制):
-
物理窗口尺寸 — 启动后用
window.open(url, name, 'width=702,height=783')创建新窗口。 Firefox 的window.open特性参数字段是原生支持的,Playwright 无法覆盖。 -
页面视口/屏幕尺寸 — 通过 Camoufox 的
config参数在启动前注入 DOM 属性覆盖:config={ "window.innerWidth": 702, "window.innerHeight": 783, "window.outerWidth": 702, "window.outerHeight": 783, "screen.width": 702, "screen.height": 783, "screen.availWidth": 702, "screen.availHeight": 783, }Camoufox 的扩展会在每个页面加载前读取 config 并覆盖 DOM 属性, 效果等同 Playwright 的
set_viewport_size但不受其限制。 -
窗口尺寸配置 — 写入
identities/{name}/config.yaml:window: [702, 783]
行为模拟参数化
行为参数可在 identities/{name}/config.yaml 中覆盖默认值:
behavior:
base_delay: 1.5 # 操作间基础间隔(秒)
delay_variance: 0.8 # 随机波动范围
attention:
distraction_chance: 0.05 # "分心"概率
watch_duration: [4, 12] # 观看视频时长(秒)
round_break:
min_break: 5 # 轮间最短休息(秒)
max_break: 20 # 轮间最长休息(秒)
接口预留
| 模块 | 状态 | 说明 |
|---|---|---|
account/sms/base.py |
抽象基类 | 短信验证码处理(默认手动输入) |
account/captcha/base.py |
抽象基类 | 图形验证码处理(默认手动处理) |
ops/xiaohongshu/ |
目录预留 | 小红书操作集 |
ops/kuaishou/ |
目录预留 | 快手操作集 |
ops/bilibili/ |
目录预留 | B站操作集 |
环境依赖
| 依赖 | 版本 | 说明 |
|---|---|---|
| Python | 3.10+ | 使用 agent-os venv |
| Google Chrome | 最新版 | CDP 直连 |
| Camoufox | ≥0.4.11 | Firefox 内核,反检测 |
| playwright | ≥1.40 | 浏览器自动化 |
| browserforge | 最新 | BrowserForge 指纹生成 |
| camoufox | ≥0.4 | Firefox 反检测浏览器 |
完整依赖见 requirements.txt,安装:
pip install -r ~/workbuddy-agent-os/agent-sync/05_tools/07_matrix/requirements.txt
多机同步说明 (v4.0)
本工具不再使用软链接,改为 local.yaml + local_paths.py 方案:
local.yaml— 记录本机数据目录路径,每台机器独立生成local.yaml不参与坚果云同步(请加入排除列表)- 所有 Python 脚本通过
scripts/local_paths.py读取路径 - 任何脚本启动时若
local.yaml不存在,会报错并提示运行install.sh
local.yaml 格式(自动生成,无需手动编辑):
matrix:
local_data_root: /Users/xxx/workbuddy-agent-os/agent-local/tools/matrix
当前开发状态
| 阶段 | 内容 | 状态 |
|---|---|---|
| A | Chrome CDP + 抖音原子操作(18个)+ 蓝图引擎 | ✅ 已完成 |
| B | Camoufox 集成 + 多浏览器内核 | 🔄 进行中 |
| C | 鼠标轨迹仿真 + 语料库完善 | 📋 规划中 |
| D | 小红书/知乎完整支持 | 📋 规划中 |
注意事项
local.yaml每台机器独立配置,不纳入坚果云同步(加入排除列表)profiles/目录含 Chrome 用户数据(~100MB),存于agent-local/本地config/accounts.yaml含账号标识信息,存于agent-local/本地- 换机后 profiles 需重新登录各平台账号
- Camoufox 需单独安装(见 docs/CAMOUFOX_LOGIN_MANAGEMENT.md)
- 多机同步只需每台机器运行一次
install.sh - 避免使用软链接指向 agent-local,统一通过
local_paths.py管理路径