移植自 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 带网关原话 / 正常返回)。
658 lines
28 KiB
Markdown
658 lines
28 KiB
Markdown
# 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 自动复制 |
|