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,426 @@
# AgentOS 联邦智能体系统全景文档
> 版本:v1.0 | 最后更新:2026-06-15
> 目的:完整记录系统"是什么",为后续架构优化提供结构化参考
> 本文件不讨论"怎么做",只记录"现在是什么"和"经历过什么"
---
## 第一部分:系统身份
### 1.1 一句话定义
一个**运行在多台 Mac 上的 AI 智能体联邦操作系统**,各机器通过 Git 共享代码和配置,各自执行养号/采集/知识管理等任务,通过 Dashboard 统一监控。
### 1.2 核心设计理念
- **代码走同步,数据留本机** — 脚本在 Git,数据在本地
- **四层隔离** — 管理层/流水线层/操作层/数据层各自独立
- **每账号独立工作区** — 身份/素材/文案/发布记录各自独立
- **原子操作可组合** — 所有操作遵循"前置锚点→执行→后置锚点"
- **WPRA 写分区·读聚合** — 各写各的文件,最后统一读取(v2.0 架构)
### 1.3 用户画像(ghai)
- 多台 Mac 电脑使用者(最少 3 台)
- 从事 AI 短视频/矩阵内容运营
- 需要多账号、多平台(抖音/小红书)自动化管理
- 有知识库和记忆管理需求
- 同时也在探索 AI 视频生成(Seedance/即梦/豆包)
---
## 第二部分:硬件基础设施
### 2.1 机器清单
| 机器 | UID | 硬件 | 操作系统 | 角色 | 位置 |
|:-----|:----|:-----|:---------|:-----|:-----|
| chengzigedeAir | 4cf443bc... | MacBook Air M1, 16GB | macOS 26.4 arm64 | **本机** | 本地 |
| 5kechengdeAir | f13b03d1... | Mac (未知配置) | macOS 25.4 arm64 | 远程机器 | Gitee 同步 |
| 7kecheng | d19759cf... | Mac (未知配置) | macOS arm64 | 远程机器 | Gitee 同步 |
### 2.2 机器连接方式
- **Git 仓库**:Gitee(主)+ GitHub(备),双远程推送
- **SSH**:配置了到 Gitee/GitHub 的 SSH 密钥(id_ed25519a)
- **Tailscale**:5kechengdeAir 上已安装,本机尚未安装
- **远程执行**:`mc remote exec` 已实现 SSH/HTTP 两种方式
- **局域网**:各机器在 192.168.31.x 网段内互通
---
## 第三部分:软件与依赖
### 3.1 运行时环境
| 组件 | 版本 | 路径 | 说明 |
|:-----|:-----|:-----|:------|
| Python (managed) | 3.13.12 | `~/.workbuddy/binaries/python/versions/3.13.12/` | WorkBuddy 管理 |
| Python (system) | 3.9.6 | `/usr/bin/python3` | macOS 自带 |
| Python (venv) | 3.13.12 | `~/.workbuddy/binaries/python/envs/agent-os/` | 主运行环境 |
| Node.js | 22.12.0 | `~/.workbuddy/binaries/node/versions/22.12.0/` | WorkBuddy 管理 |
| Camoufox | (pip) | venv 内安装 | Firefox 内核浏览器,用于养号 |
| oMLX | v0.3.6 | /Applications/oMLX.app | 本地 LLM 推理引擎 |
| Ollama | v0.21.2 | /Applications/Ollama.app | 已停用 |
| Orjson | 3.11.9 | venv site-packages | 曾因 macOS 签名问题导致浏览器启动失败 |
### 3.2 本地 LLM 模型
| 模型 | 用途 | 状态 |
|:-----|:------|:------|
| Qwen3-8B-MLX-4bit | 主力推理 | ❌ Chat API 500 错误 |
| Qwen2.5-VL-3B-Instruct-8bit | 多模态理解 | ✅ 正常 |
| Qwen3-Embedding-0.6B | 向量嵌入(1024维) | ✅ 正常 |
### 3.3 已知环境问题
1. **orjson macOS 代码签名**:Python 3.13 的 .so 文件被 Tencent 签名,与本地编译的 orjson 冲突 → 需 `codesign --remove-signature` 后重新签署
2. **Python 版本割裂**:系统 3.9 vs 管理 3.13,不同版本行为差异
3. **Camoufox 启动**:依赖 orjson 和特定系统库,部分机器启动失败
4. **Git 仓库膨胀**:含浏览器缓存和二进制文件,接近 1GB
---
## 第四部分:系统组件全览
### 4.1 顶层目录
```
workbuddy-agent-os/
├── agent-sync/ 594MB ← Git 仓库(代码 + 配置 + 一些数据)
│ ├── 00_bootstrap/ 启动脚本、init.sh、apply-config.sh
│ ├── 01_core/ 核心配置:SOUL.md, IDENTITY.md, USER.md
│ ├── 02_skills/ 自定义技能:memory_manager, matrix, kb_manager 等
│ ├── 03_knowledge/ 知识库(按分类:01_daily~50_resources)
│ ├── 04_memory/ 跨机协同(WPRA)、记忆文件
│ ├── 05_tools/ 全部工具:
│ │ ├── 00_setup/ agentos CLI, guardd 守护进程
│ │ ├── 01_system/ 系统级脚本(路径修复、检测等)
│ │ ├── 02_browser/ 浏览器自动化
│ │ ├── 03_ocr/ OCR 识别
│ │ ├── 04_media/ 媒体处理
│ │ ├── 05_crawl/ 爬虫(longcat, content-inspiration)
│ │ ├── 06_mobile/ 移动端
│ │ ├── 07_matrix/ 矩阵养号系统(核心)
│ │ ├── 08_trae_agent/ TRAE 控制
│ │ ├── 09_ave/ 视频工厂
│ │ └── 10_dashboard/ Dashboard 看板(FastAPI + 前端)
│ ├── 90_archive/ 归档文档
│ └── 99_system/ 系统文档、架构、协议
│
└── agent-local/ 本机数据(不同步)
├── identity/ 机器身份、machine_uid
├── memory/ 记忆文件(L1/L2/L3、向量库)
├── tools/ 工具运行时数据
│ └── matrix/ matrix 系统数据
│ ├── config/ accounts.yaml 账号配置
│ ├── identities/ 浏览器身份(Cookie + 指纹)
│ └── data/ 运行时数据、profiles.json
├── vector_db/ 向量库(ChromaDB + 关键词索引)
└── runtime/ 运行时缓存
```
### 4.2 工具详解
#### 05_tools/07_matrix — 矩阵养号系统(核心)
| 子模块 | 说明 | 状态 |
|:-------|:------|:------|
| `mc` CLI | 统一命令行入口 | ✅ 活跃 |
| `scripts/mc/run.py` | 批量执行引擎(BatchEngine) | ✅ 活跃 |
| `scripts/mc/engine.py` | Camoufox 浏览器操作引擎 | ✅ 活跃 |
| `scripts/mc/cli.py` | CLI 命令调度(10+ 子命令) | ✅ 活跃 |
| `scripts/mc/analyzer.py` | 录制分析器 | ✅ 新增 |
| `scripts/mc/exporter.py` | 蓝图导出器 | ✅ 新增 |
| `scripts/mc/recorder.py` | 操作录制器 | ✅ 新增 |
| `blueprints/` | 14 个蓝图(抖音 9 + 小红书 4 + 录制 1) | ✅ |
| `scripts/nurture_daily.py` | 日常养号调度器 v1.0 | ✅ |
| `scripts/collect_batch_runner.py` | 批量主页信息采集 | ✅ |
| `scripts/collect_homepage_info.py` | 主页信息采集 | ✅ |
| `scripts/cdp_connector.py` | Chrome CDP 连接(含反检测) | ✅ |
| `scripts/anti_detection.py` | 反检测模块 | ✅ |
| Dashboard 集成 | 看板中的矩阵管理(7 个子页面) | ✅ |
#### 05_tools/10_dashboard — Dashboard 看板
| 模块 | 说明 |
|:-----|:------|
| `app.py` | FastAPI 主应用(3000+ 行,含所有 API) |
| `static/index.html` | 单页前端(4000+ 行,含所有前端逻辑) |
| `plugins/base.py` | 插件基类(AGENT_SYNC/AGENT_LOCAL 路径常量) |
| `plugins/matrix.py` | 矩阵插件(账号管理、蓝图、原子操作) |
| `plugins/kb_api.py` | 知识库 API |
| `plugins/sms_proxy_api.py` | 短信/代理管理 |
| `plugins/system_plugins.py` | 系统插件 |
| `plugins/_registry.py` | 注册表管理 |
#### 05_tools/00_setup — 系统基础设施
| 模块 | 说明 |
|:-----|:------|
| `agentos/main.py` | `agentos` CLI(init/check/upgrade/rebuild-vector) |
| `guardd/guardd.py` | 守护进程(心跳 + 自动化 + 数据管理)目前有 7 个模块 |
| `sync_machine.sh` | 机器同步脚本 |
#### 05_tools/05_crawl — 采集系统
| 模块 | 说明 |
|:-----|:------|
| `longcat/` | 长期爬虫(含浏览器 Profile ~400MB) |
| `content-inspiration/` | 内容灵感采集(豆包浏览器驱动) |
#### 05_tools/09_ave — 视频工厂
| 模块 | 说明 |
|:-----|:------|
| `scripts/service_layer/app.py` | 服务层 API |
| `scripts/main.py` | 主程序 |
### 4.3 技能系统(02_skills/)
| 技能 | 用途 | 状态 |
|:-----|:------|:------|
| memory_manager | 记忆提炼、冲突消解、语义检索 | ✅ |
| kb_manager | 知识库管理(新增/清洗/搜索/备份) | ✅ |
| inbox_refine | 收件箱提纯分类归档 | ✅ |
| collect_to_inbox | 内容归集到收件箱 | ✅ |
| auto_collector | 24小时自动信息收集 | ✅ |
| content_processor | 统一内容处理入口 | ✅ |
| sync_manager | 同步管理(备份/导出/迁移) | ✅ |
| matrix | 矩阵养号技能 | ✅ |
| web_crawler | 网页抓取(Scrapling/Crawl4AI) | ✅ |
---
## 第五部分:所有工作流程
### 5.1 养号流程
```
┌─ 定时触发 ─────────────────────────────────────┐
│ │
│ mc run --accounts A,B,C --blueprints X --rounds N │
│ ↓ │
│ BatchEngine │
│ ├─ 账号A: 启动 Camoufox → 执行蓝图循环 → 关闭 │
│ ├─ 账号B: 启动 Camoufox → 执行蓝图循环 → 关闭 │
│ └─ 账号C: 启动 Camoufox → 执行蓝图循环 → 关闭 │
│ ↓ │
│ 报告输出 │
│ │
│ 蓝图内步骤: goto_home → browse → like → │
│ comment → next_video → 循环 │
└─────────────────────────────────────────────────────┘
```
执行方式:
- **Dashboard 命令与任务 → 全部养号**:选身份/时间/并发 → 一键启动
- **Dashboard 命令与任务 → 批量执行**:选账号/蓝图 → 一键执行
- **CLI 直接执行**:`mc run --accounts ...`
- **定时自动化**:nurture_daily.py 调度器
### 5.2 采集流程
```
主页信息采集(collect_batch_runner.py):
启动 → 读取 accounts.yaml → 分批并行
├─ 账号A (打开浏览器 → 导航到主页 → 读取信息 → 写入 profiles.json)
├─ 账号B (同上)
└─ 账号C (同上)
→ 更新 collect_progress.json
→ 完成后通知 Dashboard
```
### 5.3 知识库流程
```
采集 → 01_submissions/ → (02:30 归集) → 00_inbox/
→ (03:00 提纯) → AI 分类 → 归档到 10_concepts/20_methods/ 等
→ 更新 README 统计
→ 更新 CHANGELOG
→ (03:30 向量重建) → ChromaDB 向量化 → 可语义检索
```
### 5.4 记忆管理流程
```
每日 02:00:
提取昨日对话 → 关键事实 (who/what/when/where/decision)
→ 去重 (L2 相似度 > 0.9 跳过)
→ 冲突检测 (Override 或提示用户)
→ 更新 L1 关键词索引
→ 更新 L1_vec 向量索引 (ChromaDB + oMLX Embedding)
→ 原文压缩写入 L3
```
### 5.5 guardd 守护进程(9 模块)
| 模块 | 功能 | 周期 |
|:-----|:------|:------|
| module_heartbeat | 心跳上报 | 每轮 |
| module_automation | 定时任务检查 | 每轮 |
| module_event_log | 事件日志 | 触发时 |
| module_knowledge_sync | 知识同步 | 每轮 |
| module_system_info | 系统信息收集 | 每轮 |
| module_git_sync | Git 同步 | 每轮 |
| module_cross_machine | 跨机数据管理 | 每轮 |
---
## 第六部分:通信与同步机制
### 6.1 数据流向
```
你 (ghai)
├─ 操作 Dashboard (http://localhost:9988)
│ └─ Dashboard 调用各 API → 操作本地文件/启动进程
│
├─ git push → Gitee/GitHub → 其他机器 git pull
│ ├─ 代码同步 (agent-sync/)
│ ├─ 运行时数据同步 (04_memory/cross_machine/)
│ │ ├─ machines/{uid}/accounts.yaml ← 各写各的
│ │ ├─ machines/{uid}/heartbeat.json ← 各写各的
│ │ ├─ events/{date}.jsonl ← 各写各的
│ │ └─ data/{uid}.json ← 各写各的
│ └─ 知识库同步 (03_knowledge/)
│
└─ SSH 远程连接
└─ mc remote exec <host> <command>
└─ SSH 到目标机器执行命令
```
### 6.2 WPRA 写分区·读聚合(当前架构, v2.0)
**写分区**:每台机器只写 `machines/{自己的UID}/` 下的文件
**读聚合**:Dashboard 读取时遍历所有机器的目录,聚合为完整视图
**已知问题**:
1. `_registry.json` 曾是多机器写冲突的根源(已修复为单实例写)
2. `git add -A` 会把所有机器的文件 staging,导致冲突
3. `accounts_registry.yaml` 单文件跨机器导致冲突(已迁移到 WPRA)
4. 架构文档说各写各的,但 guardd 的某些模块还在写全局文件
---
## 第七部分:自动化任务
### 7.1 WorkBuddy 内置自动化
| 任务 | 时间 | 状态 | 说明 |
|:-----|:------|:------|:------|
| AgentOS 每日记忆提炼 | 02:00 | ⏸ PAUSED | 提取对话→L2事实+L1索引 |
| 向量库与索引定时更新 | 02:30 | 🟢 ACTIVE | 知识库→关键词+ChromaDB |
| AgentOS 收件箱提纯 | 03:00 | ⏸ PAUSED | 收件箱→分类归档 |
### 7.2 未自动化的流程
| 流程 | 当前状态 | 问题 |
|:-----|:---------|:------|
| Git push 到远程 | 手动执行 | 夜间自动化完成后不会自动推送 |
| 工作日志生成 | 未实现 | 夜间任务完成后无汇总报告 |
| 向量重建 | 单独自动化已创建 | 但记忆提炼的向量更新已暂停 |
| 账号状态检查 | 手动 | 没有定时检查所有账号登录状态 |
| 远程机器同步 | 手动 | 需要手动 SSH 到各机器执行 git pull |
---
## 第八部分:历史问题与事故记录
### 8.1 路径问题(反复发生,4 次以上)
| 时间 | 问题 | 影响范围 |
|:-----|:------|:---------|
| 04-25 | `/Users/5kecheng/` → `/Users/chengzige/` 路径替换 | 6 个文件 |
| 04-29 | P0: 自动化 `--root` 路径失效 | 4 个自动化任务全部失效 |
| 04-29 | 旧路径 `~/agent-os` 残留 | 61 个文件 235 处引用 |
| 06-15 | Dashboard 中 12 处 `Path.home()` 硬编码 | 跨机兼容性 |
### 8.2 Git 冲突(反复发生)
| 类型 | 根因 | 频率 |
|:-----|:------|:------|
| `_registry.json` 冲突 | 多机器同时写同一个文件 | 每次同步 |
| `accounts.yaml` 冲突 | WPRA 迁移后仍有遗留 | 频繁 |
| `accounts_registry.yaml` 冲突 | 旧架构遗留文件 | 已删除 |
| 运行时数据冲突 | `git add -A` 包含所有机器数据 | 频繁 |
### 8.3 环境与依赖问题
| 问题 | 根因 | 状态 |
|:-----|:------|:------|
| orjson 代码签名 | macOS 安全策略,二进制 .so 签名不匹配 | 已修复 |
| lxml 版本冲突 | scrapling vs crawl4ai 版本要求不一致 | 已修复 |
| Qwen3-8B Chat API 500 | 模型兼容性问题 | 未修复(用 VLM 替代) |
| Camoufox 浏览器启动失败 | 依赖缺失/环境不一致 | 偶发 |
### 8.4 设计上的反复
| 事项 | 初始方案 | 当前方案 | 改了几次 |
|:-----|:---------|:---------|:---------|
| 账号注册表 | 单文件 accounts_registry.yaml | WPRA machines/{uid}/accounts.yaml | 3 次 |
| 路径结构 | `~/agent-os/`, `~/agent-os-local/` | `~/workbuddy-agent-os/agent-sync/`, `~/workbuddy-agent-os/agent-local/` | 2 次 |
| 自动同步 | 坚果云 | Git 双远程 | 2 次 |
| 本地 LLM | Ollama | oMLX | 1 次 |
| 浏览器引擎 | Chrome CDP | Camoufox (Firefox) | 1 次 |
| 架构文档 | 单机 (2.2.0) | 联邦多机 (4.0.0) | 多次重构 |
---
## 第九部分:待办与未完成事项
### 9.1 明确的待办
1. **发布功能**:`social-auto-upload` 已克隆但未整合
2. **Tailscale 安装**:本机未安装,远程执行依赖 SSH(局域网内可用)
3. **`update_vector_db.py`**:已创建但未提交到仓库
4. **夜间自动化 Git push**:记忆提炼+向量更新完成后自动推送
5. **7kecheng 角色定义**:这台机器当前账号不明,角色未定义
### 9.2 未完全解决的问题
1. **Dashboard 单页过大**:`index.html` 4000+ 行,难维护
2. **app.py 过大**:3000+ 行,包含所有 API
3. **无统一错误处理**:错误散落在各个模块
4. **无统一日志系统**:不同模块日志格式不同
5. **新机部署步骤多**:虽然 init.sh 存在,但环境依赖复杂
6. **跨机调试困难**:不知道另一台机器当前状态
### 9.3 未来想做的
根据系统文档和对话记录推测:
1. **内容发布流水线**(publishing pipeline)— 自动发布到抖音/小红书
2. **电商流水线**(ecom pipeline)— 选品/带货
3. **直播流水线**(live pipeline)— OBS 推流/互动
4. **Trae 智能体集成** — 用 TRAE 写代码
5. **远程命令控制** — 通过 Tailscale/SSH 向其他机器发送任务
6. **内容灵感采集** — 豆包热榜/即梦灵感 → 自动生成视频
---
## 第十部分:总结——系统当前的核心矛盾
### 10.1 结构性问题
```
┌─────────────────────────────────────────────────────┐
│ 1. Git 仓库 ≈ 1GB(含浏览器缓存 + 二进制 .so 文件) │
│ → push 超时、冲突不断、新机器克隆慢 │
├─────────────────────────────────────────────────────┤
│ 2. 环境依赖不一致(Python 3.9 vs 3.13, orjson 签名) │
│ → 同一代码在不同机器上行为不同 │
├─────────────────────────────────────────────────────┤
│ 3. 配置散落(部分在 agent-sync, 部分在 agent-local) │
│ → 改配置不知道会影响什么、影响哪台机器 │
├─────────────────────────────────────────────────────┤
│ 4. 无统一调度(自动化/手工/远程执行三套机制) │
│ → 哪个任务在哪个机器上跑、什么时候跑,靠人记 │
├─────────────────────────────────────────────────────┤
│ 5. 每台机器没有"全局视角"(各看各的 heartbeat) │
│ → 机器A不知道机器B现在在干什么 │
└─────────────────────────────────────────────────────┘
```
### 10.2 根本原因
**不是技术问题,是分层问题。** 代码(code)、配置(config)、运行时数据(data)三层混在一起,没有明确的边界和职责划分。每台机器的独有信息(环境差异、本地配置)和共有信息(任务规则、账号分配)也没有分开管理。
---
*本文档是 AgentOS 系统的"现在是什么"的快照,不包含任何改造方案。方案讨论请基于本文档进行。*