Files
MediaCrawler/mac-agent-os-main/archive_docs/matrix_docs/FRAMEWORK_V1.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

658 lines
28 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.
# MC 系统框架设计方案 v1.1
> 最后更新: 2026-06-15
> 设计目标: 三层分离 + 平台插件化 + 联邦多机协同 + 录制回放全链路 + 原子操作蓝图系统
---
## 一、核心设计原则
1. **CLI 优先** — 所有实操通过 `mc` 命令行执行, 稳定、可脚本化、可审计
2. **三层分离** — CLI 做执行 / AI 做分析决策 / Dashboard 做展示, 各司其职
3. **平台即插件** — 新增一个平台 = 新建一个目录, 标准接口自动发现
4. **不重复造轮子** — 发布/搜索/评论等通用能力集成开源项目
5. **联邦多机** — 每台机器独立运行, 通过 SSH/HTTP 远程调用, Gitee 同步状态
6. **录制回放即技能** — 原子操作录制是核心差异化能力, 录制包 = 可分享的技能
---
## 二、整体架构
```
┌──────────────────────────────────────────────────────────────┐
│ 第1层: CLI 命令行 (最稳定层, 所有实操的唯⼀入口) │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ mc [platform] [action] --account <name> [options] ││
│ │ mc [通用] [action] [options] ││
│ │ mc remote <machine> <command> ← 远程执行 ││
│ │ mc record [start|stop|list|replay] ← 录制回放 ││
│ └──────────────────────────────────────────────────────────┘│
├──────────────────────────────────────────────────────────────┤
│ 第2层: MCP Server + AI 智能体 (分析决策, 不直接碰浏览器) │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ 每个平台插件自动生成 MCP 工具 ││
│ │ AI 智能体 → 调 MCP → 调 CLI → 读结果 → 出报告 ││
│ └──────────────────────────────────────────────────────────┘│
├──────────────────────────────────────────────────────────────┤
│ 第3层: Dashboard 看板 (只展示 + 一键触发, 不执行复杂逻辑) │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ 读 JSON 展示 / 点按钮调 CLI / 看历史趋势图表 ││
│ │ 多机聚合: 一台 Dashboard 展示所有机器状态 ││
│ └──────────────────────────────────────────────────────────┘│
├──────────────────────────────────────────────────────────────┤
│ 底座: 联邦多机同步 │
│ ┌──────────────┬──────────────┬───────────────────────────┐ │
│ │ Gitee 代码 │ SSH 远程执 │ guardd 心跳 + cross_ │ │
│ │ 同步(已有) │ 行(新增) │ machine 数据(已有) │ │
│ └──────────────┴──────────────┴───────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
```
---
## 三、CLI 命令树 (完整版)
### 3.1 平台插件命令
```
mc douyin|xiaohongshu|bilibili|kuaishou|weibo|wechat [action]
login --account <name> 登录
logout --account <name> 登出
status --account <name> 状态检查
collect --account <name> 采集主页信息
publish --account <name> 发布视频/图文
--file <path>
--title <text>
--desc <text>
nurture --account <name> 养号
--blueprint <name>
interact --account <name> 互动
--action like|comment|follow
--target <url/id>
search --keyword <text> 搜索
--limit <n>
live --room-id <id> 直播相关
record 录制原子操作(平台专属)
start 开始录制
stop 停止录制
list 列出录制包
replay <name> 回放录制包
```
### 3.2 通用管理命令
```
mc account
list [--json] 列出所有账号
create --phone <num> 创建新身份
--platform dy|xhs
delete --account <id> 删除账号
status [--json] 所有账号状态
mc sms
check --phone <num> 查短信
wait --phone <num> 等待新短信
mc config
show [--json] 查看配置
set <key> <value> 设置配置
mc record 原子操作录制(跨平台通用)
list 列出所有录制包
export <name> --output <p> 导出录制包
import <file> 导入录制包
analyze <name> 分析录制内容
mc remote 远程多机执行
exec <machine> <cmd> 在远程机器执行命令
status [--json] 所有机器状态
sync 触发全机同步
mc agent
"分析采集结果" 调 LLM 分析
"检查账号健康度"
"生成日报"
```
### 3.3 输出规范
所有命令支持 `--json` 参数, 输出标准 JSON 供 Dashboard 和 AI Agent 消费:
```bash
mc status --all --json
# → {"machines": {...}, "accounts": [...], "collected_at": "..."}
mc douyin collect --account my_name --json
# → {"status": "ok", "nickname": "...", "fans": 1303, ...}
```
---
## 四、平台插件标准
### 4.1 目录结构
```
platforms/
├── __init__.py # 插件发现: 自动扫描所有子目录
├── base.py # BasePlatform 基类
│
├── douyin/
│ ├── __init__.py # 注册: name='douyin', actions=[...]
│ ├── cli.py # mc douyin [action] 的命令实现
│ ├── collector.py # 主页信息采集 (已有collect_batch_runner)
│ ├── publisher.py # 发布 (集成social-auto-upload)
│ ├── interactor.py # 互动 (点赞/评论/关注)
│ ├── recorder.py # 录制原子操作 (平台专属)
│ ├── SKILL.md # AI Agent 调用说明
│ └── requirements.txt # 本平台额外依赖
│
├── xiaohongshu/ # 同上
│
├── bilibili/ # 发布复用 social-auto-upload
│
├── kuaishou/ # (TODO)
│
└── wechat/ # (TODO)
```
### 4.2 插件基类接口
```python
class BasePlatform:
name: str # 平台名: 'douyin'
display_name: str # '抖音'
actions: list[str] # 支持的动作列表
def login(account_name, headless=False) -> bool
def logout(account_name) -> bool
def status(account_name) -> dict
def collect(account_name) -> dict # 主页信息 → 写 homepage_info.json
def publish(account_name, file, title, desc) -> bool
def nurture(account_name, blueprint) -> bool
def interact(account_name, action, target) -> bool
def search(keyword, limit) -> list
```
### 4.3 新增平台流程
```bash
# 1. 创建插件目录
mkdir platforms/kuaishou/
# 2. 实现 base.py 中的接口
# - 最简单的: 只实现 status(), 其他返回 "暂不支持"
# - 完整版: 逐步实现 login/collect/publish ...
# 3. 注册插件
# platforms/kuaishou/__init__.py:
# register_platform(KuaishouPlatform())
# 4. 完成。mc 自动发现:
# mc kuaishou status --account my_account
```
---
## 五、录制回放系统 (核心差异化能力)
### 5.1 定位
录制回放是 MC 系统区别于纯开源方案的核心能力。通过录制鼠标/键盘操作, 将人的操作经验转化为可复用的"技能包", 在同平台的不同账号间共享。
### 5.2 架构
```
录制阶段:
人操作浏览器 → mc record start → 记录鼠标/键盘事件 → mc record stop
→ 保存为 platforms/douyin/recordings/login.skill (JSON)
回放阶段:
mc douyin record replay login.skill --account my_name
→ 按时间轴回放鼠标/键盘事件 → 完成登录
分享阶段:
mc record export login.skill → 得到 .skill 文件
→ 提交到 Gitee → 其他机器 mc record import → 直接可用
```
### 5.3 与三层架构的融合
- **CLI 层**: `mc record list|start|stop|replay|export|import`
- **平台插件**: 每个平台可以有专属的录制包 (抖音的登录流程 vs 小红书的登录流程不同)
- **跨平台**: 通用的录制包 (如"通用浏览") 放在 `recordings/` 根目录
- **Dashboard**: 录制管理界面保留, 但改为调 CLI 执行
### 5.4 录制包格式规范 (JSON)
```json
{
"name": "douyin_login_20260614",
"platform": "douyin",
"created_at": "2026-06-14T22:00:00",
"steps": [
{"time": 0, "action": "navigate", "url": "https://www.douyin.com/"},
{"time": 3000, "action": "click", "selector": ".login-btn", "x": 350, "y": 680},
{"time": 5000, "action": "wait", "duration": 30000},
{"time": 35000, "action": "check_login", "expected": true}
]
}
```
---
## 六、原子操作 + 蓝图系统
### 6.1 三层模型
```
录制 (record)
↓ 捕捉用户在浏览器上的操作
原子操作 (atom) = {前置状态锚点, 操作步骤, 后置状态验证}
↓ 组合串联成工作流
蓝图 (blueprint) = 有向无环图 (DAG) 的原子序列
↓ 打包发布为 CLI 命令
CLI 命令 = mc [platform] [blueprint_name] --account <name>
```
### 6.2 原子操作的数据结构
每个原子操作是一个自包含的"操作单元":
```json
{
"name": "douyin_like_video",
"category": "interact",
"platform": "douyin",
"version": 1,
"description": "点赞当前播放的视频",
"before": {
"url_pattern": "https://www.douyin.com/**",
"dom_anchor": ".video-player",
"logged_in": true
},
"steps": [
{"type": "wait", "target": ".like-btn", "timeout": 5000},
{"type": "click", "target": ".like-btn", "xpath": "//div[contains(@class, 'like')]"},
{"type": "verify", "check": ".like-btn.active"}
],
"after": {
"dom_check": ".like-btn.active"
}
}
```
### 6.3 蓝图的 DAG 结构
蓝图 = 多个原子操作按顺序或条件连接成有向无环图:
```
┌─────────┐
│ 登录检测 │
└────┬────┘
│ 未登录
┌────▼────┐
│ 扫码登录 │
└────┬────┘
│ 已登录
┌────▼────┐
│ 打开首页 │
└────┬────┘
┌────▼────┐
│ 浏览推荐 │ ← 循环 5 次
└────┬────┘
┌────▼────┐
│ 随机点赞 │ ← 30% 概率
└────┬────┘
┌────▼────┐
│ 等待 8秒 │
└────┬────┘
┌────▼────┐
│ 滚动加载 │
└─────────┘
```
蓝图 JSON:
```json
{
"name": "douyin_daily_browse",
"platform": "douyin",
"description": "日常浏览推荐页, 随机点赞",
"version": 2,
"nodes": [
{"id": "check_login", "atom": "check_login", "position": {"x": 100, "y": 0}},
{"id": "goto_home", "atom": "goto_home", "position": {"x": 100, "y": 80}},
{"id": "browse", "atom": "wait_watch", "position": {"x": 100, "y": 160}},
{"id": "like", "atom": "like", "position": {"x": 100, "y": 240}, "probability": 0.3},
{"id": "scroll", "atom": "scroll_feed", "position": {"x": 100, "y": 320}}
],
"edges": [
{"from": "check_login", "to": "goto_home"},
{"from": "goto_home", "to": "browse"},
{"from": "browse", "to": "like"},
{"from": "like", "to": "scroll"}
]
}
```
### 6.4 与 Dashboard 可视化编辑器的关系
Dashboard 的 **矩阵管理页 (matrix_mgmt.html) 已有 SVG DAG 节点编辑器**。
蓝图编排流程:
```
打开 Dashboard → 矩阵管理 → 蓝图编排 tab
│
├─ 左侧节点面板: 列出所有可用原子操作 (按平台/分类)
│ 登录类 | 浏览类 | 互动类 | 工具类
│
├─ 中间画布: 拖拽原子到画布, 连线编排
│ 支持: 顺序 / 条件分支 / 循环 / 概率
│
└─ 右侧属性面板: 配置选中节点的参数
等待时间 | 点击概率 | 目标选择器
编辑完成后:
→ 保存为 blueprint.json → 存入 blueprints/ 目录
→ CLI 直接调用: mc douyin nurture --blueprint douyin_daily --account my_name
→ 或用录制功能生成新原子: mc record start → 操作 → mc record stop → 自动生成原子
```
### 6.5 录制 → 原子 → 蓝图 → CLI 全链路
```
步骤1: 录制
mc record start ← 打开浏览器, 开始录制
→ 人在浏览器上操作 (点赞/评论/浏览...)
mc record stop ← 停止录制
→ 生成 raw_recording.json (时间轴事件序列)
步骤2: 提炼原子
mc record refine raw_recording.json ← AI 辅助提炼
→ 生成 atom.json (结构化原子操作, 含前后状态)
步骤3: 组合蓝图
Dashboard DAG 编辑器 ← 拖拽编排
或 CLI: mc blueprint compose --atoms a1,a2,a3
→ 生成 blueprint.json
步骤4: 打包发布
mc blueprint publish douyin_daily_v3 ← 注入 blueprints/
→ 自动生成 CLI 入口
mc douyin nurture --blueprint douyin_daily_v3 --account my_name
```
### 6.6 适配界面版本更新
当平台改版 (DOM 结构变化), 旧原子可能失效。方案:
1. **录制新操作**: `mc record start` → 在新版界面上操作 → `mc record stop`
2. **对比旧原子**: `mc record diff old_atom.json new_recording.json`
3. **自动修补**: AI 分析差异, 更新选择器/css/xpath
4. **版本管理**: 原子带 `version` 字段, 旧版蓝图可指定使用旧版原子
---
## 七、联邦多机协同方案
### 6.1 现状评估
| 能力 | 当前状态 | 评价 |
|------|:-------:|:----:|
| 代码同步 | Gitee push/pull | ✅ 够用 |
| 数据同步 | cross_machine 目录 | ✅ 够用 |
| 心跳检测 | guardd (300s 周期) | ⚠️ 基本够用, 但不够实时 |
| 远程执行 | ❌ 无 | 需开发 |
| 中央调度 | ❌ 无 | 按需 |
### 6.2 远程执行方案
最简单的方案: **SSH 包装 + 各机器 HTTP API**
```bash
# 方案A: SSH 远程执行 (简单可靠)
mc remote exec chengzigedeAir "mc douyin collect --account my_name"
# → ssh chengzigedeAir "cd ~/agent-os/... && python mc collect ..."
# 方案B: HTTP API 远程执行 (无需 SSH 配置)
mc remote exec chengzigedeAir "mc douyin collect"
# → curl http://chengzigedeAir:9988/api/cli/run
# (每台机器 Dashboard 新增 /api/cli/run 端点)
# 方案C: 集群广播
mc remote exec --all "mc collect --all"
# → 同时在所有机器上执行采集
```
推荐方案: **B + A 双通道**。默认走 HTTP API (配置了 SSH 的机器可选 SSH)。
### 6.3 机器注册与管理
每台机器在首次部署时, 在 cross_machine/machines/ 下注册:
```yaml
# cross_machine/machines/7kecheng.yaml
hostname: 7kecheng
ip: 192.168.31.96
port: 9988
ssh_user: 7kecheng
capabilities: [douyin, xiaohongshu] # 这台机器能操作哪些平台
local_accounts: 11 # 本机账号数
```
### 6.4 guardd 替换方案: 从 Gitee 迁移到 Tailscale
#### 当前 guardd 的问题
guardd 每 300s 往 Gitee 仓库的 `04_memory/cross_machine/` 写心跳文件:
```
问题1: 每次 git status 都有 10 个文件被修改, 分不清是心跳还是真改动
问题2: 多机同时写 Gitee 导致 push/pull 冲突
问题3: 心跳延迟 (Gitee push 不是实时的)
问题4: 仓库里混入大量无意义的自动生成文件
```
**核心矛盾: Git 是版本管理工具, 不是实时状态同步工具。把心跳数据放 Gitee 是架构错误。**
#### 替换方案: 本地状态 + Tailscale 即时查询
```
┌────────────────────────────────────────────────────────┐
│ 部署前: guardd → Gitee (10个json频繁更新, 冲突不断) │
│ │
│ 部署后: 各机本地存状态 + 需查询时走 Tailscale HTTP API │
│ │
│ Gitee 仓库只保留: │
│ 代码 + 配置 + cross_machine/machines/ (机器注册, │
│ 几乎不变) │
│ │
│ 各机本地保留: │
│ agent-local/tools/matrix/data/status.json │
│ (心跳数据, 不参与 Gitee 同步) │
│ │
│ 实时查询: │
│ mc remote status → 通过 Tailscale 查各机 API │
│ 实时返回, 无冲突, 无延迟 │
└────────────────────────────────────────────────────────┘
```
#### 具体实施
```
步骤1: guardd 停止写 Gitee 的 cross_machine/data/
→ 改为写本机 agent-local/tools/matrix/data/guardd_status.json
→ 文件格式不变, 只是换了个目录
步骤2: guardd 不再提交 git
→ 从 guardd.py 中去掉 git add/commit/push 步骤
→ cross_machine/data/*.json 文件不再被更新
步骤3: Gitee 仓库清理
→ 把 04_memory/cross_machine/data/ 加入 .gitignore
→ 一次性提交删除历史心跳文件
→ 以后 git status 不再被心跳文件污染
步骤4: 即时状态替代
→ 每台机器 Dashboard 提供 /api/machine/status 端点
→ mc remote status 通过 Tailscale 查各机
→ 实时, 无冲突, 零延迟
```
#### 对比
| 维度 | guardd (当前) | guardd (改造后) | mc remote |
|------|:------------:|:---------------:|:---------:|
| 存储位置 | Gitee 仓库 | 本机 local 目录 | 内存 + API |
| 更新频率 | 300s | 300s 或更长 | 即时查询 |
| Git 冲突 | ⚠️ 频繁 | ✅ 完全没有 | ✅ 不涉及 Git |
| 实时性 | ❌ 有延迟 | ❌ 有延迟 | ✅ 实时 |
| 历史记录 | ✅ 有 | ✅ 仍保留 | ❌ 无 (可加日志) |
**结论: guardd 保留, 但停止写 Gitee。改为写本机 + `mc remote` 做即时查询。** (2026-06-14 已实施)
### 6.5 `mc remote` 命令(已实现)
```bash
mc remote list # 列出已注册机器(来源: 本机machines.json + cross_machine/machines/)
mc remote ping [host] # 连通性测试 (调用 /api/health)
mc remote status [host] # 获取所有/指定机器完整状态 (调用 /api/machine/status)
mc remote exec <host> <cmd> # 在远程机器执行 mc 命令 (调用 /api/machine/exec)
```
**通信方式 (--via):**
- `auto` (默认): 先试 HTTP API (Tailscale IP:9988), 失败自动回退 SSH
- `http`: 强制走 HTTP API (Dashboard 端点)
- `ssh`: 强制走 SSH 通道
**Dashboard 新增端点 (均已在 app.py 实现):**
```python
GET /api/machine/status # 本机完整状态 (系统/矩阵/采集/磁盘/guardd)
POST /api/machine/exec # 远程执行 mc 命令 (白名单安全限制)
```
**Tailscale 安装 (可选, 但强烈推荐):**
```bash
brew install tailscale # 每台机器都安装
tailscale up # 登录同一账号, 获得 100.x.x.x IP
# 之后 mc remote 通过该加密 IP 通信, 跨网络、跨子网、端到端加密
```
---
## 七、与开源项目的集成边界
| 功能 | 策略 | 具体方案 |
|------|:----:|----------|
| **抖音采集主页** | 🏗️ 自研 | 已有的 collect_batch_runner, 优势是联邦多机+批量错峰 |
| **小红书采集主页** | 🏗️ 自研 | Camoufox 方式, 修"我"按钮断点 |
| **录制回放** | 🏗️ 自研 | ⭐ 核心差异化能力, 开源项目没有 |
| **抖音发布视频** | 📦 集成 | social-auto-upload 的 douyin_uploader |
| **小红书发布笔记** | 📦 集成 | social-auto-upload 的 xiaohongshu_uploader |
| **B站发布** | 📦 集成 | social-auto-upload 的 bilibili uploader (本身用的 biliup) |
| **小红书搜索/评论** | 📦 集成 | xiaohongshu-mcp (12.4k stars) |
| **抖音搜索/下载** | 📦 参考 | 参考 dy-cli 的设计, 自己实现 |
| **抖音互动** | 🏗️ 自研 | 已有原子操作库, 集成到插件 |
| **反检测** | 📦 融合 | 引入 dy-cli 的高斯抖动 + 指数退避 |
| **联邦多机** | 🏗️ 自研 | ⭐ 核心差异化能力, 开源项目没有 |
| **多账号矩阵管理** | 🏗️ 自研 | ⭐ 核心差异化能力, 开源项目没有 |
---
## 八、四阶段落地路线
### 第一阶段: 命令行统一 (已完成 ✓)
**目标: 所有操作能通过 mc 完成, 底层不改。**
- [x] 清理 41 个遗留脚本 → 归档到 `scripts/archive/` + `LEGACY_INDEX.md`
- [x] 规范 `mc collect` 命令 (包装 collect_batch_runner)
- [x] 规范 `mc login` / `mc status` / `mc sms` / `mc proxy`
- [x] 所有命令支持 `--json` 输出
- [x] `mc status --all --json` 整合系统+采集+账号列表
- [x] 平台插件路由: `mc douyin|xiaohongshu [action]`
- [x] `mc remote` 远程多机: list/ping/status/exec (HTTP + SSH 双通道)
- [x] `mc task` 智能任务: comment/search/collect/reply
- [x] `mc record` 原子操作录制: start/analyze/export/list/delete
- [x] `mc op` 原子操作注册/删除/列表
- [x] `mc schedule` 定时任务: list/add/remove/start/history
### 第二阶段: 平台插件化 (已完成 ✓)
**目标: 插件架子搭好, 扩展零成本。**
- [x] 建 `platforms/` 目录 + `BasePlatform` 基类 + 自动发现
- [x] 抖音插件: 实现 login/collect/publish/nurture (plugin.py)
- [x] 小红书插件: 实现 login/collect/publish/nurture (plugin.py)
- [x] mc 自动发现 `platforms/` 下的插件
- [x] 录制系统整合: `mc record` 通用 + 平台专属
- [x] 各插件附带 SKILL.md (AI Agent 调用说明)
### 第三阶段: 接入开源生态 (大部分完成)
**目标: 白嫖开源项目的能力。**
- [x] `mc douyin publish` / `mc xhs publish` → publish_video.py (Camoufox)
- [x] 反检测: 高斯抖动 + 指数退避 + 拟人化操作 (anti_detection.py)
- [x] social-auto-upload 已 clone (`~/workbuddy-agent-os/social-auto-upload/`)
- [ ] `mc douyin publish --sau` → 调 social-auto-upload 的 douyin_uploader
- [ ] `mc xhs publish --sau` → 调 social-auto-upload 的 xiaohongshu_uploader
- [ ] `mc bilibili publish` → 调 biliup
- [ ] `mc xhs search` → 调 xiaohongshu-mcp
### 第四阶段: 联邦多机 + 持续扩展 (已完成 ✓)
**目标: 万物皆可接, 多机协作。**
- [x] `mc remote exec` 远程执行 (HTTP + SSH 双通道)
- [x] `mc remote status` 多机状态
- [x] `mc remote list` / `mc remote ping` 机器管理
- [x] Dashboard 合并 (统一迁移到 index.html, 301 重定向)
- [x] 采集历史版本化 (时间戳快照 + timeline.json)
- [x] Tailscale 已安装 (brew install tailscale)
- [ ] `tailscale up` 配置 Tailscale 网络
- [ ] MCP Server: 每个插件自动生成 MCP 工具
### 第五阶段: 模板统一 + 采集稳定化 (新增)
**目标: 跨机模板一致, 采集结果可靠, 禁用 Chrome 引擎。**
- [x] 决策记录: Chrome CDP 禁用 (养号/采集只能用 Camoufox)
- [x] 决策记录: 采集改为导航到个人中心页 (/user/self)
- [x] 决策记录: 配置模板统一存入仓库
- [ ] config_template/ 全面审核: accounts.yaml / ai.yaml / schedule.yaml / profiles.json / screen_layout.yaml / sms.yaml / tasks.yaml
- [ ] 采集脚本: xiaohongshu 增加重试逻辑 (最多 3 次, 指数退避)
- [ ] 采集脚本: 抖音改为导航到 /user/self 个人页提取准确数据
- [ ] 展示层统一: mc account list 合并 display_name + 采集昵称/粉丝
- [ ] Dashboard 合并: 身份账号 tab 和采集信息 tab 统一为一个数据源
- [ ] 新机部署: install.sh 从 config_template 初始化本地配置
---
## 九、决策记录
| 决策 | 选项 | 选择 | 原因 |
|------|------|:----:|------|
| 浏览器窗口 | 显示/隐藏 | **显示** | 防封号+能看到进度+需要模拟鼠标 |
| 首发发布平台 | 抖音/小红书 | **抖音** | 用户量大 |
| Dashboard | 合并/保留 | **合并** | 减少混乱 |
| 遗留脚本 | 删除/归档 | **归档** | 万一需要还能找回 |
| 采集历史 | 快照/新覆盖 | **快照** | 看得出变化趋势 |
| 改造范围 | 先本机/全改 | **先本机** | 跑通再同步 |
| 仓库策略 | 同仓库/单独仓库 | **同仓库** | 矩阵系统嵌入 agent-sync 仓库内, 与 agent-os 共享工具链和同步机制; 降低管理成本, 避免双仓库冲突 |
| 浏览器引擎 | Chrome CDP / Camoufox | **Camoufox** | Chrome CDP 经实测会触发平台反爬封号, 所有养号/采集/发布操作统一使用 Camoufox (Firefox 内核) ; **Chrome 仅限调试**, 禁止用于生产操作 |
| 采集方式 | 个人页/首页 | **个人页** | 首页 DOM 扫描提取的粉丝数/关注数不可靠, 改为导航到 `/user/self` 个人中心页提取准确数据 |
| 跨机模板 | 独立管理/仓库统一 | **仓库统一** | 所有配置模板 (config_template/)、蓝图 (blueprints/)、平台插件 (platforms/) 统一存放在 agent-sync 仓库, 各机器 git pull 同步, 避免机器间模板不一致导致的运行差异 |
---
## 十、风险管理
| 风险 | 概率 | 影响 | 应对 |
|:----|:----:|:----:|------|
| 开源项目停更 | 中 | 发布功能断 | 插件架构可换底层 |
| 平台反爬升级 | 高 | 采集/发布失效 | 反检测独立层, 单独升级 |
| 多机 SSH 配置复杂 | 低 | 远程执行用不了 | HTTP API 兜底, 不强制 SSH |
| 录制回放兼容性 | 中 | 跨版本录制包失效 | 录制包带版本号, 向前兼容 |
| Dashboard 合并工作量 | 中 | 阶段投入多 | 最后阶段再做, 先用两个 |
| Chrome CDP 封号 | 已发生 | 账号被封 | **全面禁止 Chrome CDP** 用于生产操作, 所有养号/采集/发布统一使用 Camoufox (Firefox) ; Chrome 仅限开发调试 |
| 跨机模板不一致 | 中 | 行为差异/配置错误 | 模板统一存入 agent-sync 仓库, 新机 deploy 从模板初始化, install.sh 自动复制 |