feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
移植自 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:
@@ -0,0 +1,269 @@
|
||||
# AgentOS 联邦系统 — 全面架构审计报告
|
||||
|
||||
> 审计日期: 2026-06-18
|
||||
> 审计范围: agent-sync/05_tools/07_matrix/scripts + 10_dashboard + 00_bootstrap
|
||||
> 文件总量: 130 个 Python 文件, 7 个 Shell, 36 个目录
|
||||
|
||||
---
|
||||
|
||||
## 一、系统全景图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ Dashboard (uvicorn :9988) │
|
||||
│ app.py · routes/matrix.py · routes/ops.py · 7 个 services/ │
|
||||
│ static/index.html (7700行内联JS) · frontend/ (Vite 33视图) │
|
||||
├──────────────────────┬──────────────────┬──────────────────────┤
|
||||
│ mc CLI (入口) │ matrix.py (旧入口)│ agentos (新入口) │
|
||||
│ mc/cli.py (15命令) │ 统一脚本入口 │ cli.py + plugins/ │
|
||||
├──────────────────────┴──────────────────┴──────────────────────┤
|
||||
│ scripts/ (核心) │
|
||||
│ matrix_mgmt.py · collect_*.py · nurture_*.py │
|
||||
│ cdp_connector.py · auth_manager.py · anti_detection.py │
|
||||
│ atom_ops.py · orchestrator.py · task_engine.py │
|
||||
├──────────────────────┬──────────────────┬──────────────────────┤
|
||||
│ matrix_modules/ │ mc/ 包 │ archive/ │
|
||||
│ account/ (登录) │ cli.py │ 41个旧脚本(已归档) │
|
||||
│ nurture/ (养号) │ run.py/engine │ │
|
||||
│ ops/xhs/ (小红书原子) │ task.py/schedule│ │
|
||||
│ comment/ │ proxy/recorder │ │
|
||||
├──────────────────────┴──────────────────┴──────────────────────┤
|
||||
│ 数据层 │
|
||||
│ agent-local/tools/matrix/ │
|
||||
│ config/accounts.yaml · data/homepage_info.json · identities/ │
|
||||
│ 14个JSON蓝图 · profiles/*.json · anchor_db.sqlite │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、模块级审计
|
||||
|
||||
### 2.1 入口层
|
||||
|
||||
| 入口 | 文件 | 作用 | 状态 |
|
||||
|:-----|:-----|:-----|:-----|
|
||||
| `mc` CLI | `mc/cli.py` | **当前主入口**,15 个子命令: run/collect/account/blueprint/login/smart-login/task/schedule/corpus/proxy/sms/status/record/op/remote | ✅ 正常 |
|
||||
| `matrix.py` | `matrix.py` | 旧版统一入口(`matrix_utils`),仍被 mc CLI 部分引用 | ⏳ 兼容层 |
|
||||
| `agentos` | `agentos/cli.py` | 新版智能体 CLI,挂载 plugins/ave/crawl/fleet/matrix/serve | 🔄 开发中 |
|
||||
| Dashboard | `app.py` | Web 管理台,~50 个 API 端点,33 个视图 | ✅ 正常 |
|
||||
| `matrix_mgmt.py` | 账号/蓝图/备份管理 | 核心数据管理,被所有组件引用 | ✅ 正常 |
|
||||
|
||||
### 2.2 矩阵养号层
|
||||
|
||||
| 模块 | 文件 | 功能 | 复用情况 | 状态 |
|
||||
|:-----|:-----|:------|:--------|:------|
|
||||
| 账号管理 | `matrix_mgmt.py` | CRUD+多机聚合+蓝图+备份 | 所有组件引用 | ✅ 正常 |
|
||||
| 账号登录 | `matrix_modules/account/xhs_login.py` | 小红书 SMS 登录原子操作 | 被 xiaohongshu_login.py 调用 | ✅ 正常 |
|
||||
| 账号登录 | `matrix_modules/account/sms_login.py` | 抖音 SMS 登录原子操作 | 被 douyin_login.py 调用 | ✅ 正常 |
|
||||
| 账号登录 | `matrix_modules/account/douyin_login.py` | 抖音登录CLI | CLI模式 | ✅ 正常 |
|
||||
| 账号登录 | `matrix_modules/account/xiaohongshu_login.py` | 小红书登录CLI | CLI模式 | ✅ 正常 |
|
||||
| 养号引擎 | `matrix_modules/nurture/runner.py` | **75408b** 超大文件,含 38 个函数 | mc run 的核心 | ⚠️ 过大需拆分 |
|
||||
| 养号引擎 | `orchestrator.py` | 养号调度器(AtomOps+Blueprint) | 替代 runner 的新版 | 🔄 开发中 |
|
||||
| 日常养号 | `nurture_daily.py` | 旧版日常调度器(286行) | 可能被 runner 替代 | ⏳ 过渡状态 |
|
||||
| 蓝图 | `nurture_blueprint.py` | 蓝图执行 | 被 atom_ops 调用 | ✅ 正常 |
|
||||
| 批量采集 | `collect_batch_runner.py` | 分批并行采集 | **当前使用版本** | ✅ 正常 |
|
||||
| 单身份采集 | `collect_homepage_info.py` | 单身份采集 | 被 batch_runner import | ✅ 正常 |
|
||||
|
||||
### 2.3 浏览器/反检测层
|
||||
|
||||
| 模块 | 文件 | 大小 | 复用情况 | 状态 |
|
||||
|:-----|:-----|:----|:--------|:------|
|
||||
| CDP连接器 | `cdp_connector.py` | 最大(>300行) | **所有浏览器操作的基础** | ✅ 正常 |
|
||||
| Camoufox管理器 | `camoufox_manager.py` | ~200行 | 部分使用 | ⏳ 与cdp_connector重复 |
|
||||
| 浏览器管理器 | `browser_manager.py` | ~200行 | 实验性 | ❌ 被cdp_connector替代 |
|
||||
| 优雅退出 | `browser_utils.py` | `GracefulBrowser`类 | 被 login 模块使用 | ✅ 正常 |
|
||||
| 反检测 | `anti_detection.py` | BehaviorProfile类 | 部分引用 | ✅ 正常 |
|
||||
| 账号切换 | `switch_account.py` | Chrome Profile切换 | 基本废弃 | 🗑️ 应归档 |
|
||||
|
||||
### 2.4 登录状态管理
|
||||
|
||||
| 模块 | 文件 | 功能 | 复用 | 状态 |
|
||||
|:-----|:-----|:------|:-----|:------|
|
||||
| 认证管理器 | `auth_manager.py` | Cookie/DOM 多维登录检测 | **核心工具** | ✅ 正常 |
|
||||
| 页面状态 | `page_state.py` | 页面模式检测(grid/player/search) | 部分使用 | ⏳ 可增强 |
|
||||
| 原子操作 | `atom_ops.py` | AtomOps类(通用操作) | orchestrator核心 | ✅ 正常 |
|
||||
| 抖音操作 | `douyin_ops.py` | DouyinOps类(300+行) | 养号引擎核心 | ✅ 正常 |
|
||||
|
||||
### 2.5 小红书原子操作
|
||||
|
||||
| 模块 | 文件 | 功能 | 状态 |
|
||||
|:-----|:-----|:------|:------|
|
||||
| selectors | `matrix_modules/ops/xhs/selectors.py` | DOM选择器常量 | ✅ 正常 |
|
||||
| browse | `matrix_modules/ops/xhs/browse.py` | 浏览操作 | ✅ 正常 |
|
||||
| interact | `matrix_modules/ops/xhs/interact.py` | 互动操作 | ✅ 正常 |
|
||||
| ATOMIC_OPS.md | `matrix_modules/ops/xhs/ATOMIC_OPS.md` | 操作文档 | ✅ 正常 |
|
||||
|
||||
### 2.6 任务调度
|
||||
|
||||
| 模块 | 文件 | 功能 | 状态 |
|
||||
|:-----|:-----|:------|:------|
|
||||
| 任务引擎 | `task_engine.py` | 蓝图执行引擎 | ⏳ 与 runner 功能重叠 |
|
||||
| 任务调度 | `task_scheduler.py` | 定时任务 | ✅ 正常 |
|
||||
| C2命令总线 | `c2/command_bus.py` | 跨机命令(HTTP/Git降级) | ✅ 正常 |
|
||||
| C2采集器 | `c2/profile_scraper.py` | 跨机数据聚合 | ⏳ 旧版功能 |
|
||||
|
||||
### 2.7 Dashboard 后端服务
|
||||
|
||||
| 服务 | 大小 | 功能 | 状态 |
|
||||
|:-----|:----|:------|:------|
|
||||
| `command_bus.py` | 27KB, **4类28函数** | **统一命令总线(v5)** | ✅ **核心** |
|
||||
| `browser_orchestrator.py` | 9.5KB | 浏览器编排(并发控制) | ✅ 正常 |
|
||||
| `remote_exec.py` | 6KB | 远程SSH执行 | ⏳ 部分被command_bus替代 |
|
||||
| `operation_queue.py` | 5.6KB | 操作队列 | ⏳ 与command_bus重叠 |
|
||||
| `preflight.py` | 3.8KB | 预检(磁盘/浏览器/进程) | ✅ 正常 |
|
||||
| `resource_lock.py` | 4.4KB | 资源锁定 | ⏳ 与browser_orch重叠 |
|
||||
| `data_aggregator.py` | 6.7KB | 数据聚合 | ✅ 正常 |
|
||||
| `log_aggregator.py` | 3.5KB | 日志聚合 | ✅ 正常 |
|
||||
|
||||
### 2.8 Dashboard 路由
|
||||
|
||||
| 路由文件 | 端点 | 功能 | 状态 |
|
||||
|:---------|:------|:------|:------|
|
||||
| `routes/matrix.py` | ~15个 | 养号/采集/蓝图/喂饭 | ✅ 正常 |
|
||||
| `routes/ops.py` | 4个 | 统一命令总线API | ✅ **核心** |
|
||||
|
||||
### 2.9 引导/部署层
|
||||
|
||||
| 脚本 | 功能 | 状态 |
|
||||
|:-----|:------|:------|
|
||||
| `deploy.sh` | 一键部署(3机) | ✅ 正常 |
|
||||
| `fleet_sync.sh` | 多机同步 | ✅ 正常 |
|
||||
| `fleet_reconcile.sh` | 多机对账 | ✅ 正常 |
|
||||
| `init.sh` | 环境初始化 | ✅ 正常 |
|
||||
| `setup_env.sh` | 环境配置 | ✅ 正常 |
|
||||
|
||||
### 2.10 知识库/规划文档
|
||||
|
||||
| 文档 | 内容 | 状态 |
|
||||
|:-----|:------|:------|
|
||||
| `ARCHITECTURE_v3.md` | Dashboard架构蓝图(10+) | ✅ 正常 |
|
||||
| `ARCHITECTURE.md` | 旧版架构 | ⏳ 过时 |
|
||||
| `DEPLOYMENT.md` | 部署文档 | ⏳ 需更新 |
|
||||
| `EXECUTION_PIPELINE.md` | 统一执行管道设计 | ✅ 最新 |
|
||||
| `VITE_MIGRATION_PLAN.md` | 前端重构计划 | ✅ 最新 |
|
||||
|
||||
---
|
||||
|
||||
## 三、核心问题清单
|
||||
|
||||
### P0 — 必须修复
|
||||
|
||||
| # | 问题 | 涉及文件 | 影响 |
|
||||
|:-:|:-----|:---------|:-----|
|
||||
| 1 | `matrix_modules/nurture/runner.py` 75408b/38函数 — 过于庞大 | 全部养号操作 | 难以维护和调试 |
|
||||
| 2 | `cdp_connector.py` 和 `camoufox_manager.py` / `browser_manager.py` 功能**严重重叠** | 3个文件管理浏览器 | 调用混乱 |
|
||||
| 3 | `services/operation_queue.py` 与 `command_bus.py` 功能重叠 | 队列管理重复 | 两种排队逻辑并存 |
|
||||
|
||||
### P1 — 需重构
|
||||
|
||||
| # | 问题 | 涉及 | 影响 |
|
||||
|:-:|:-----|:------|:------|
|
||||
| 4 | 采集流程登录检测**刚修复**(xhs),抖音登录**尚未集成** | collect_*.py | 抖音未登录时不会自动登录 |
|
||||
| 5 | `remote_exec.py` 被 `command_bus.py` **部分替代**但未被移除 | 远程执行 | 两份远程执行代码 |
|
||||
| 6 | `resource_lock.py` 与 `browser_orchestrator.py` 资源管理重叠 | 资源管理 | 两种锁机制 |
|
||||
| 7 | `switch_account.py` 基本**废弃**但未被归档 | 账号切换 | 死代码 |
|
||||
| 8 | `browser_manager.py` 实验性代码未被正式使用 | 浏览器管理 | 死代码 |
|
||||
|
||||
### P2 — 需优化
|
||||
|
||||
| # | 问题 | 涉及 | 影响 |
|
||||
|:-:|:-----|:------|:------|
|
||||
| 9 | 41个已归档脚本在 `archive/` — 部分可能含可复用逻辑 | archive/ | 需要清理或复用 |
|
||||
| 10 | `nurture_daily.py` 被 `collect_batch_runner.py` 部分替代但未删除 | 养号调度 | 两份调度逻辑 |
|
||||
| 11 | `orchestrator.py` 和 `nurture_daily.py` 功能定位不清 | 调度器 | 新旧交替 |
|
||||
| 12 | `static/index.html` 7700行 — 内联JS过于庞大 | 前端 | 维护困难 |
|
||||
| 13 | 未统一使用 `local_paths.py` — 文件散落硬编码路径 | 多处 | 可维护性差 |
|
||||
|
||||
---
|
||||
|
||||
## 四、模块关系图
|
||||
|
||||
```
|
||||
用户/开发
|
||||
│
|
||||
┌────────────┼────────────┐
|
||||
│ │ │
|
||||
mc CLI Dashboard agentos CLI
|
||||
(mc/cli.py) (app.py:9988) (agentos/cli.py)
|
||||
│ │ │
|
||||
└─────┬──────┴─────┬──────┘
|
||||
│ │
|
||||
command_bus.py c2/command_bus.py
|
||||
(统一命令总线v5) (HTTP/Git降级)
|
||||
│
|
||||
┌────────────┼──────────────────┐
|
||||
│ │ │
|
||||
本地执行 远程SSH 队列调度
|
||||
│ │ │
|
||||
┌────┴────┐ remote_exec.py operation_queue.py
|
||||
│ │
|
||||
角色模块 引擎模块
|
||||
│ │
|
||||
account/ nurture/runner.py
|
||||
xhs_login douyin_ops.py
|
||||
sms_login atom_ops.py
|
||||
auth_mgr blueprint
|
||||
│
|
||||
cdp_connector.py (浏览器基础)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、操作类型映射
|
||||
|
||||
| 操作 | mc CLI │ 命令总线 │ 前端 | 后端执行 | 状态 |
|
||||
|:-----|:-------|:---------|:-----|:---------|:-----|
|
||||
| 养号执行 | `mc run` | `POST /api/ops/run {type:nurture}` | 养号视图 | `mc run --accounts=...` | ✅ |
|
||||
| 信息采集 | `mc collect` | `POST /api/ops/run {type:collect}` | 采集视图 | `collect_batch_runner.py` | ✅ |
|
||||
| 登录 | `mc smart-login` | `POST /api/ops/run {type:login}` | 登录视图 | `douyin_login/xhs_login` | ✅ |
|
||||
| 退出 | `mc account logout` | `POST /api/ops/run {type:logout}` | 登录视图 | `mc account logout ...` | ✅ |
|
||||
| 评论 | `mc task comment` | `POST /api/ops/run {type:comment}` | 评论视图 | `mc task comment ...` | ✅ |
|
||||
| 点赞 | `mc task like` | `POST /api/ops/run {type:like}` | 点赞视图 | `mc task like ...` | ✅ |
|
||||
| 蓝图 | `mc blueprint` | — | 蓝图视图 | matrix_mgmt | ✅ |
|
||||
| 账号 | `mc account` | — | 账号视图 | matrix_mgmt | ✅ |
|
||||
| 代理 | `mc proxy` | — | SMS代理 | proxy管理 | ✅ |
|
||||
| 短信 | `mc sms` | — | SMS代理 | ApiSMSHandler | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 六、建议行动顺序
|
||||
|
||||
### Phase A: 清理重复(~2小时)
|
||||
|
||||
```
|
||||
1. browser_manager.py → 归档到 archive/
|
||||
2. switch_account.py → 归档到 archive/
|
||||
3. remote_exec.py → 如果完全被 command_bus 替代则归档
|
||||
4. resource_lock.py → 合并到 browser_orchestrator.py
|
||||
5. operation_queue.py → 集成到 command_bus.py
|
||||
```
|
||||
|
||||
### Phase B: 整合核心(~3小时)
|
||||
|
||||
```
|
||||
1. 统一浏览器管理 (cdp_connector.py → 唯一入口)
|
||||
- camoufox_manager.py 的功能合并到 cdp_connector
|
||||
|
||||
2. 统一养号引擎
|
||||
- nurture_daily.py 的功能合并到 collect_batch_runner.py
|
||||
- orchestrator.py 作为新版 adoption
|
||||
|
||||
3. 统一采集登录
|
||||
- 在 extract_douyin() 中也加入登录检测(已为xhs修复)
|
||||
- 创建通用 login_if_needed(page, platform, phone) 函数
|
||||
```
|
||||
|
||||
### Phase C: 标准化路径(~1小时)
|
||||
|
||||
```
|
||||
1. 所有文件改用 local_paths.py 获取路径
|
||||
2. 消除硬编码的 `~/workbuddy-agent-os/agent-local/...`
|
||||
```
|
||||
|
||||
### Phase D: 文档化(~30分钟)
|
||||
|
||||
```
|
||||
1. 更新 ARCHITECTURE_v3.md 反映当前真实架构
|
||||
2. 在 99_system/ 更新 README.md
|
||||
```
|
||||
Reference in New Issue
Block a user