移植自 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 带网关原话 / 正常返回)。
13 KiB
AgentOS 联邦系统 — 全量改造路线图
依据:
ARCHITECTURE_CONSTITUTION.md(架构宪法 v1.0)
集成:ARCHITECTURE_v3.md+VITE_MIGRATION_PLAN.md+EXECUTION_PIPELINE.md+ 审计报告
目标: 一套标准、一个框架、三机统一、联邦自治
创建: 2026-06-18 | 状态: ✅ 已定义,待执行
一、最终目标状态
当所有阶段完成时,系统呈现以下面貌:
用户操作方式(三选一):
agentos matrix run --accounts douyin_01 --blueprints douyin_daily ← CLI
agentos fleet sync ← CLI
agentos ave render ... ← CLI
Dashboard (localhost:9988) ← Web
智能体 (AI 自动调度) ← AI
后端架构:
agentos/plugins/matrix.py → command_bus.py → 执行体
agentos/plugins/ave.py → (直接调用) → 视频处理
agentos/plugins/crawl.py → (直接调用) → 抓取引擎
agentos/plugins/fleet.py → SSH/HTTP → 远程机器
agentos/plugins/serve.py → 本地服务 → MCP/调度
数据层:
matrix_mgmt.py (账号唯一入口)
local_paths.py (路径唯一入口)
auth_manager.py (登录检测唯一入口)
cdp_connector.py (浏览器唯一入口)
已退役:
mc CLI → 全部能力迁移到 agentos
matrix.py → 入口退役
camoufox_manager.py → 归档
browser_manager.py → 归档
switch_account.py → 归档
c2/command_bus.py → 归档
c2/profile_scraper.py → 归档
remote_exec.py → 被 command_bus 替代
operation_queue.py → 被 command_bus 替代
resource_lock.py → 被 browser_orchestrator 替代
nurture_daily.py → 被 orchestrator 替代
static/index.html (7700行) → 被 Vite 构建产物替代
二、阶段总览
Phase 0: agentos 框架补全 ← 短期(本周)
├── Step 0.1: agentos matrix 插件补齐
├── Step 0.2: agentos fleet/serve 插件补齐
└── Step 0.3: agentos 作为 mc 的壳(调用转发)
Phase 1: 清理 + 标准化 ← 短期(并行)
├── Step 1.1: 废弃文件归档(5个文件)
├── Step 1.2: service 层合并(remote_exec/operation_queue/resource_lock)
├── Step 1.3: local_paths.py 路径统一
└── Step 1.4: 抖音采集加入登录检测
Phase 2: Dashboard 前端重构 ← 中期(2-3天)
├── Step 2.1: Vite HMR 开发模式稳定
├── Step 2.2: 迁移视图对接新 API
├── Step 2.3: 构建产物部署
└── Step 2.4: 旧 index.html 退役
Phase 3: agentos → 全线贯通 ← 中期
├── Step 3.1: mc 全部命令迁移到 agentos
├── Step 3.2: mc CLI 退役
└── Step 3.3: 三机统一部署验证
Phase 4: 联邦自治 ← 长期
├── Step 4.1: 智能体自动调度
├── Step 4.2: 故障自愈
└── Step 4.3: 全链路监控
三、详细执行计划
Phase 0: agentos 框架补全(最高优先级)
Step 0.1: agentos matrix 插件补齐
现状: agentos/plugins/matrix.py 只有 77 行,只有基本框架,没实现具体命令。
目标: agentos matrix run|collect|login|logout|comment|like|blueprint|corpus 能正常调用底层。
| 子任务 | 文件 | 预计 | 前置 |
|---|---|---|---|
0.1a 实现 agentos matrix run → 调用 mc run |
plugins/matrix.py + cli.py |
1h | — |
0.1b 实现 agentos matrix collect → 调用 collect_batch_runner.py |
同上 | 1h | — |
0.1c 实现 agentos matrix login/logout → 调用 login 模块 |
同上 | 1h | — |
0.1d 实现 agentos matrix comment/like → 调用 mc task |
同上 | 1h | — |
0.1e 实现 agentos matrix blueprint/corpus → 调用 matrix_mgmt |
同上 | 0.5h | — |
验收: agentos matrix run --accounts douyin_test --blueprints douyin_daily --rounds 1 成功执行
Step 0.2: agentos fleet/serve 插件补齐
| 子任务 | 文件 | 预计 |
|---|---|---|
0.2a agentos fleet sync/reconcile/exec → 调用 fleet_sync.sh/fleet_reconcile.sh |
plugins/fleet.py |
0.5h |
0.2b agentos serve mcp/dashboard/schedule → 调用对应服务 |
plugins/serve.py |
0.5h |
0.2c agentos serve proxy/sms → 接入代理/短信管理 |
plugins/serve.py |
1h |
Step 0.3: agentos 作为 mc 的壳
策略: 在 mc CLI 执行时,优先检查 agentos 是否有对应实现。如果有,直接转发到 agentos。
mc run --accounts=X --blueprints=Y
→ 检查 agentos 是否可用
→ 是: subprocess.run(["agentos", "matrix", "run", ...])
→ 否: 走旧逻辑(向后兼容)
这样做的意义:
- 用户无感知迁移(mc 命令照常敲,背后用的是 agentos)
- 一旦 agentos 稳定了,mc 只需改一个转发开关
- 不用一次性重写所有 mc 命令
| 子任务 | 预计 |
|---|---|
| 0.3a mc/cli.py 入口加 agentos 转发检测 | 1h |
| 0.3b 逐个命令切换转发(从最简单开始:status/blueprint/corpus) | 2h |
Phase 1: 清理 + 标准化(与 Phase 0 并行)
Step 1.1: 废弃文件归档
| 文件 | 移到 | 替代方案 | 预计 |
|---|---|---|---|
camoufox_manager.py |
archive/camoufox_manager.py |
cdp_connector.py |
5min |
browser_manager.py |
archive/browser_manager.py |
cdp_connector.py |
5min |
switch_account.py |
archive/switch_account.py |
无(已废弃) | 5min |
c2/command_bus.py |
archive/c2_command_bus.py |
services/command_bus.py |
5min |
c2/profile_scraper.py |
archive/c2_profile_scraper.py |
Dashboard API | 5min |
| 检查所有 import 引用 → 更新或移除 | — | — | 30min |
⚠️ 必须先检查引用关系再移,防止 import 断裂。
Step 1.2: service 层合并
| 待合并 | 合并到 | 说明 | 预计 |
|---|---|---|---|
remote_exec.py |
command_bus.py._send_remote() |
command_bus 已实现远程发送 | 1h |
operation_queue.py |
command_bus.py (内置队列) |
command_bus.MachineSession 已有队列 | 1h |
resource_lock.py |
browser_orchestrator.py |
并发限制由 browser_orch 做 | 1h |
步骤:
- 检查每个函数的调用方(用 grep 找 import/reference)
- 把调用方改成新路径
- 旧文件标记 deprecated 头注释
- 确认无引用后归档
Step 1.3: local_paths.py 路径统一
审计所有硬编码路径(已知有 ~10 处):
| 文件 | 硬编码路径 | 改为 |
|---|---|---|
collect_homepage_info.py:23-27 |
Path.home() / "workbuddy-agent-os" |
local_paths.data_path() |
collect_batch_runner.py:27-32 |
同上 | 同上 |
xiaohongshu_login.py:34-35 |
同上 | 同上 |
camoufox_manager.py |
同上 | 同上(若归档则跳过) |
| 其他... | 扫描所有 .py 文件 | 逐个修改 |
Step 1.4: 抖音采集加入登录检测
对标刚修复的小红书方案:
# extract_douyin() 中,在导航到首页/个人页后
if not logged_in:
from sms_login import sms_login # 抖音 SMS 登录
login_ok = await sms_login(page, phone=phone, ...)
if login_ok: reload + retry
| 子任务 | 预计 |
|---|---|
1.4a 检查 sms_login.py 是否有独立的 login 函数(类似 xhs_login) |
15min |
1.4b 在 extract_douyin() 中加入登录检测 → 自动登录 |
1h |
| 1.4c 端到端测试 | 30min |
Phase 2: Dashboard 前端重构
Step 2.1: Vite HMR 开发模式稳定
现状: frontend/ 已有 Vite 项目,33 个视图已迁移为 ES Module。但 Dashboard 直接服务 static/index.html(内联代码),Vite 前端尚未接入。
需要解决的问题:
| 问题 | 当前状态 | 修复方案 |
|---|---|---|
Dashboard 使用 static/index.html(内联 7700 行) |
正常运行但无法 HMR | 保持现状,Vite 构建产物覆盖 static/ |
Vite 前端 (frontend/) 的视图是迁移版但功能可能不全 |
33 个 .js 文件 | 逐个验证功能 |
| ExecutionPipeline 在 Vite 版中需要从 ES Module 加载 | 已内联到 index.html | 迁移到 components/execution-pipeline.js |
正确的接入方式:
- 开发时:
cd frontend && npm run dev→localhost:5173/static/→ 有 HMR - 部署时:
cd frontend && npm run build→ 输出到../static/→ Dashboard 直接服务
Step 2.2: 迁移视图对接新 API
确保所有视图的按钮使用 ExecutionPipeline.run() + POST /api/ops/run:
| 视图 | 当前 API | 目标 API | 预计 |
|---|---|---|---|
| 养号执行 | /api/ops/run |
✅ 已对接 | — |
| 信息采集 | /api/ops/run |
✅ 已对接 | — |
| 登录管理 | /api/ops/run |
✅ 已对接 | — |
| 定向评论 | /api/ops/run |
✅ 已对接 | — |
| 收藏点赞 | /api/ops/run |
✅ 已对接 | — |
| 联邦指挥台 | /api/ops/run |
✅ 已对接 | — |
Step 2.3: 构建产物部署
cd frontend
npm run build # → 输出到 ../static/
# 验证 Dashboard localhost:9988 正常服务
# 三机同步: fleet_sync.sh
Step 2.4: 旧 index.html 退役
当 Vite 构建产物稳定后:
- 重命名
static/index.html→static/index_legacy.html(备份) - Vite 构建的
static/index.html成为主文件 - 保留回滚能力(
index_legacy.html可恢复)
Phase 3: agentos → 全线贯通
Step 3.1: mc 全部命令迁移到 agentos
| mc 命令 | → agentos | 迁移状态 |
|---|---|---|
mc run |
agentos matrix run |
⬜ 待迁移 |
mc collect |
agentos matrix collect |
⬜ 待迁移 |
mc account |
agentos matrix account |
⬜ 待迁移 |
mc smart-login |
agentos matrix login |
⬜ 待迁移 |
mc account logout |
agentos matrix logout |
⬜ 待迁移 |
mc task comment |
agentos matrix comment |
⬜ 待迁移 |
mc task like |
agentos matrix like |
⬜ 待迁移 |
mc blueprint |
agentos matrix blueprint |
⬜ 待迁移 |
mc corpus |
agentos matrix corpus |
⬜ 待迁移 |
mc status |
agentos fleet status |
⬜ 待迁移 |
mc remote |
agentos fleet exec |
⬜ 待迁移 |
mc schedule |
agentos serve schedule |
⬜ 待迁移 |
mc proxy |
agentos serve proxy |
⬜ 待迁移 |
mc sms |
agentos serve sms |
⬜ 待迁移 |
mc record |
agentos matrix record |
⬜ 待迁移 |
Step 3.2: mc CLI 退役
- mc 入口输出:
⚠️ mc 已退役,请使用: agentos <domain> <command> - 保留 mc 脚本指向 agentos 的软链接(可选)
Step 3.3: 三机统一部署验证
| 检查项 | 验证方式 |
|---|---|
| 三机 agentos 版本一致 | fleet_sync.sh 同步后检查 |
| 三机 Python 环境一致 | fleet_reconcile.sh |
| 三机 Dashboard 正常启动 | 访问各机 :9988 |
| 远程执行链路正常 | 从本机发起到 5kecheng/7kecheng 的 collect 和 nurture |
Phase 4: 联邦自治(长远目标)
| 步骤 | 说明 | 预计 |
|---|---|---|
| 4.1 智能体自动调度 | agentos 接收 AI 指令自动执行 | 未来 |
| 4.2 故障自愈 | guardd 检测到进程异常自动重启 | 未来 |
| 4.3 全链路监控 | 所有操作的状态/耗时/成功率可视化 | 未来 |
四、各阶段工作量预估
| Phase | 步骤数 | 预计工时 | 说明 |
|---|---|---|---|
| Phase 0 agentos 补全 | ~8 步 | ~8h | 最高优先级,先做 |
| Phase 1 清理标准化 | ~6 步 | ~4h | 与 Phase 0 并行 |
| Phase 2 前端重构 | ~4 步 | ~4h | 可以后做,现有内联版能用 |
| Phase 3 agentos 贯通 | ~3 步 | ~6h | 依赖 Phase 0 完成 |
| Phase 4 联邦自治 | ~3 步 | 远期 | 前期不做 |
| 总计 | ~22h |
五、风险和注意事项
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| agentos 开发中导致 mc 不稳定 | 低 | 高 | Step 0.3 的转发机制可降级回 mc |
| 归档文件被其他模块 import | 中 | 中 | 归档前 grep 全库检查引用 |
| Vite 构建产物破坏 Dashboard | 低 | 高 | 保留 index_legacy.html 回滚 |
| 远程机器同步延迟 | 中 | 低 | fleet_sync.sh 可手动触发 |
六、验收标准(全部完成时)
agentos matrix run|collect|login|logout|comment|like|blueprint|corpus全部可用agentos fleet sync|reconcile|exec全部可用agentos serve mcp|dashboard|schedule|proxy|sms全部可用mc <any>全部指向agentos(或直接提示退役)- 废弃的 6 个文件全部归档,无引用断裂
- service 层无重复功能(remote_exec/operation_queue/resource_lock 归档)
- 所有硬编码路径改为
local_paths.py - 抖音采集也有登录检测(对标小红书)
- Dashboard 通过 Vite 构建产物正常服务
- 三台机器都升级到同一版本,互操作正常
本路线图按 Phase 顺序执行。每完成一个 Step 打勾标记。
当前进度: ⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜ (0/15)