移植自 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 带网关原话 / 正常返回)。
8.4 KiB
8.4 KiB
Matrix 系统全面升级规划框架 v6.0
日期: 2026-06-14 | 状态: 规划阶段 本文件定义全部需求,拆解为可执行的任务清单
一、身份与账号 → 主页信息增强
现状
profiles.json 已采集 fans、posts、following、likes 字段,但前端卡片未展示。
改动
在身份与账号页面的平台行中增加:
🎵 抖音 ✅ ✅ ✅ 2次 小美养生茶 📊1.1k粉 📹11作 🔑 🚫 🗑
在 api_sms_accounts 返回数据中透传 fans、posts、following、likes 字段。
二、命令与任务 → 信息采集模块重构
当前问题
- 页面太简单,只有一个下拉+两个按钮
- 只能按账号选,不能按身份/身份的平台选
目标结构
┌─ 👤 信息采集 ──────────────────────────────────┐
│ │
│ 选择范围: [按身份 ▾] [按平台 ▾] [按账号 ▾] │
│ │
│ ┌─ 可选列表(按选择范围动态展示)───────────────┐ │
│ │ ☑ 📱 15370103682 │ │
│ │ ├ ☑ 🎵 抖音 (小美养生茶) │ │
│ │ └ ☐ 📕 小红书 (xhs_01) │ │
│ │ ☐ 📱 13382504284 │ │
│ │ └ ☐ 🎵 抖音 (douyin_133) │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ [👤 执行选中] [📋 全部采集] │
│ │
│ 采集日志: │
│ ✅ douyin_test 采集完成 → 小美养生茶(1.1k粉) │
│ ⏳ xhs_01 采集中... │
└───────────────────────────────────────────────────┘
采集范围切换逻辑
- 按身份:显示手机号列表,勾选后该身份下所有平台都采集
- 按平台:显示抖音/小红书列表,勾选后所有该平台的账号都采集
- 按账号:显示所有账号列表(当前方式)
三、定时任务 → 完整可执行系统
当前状态
mc/scheduler.py 已实现:
- YAML 配置读取
- cron 表达式支持(
time: "09:00"格式) - 自动执行 mc run 命令
- 日志记录
缺少的:
- Dashboard 创建/编辑/启停管理
- 历史执行记录
- 执行结果回传(成功/失败)
- 跨机器独立运行
- 命令行 mc schedule 完整子命令
目标架构
┌─ 定时任务系统 ───────────────────────────────────┐
│ │
│ 配置层:config/schedule.yaml │
│ schedules: │
│ douyin_daily: │
│ enabled: true │
│ account: douyin_test │
│ blueprint: douyin_daily │
│ rounds: 3 │
│ time: "09:00" │
│ days: "1,2,3,4,5,6,7" # 每周运行日 │
│ │
│ 调度层:mc/scheduler.py │
│ - 30秒轮询检查 │
│ - 到达时间→执行 mc run │
│ - 记录结果到 logs/schedule_{date}.jsonl │
│ │
│ 管理层:Dashboard │
│ - 任务列表(显示/编辑/删除/启停) │
│ - 历史记录(最近20次执行结果) │
│ - 手动触发执行 │
│ │
│ CLI层:mc schedule │
│ mc schedule list │
│ mc schedule add --id xxx ... │
│ mc schedule remove --id xxx │
│ mc schedule start/stop │
│ mc schedule history --id xxx │
└────────────────────────────────────────────────────┘
执行结果记录格式
{"id":"douyin_daily","time":"09:00","date":"2026-06-14","status":"success","success":12,"failed":1,"duration":180}
{"id":"douyin_daily","time":"09:00","date":"2026-06-15","status":"failed","error":"Cookie expired","duration":5}
跨机器执行
- 每台机器独立运行 scheduler.py
- 从本地 accounts.yaml 读取账号
- 使用本地 profiles.json
- 结果写入本地 logs/
四、语料库 → 全面升级 + 移到命令与任务
当前结构(v1.x)
categories:
赞美:
comments: ["讲得太好了"]
templates: ["{keyword}很好"]
目标结构(v2.0)
version: "2.0"
# 三维语料模型:身份 × 场景 × 内容
personas:
health_lover:
name: "养生爱好者"
tags: ["养生", "健康"]
scenes:
first_comment:
label: "首次评论"
rules: ["与视频内容相关"]
follow_up:
label: "跟帖回复"
rounds: 2
content:
health_lover.first_comment:
- "这个养生方法很实用"
health_lover.follow_up.round_1:
- "确实如此,{keyword}我也是这么认为的"
# AI 生成配置
ai:
provider: openai
model: gpt-4o-mini
temperature: 0.8
prompt_template: |
你是一个{persona},请对视频"{title}"发表{direction}评论。
要求:{rules}
# 故事线/对话脚本
storylines:
douyin_hot_topic:
name: "抖音热门话题讨论"
script:
- scene: intro
text: "最近{keyword}这个事我也关注了"
- scene: develop
text: "其实这个事情要从几个方面看..."
- scene: reply_expected
text: "你觉得呢?"
Dashboard 语料库管理
命令与任务 → 语料库 TAB
├─ TAB: 按身份 — 选择身份→查看/编辑评论模板
├─ TAB: 按场景 — 首次评论/跟帖回复/作者回复
├─ TAB: 按故事线 — 创建/编辑对话脚本
├─ TAB: AI 生成 — 配置 API Key/模型/提示词模板
└─ TAB: 统计 — 语料总量/各分类数量/使用频率
五、批量执行 → 自动刷新 + 参数完整性
当前状态
- 账号列表:每次
loadMatrixRun调用时从 API 获取 ✅ 自动更新 - 蓝图列表:同上 ✅ 自动更新
- 执行参数:轮数/轮间隔/账号间延迟/混合随机/语料分类/代理策略
需要确认的
| 参数 | 状态 |
|---|---|
| --accounts | ✅ 自动从 API 获取 |
| --blueprints | ✅ 自动从 API 获取 |
| --rounds | ✅ 有 |
| --interval | ✅ 有 |
| --stagger | ✅ 有(新增) |
| --mix | ✅ 有 |
| --corpus | ✅ 有(但需确认是否生效) |
| --proxy | ✅ 有 |
| --keep | ❌ 预览和执行都缺少 |
修复
--keep参数在batchPreview和batchExecute中补全
六、实施路线
| 阶段 | 内容 | 优先级 | 工作量 |
|---|---|---|---|
| P1 | 身份与账号增加粉丝/视频数展示 | 高 | 0.5天 |
| P2 | 信息采集模块重构(三维选择) | 高 | 1天 |
| P3 | 定时任务完善(历史+结果+管理) | 高 | 2天 |
| P4 | 语料库 v2 + Dashboard 管理 | 中 | 3天 |
| P5 | 批量执行参数补全 + 自动刷新 | 中 | 0.5天 |
| P6 | 同步文档 + 其他机器部署 | 高 | 1天 |
七、风险与依赖
| 风险 | 影响 | 缓解 |
|---|---|---|
| scheduler.py 当前只解析 time,不支持 cron 全语法 | 定时灵活性 | 先保持 time 格式兼容,后续扩展 |
| profiles.json 中粉丝/视频数据可能为空(未采集) | 展示不全 | 为空时显示"-",提示用户采集 |
| 语料库 v2 格式与 v1 不兼容 | 旧语料不可用 | 代码兼容两种格式 |