移植自 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 带网关原话 / 正常返回)。
28 KiB
MC 系统框架设计方案 v1.1
最后更新: 2026-06-15 设计目标: 三层分离 + 平台插件化 + 联邦多机协同 + 录制回放全链路 + 原子操作蓝图系统
一、核心设计原则
- CLI 优先 — 所有实操通过
mc命令行执行, 稳定、可脚本化、可审计 - 三层分离 — CLI 做执行 / AI 做分析决策 / Dashboard 做展示, 各司其职
- 平台即插件 — 新增一个平台 = 新建一个目录, 标准接口自动发现
- 不重复造轮子 — 发布/搜索/评论等通用能力集成开源项目
- 联邦多机 — 每台机器独立运行, 通过 SSH/HTTP 远程调用, Gitee 同步状态
- 录制回放即技能 — 原子操作录制是核心差异化能力, 录制包 = 可分享的技能
二、整体架构
┌──────────────────────────────────────────────────────────────┐
│ 第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 消费:
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 插件基类接口
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 新增平台流程
# 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)
{
"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 原子操作的数据结构
每个原子操作是一个自包含的"操作单元":
{
"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:
{
"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 结构变化), 旧原子可能失效。方案:
- 录制新操作:
mc record start→ 在新版界面上操作 →mc record stop - 对比旧原子:
mc record diff old_atom.json new_recording.json - 自动修补: AI 分析差异, 更新选择器/css/xpath
- 版本管理: 原子带
version字段, 旧版蓝图可指定使用旧版原子
七、联邦多机协同方案
6.1 现状评估
| 能力 | 当前状态 | 评价 |
|---|---|---|
| 代码同步 | Gitee push/pull | ✅ 够用 |
| 数据同步 | cross_machine 目录 | ✅ 够用 |
| 心跳检测 | guardd (300s 周期) | ⚠️ 基本够用, 但不够实时 |
| 远程执行 | ❌ 无 | 需开发 |
| 中央调度 | ❌ 无 | 按需 |
6.2 远程执行方案
最简单的方案: SSH 包装 + 各机器 HTTP API
# 方案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/ 下注册:
# 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 命令(已实现)
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), 失败自动回退 SSHhttp: 强制走 HTTP API (Dashboard 端点)ssh: 强制走 SSH 通道
Dashboard 新增端点 (均已在 app.py 实现):
GET /api/machine/status # 本机完整状态 (系统/矩阵/采集/磁盘/guardd)
POST /api/machine/exec # 远程执行 mc 命令 (白名单安全限制)
Tailscale 安装 (可选, 但强烈推荐):
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 完成, 底层不改。
- 清理 41 个遗留脚本 → 归档到
scripts/archive/+LEGACY_INDEX.md - 规范
mc collect命令 (包装 collect_batch_runner) - 规范
mc login/mc status/mc sms/mc proxy - 所有命令支持
--json输出 mc status --all --json整合系统+采集+账号列表- 平台插件路由:
mc douyin|xiaohongshu [action] mc remote远程多机: list/ping/status/exec (HTTP + SSH 双通道)mc task智能任务: comment/search/collect/replymc record原子操作录制: start/analyze/export/list/deletemc op原子操作注册/删除/列表mc schedule定时任务: list/add/remove/start/history
第二阶段: 平台插件化 (已完成 ✓)
目标: 插件架子搭好, 扩展零成本。
- 建
platforms/目录 +BasePlatform基类 + 自动发现 - 抖音插件: 实现 login/collect/publish/nurture (plugin.py)
- 小红书插件: 实现 login/collect/publish/nurture (plugin.py)
- mc 自动发现
platforms/下的插件 - 录制系统整合:
mc record通用 + 平台专属 - 各插件附带 SKILL.md (AI Agent 调用说明)
第三阶段: 接入开源生态 (大部分完成)
目标: 白嫖开源项目的能力。
mc douyin publish/mc xhs publish→ publish_video.py (Camoufox)- 反检测: 高斯抖动 + 指数退避 + 拟人化操作 (anti_detection.py)
- social-auto-upload 已 clone (
~/workbuddy-agent-os/social-auto-upload/) mc douyin publish --sau→ 调 social-auto-upload 的 douyin_uploadermc xhs publish --sau→ 调 social-auto-upload 的 xiaohongshu_uploadermc bilibili publish→ 调 biliupmc xhs search→ 调 xiaohongshu-mcp
第四阶段: 联邦多机 + 持续扩展 (已完成 ✓)
目标: 万物皆可接, 多机协作。
mc remote exec远程执行 (HTTP + SSH 双通道)mc remote status多机状态mc remote list/mc remote ping机器管理- Dashboard 合并 (统一迁移到 index.html, 301 重定向)
- 采集历史版本化 (时间戳快照 + timeline.json)
- Tailscale 已安装 (brew install tailscale)
tailscale up配置 Tailscale 网络- MCP Server: 每个插件自动生成 MCP 工具
第五阶段: 模板统一 + 采集稳定化 (新增)
目标: 跨机模板一致, 采集结果可靠, 禁用 Chrome 引擎。
- 决策记录: Chrome CDP 禁用 (养号/采集只能用 Camoufox)
- 决策记录: 采集改为导航到个人中心页 (/user/self)
- 决策记录: 配置模板统一存入仓库
- 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 自动复制 |