Files
MediaCrawler/mac-agent-os-main/03_knowledge/99_system/ARCHITECTURE_AUDIT.md
T
butubb 2112c1a870
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
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 带网关原话 / 正常返回)。
2026-10-10 17:12:25 +08:00

270 lines
14 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.
# 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
```