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 带网关原话 / 正常返回)。
This commit is contained in:
@@ -0,0 +1,235 @@
|
||||
# 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 │
|
||||
└────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 执行结果记录格式
|
||||
```jsonl
|
||||
{"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)
|
||||
```yaml
|
||||
categories:
|
||||
赞美:
|
||||
comments: ["讲得太好了"]
|
||||
templates: ["{keyword}很好"]
|
||||
```
|
||||
|
||||
### 目标结构(v2.0)
|
||||
```yaml
|
||||
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 不兼容 | 旧语料不可用 | 代码兼容两种格式 |
|
||||
Reference in New Issue
Block a user