MatrixMedia v0.12:七平台账号数据自动统计,不逆向签名的合规取数方案

0 阅读7分钟

MatrixMedia 是一款多平台视频/图文矩阵发布工具,Electron 开源,GPL-2.0 协议。这是这个系列的第 12 篇,聊聊 v0.12 上新的「账号数据统计中心」——它能自动采集七个平台的账号数据,本地按日快照存储,还把 CLI / HTTP / MCP 三个通道全部打通,让 AI Agent 可以直接问「我昨天发的视频数据怎么样」。

为什么要做数据统计

MatrixMedia 之前解决的问题是「发出去」:一次编辑,多平台矩阵分发。但发布只是链路的一半,另一半是「发得怎么样」——粉丝涨了多少、播放量如何、哪条作品跑出来了。此前这些只能一个个平台登后台去看,账号一多就非常痛苦。

v0.12 把「账号数据」页直接设为了默认首页,打开软件第一眼就是全部账号的总览:

  • 四项总计卡片:粉丝、播放、点赞、评论的全账号汇总
  • 日 / 周 / 月趋势折线图:账号整体的增长曲线
  • 平台分布柱状图:各平台粉丝与互动的占比
  • 分组统计表格:可点击直达对应分组详情
  • 「分组 → 平台」二级侧边栏:矩阵账号多时的快速导航

数据采集覆盖七个平台:抖音、视频号、哔哩哔哩、百家号、头条、快手、小红书(番茄视频、掘金暂无数据接口)。实现上复用分组的登录态,在页面上下文里取数,本地按日快照存储——没有中心服务器,没有数据上报。你在 GUI 里登录过哪些账号,就能统计哪些账号,不需要额外配置任何 Token 或开放平台密钥。

采集的时机由你控制:可以在「账号数据」页手动触发,也可以通过下面会讲到的 CLI / HTTP / MCP 通道定时驱动。每次采集任务结束后,「拉取记录」弹窗会列出各平台的成功与失败明细,失败的具体错误信息悬停可见、点击可复制——七个平台里总有一两个偶尔抽风,把失败原因直接摆出来,比自己猜要省时间得多。

发布侧也联动了:新增「发布数据增长」tab,当你发布新作品时,会自动回填上一条作品发布至今的期间增长(封闭统计口径,每条作品的增长区间互不重叠),抖音、视频号还支持单视频涨粉字段的同步展示。这个口径设计是为了回答「这条作品到底带来了多少增长」,而不是让相邻作品的增量互相污染。

技术方案:合规取数三原则 + 三级取数策略

这部分是本次开发花时间最多、也最值得展开讲的。设计文档在仓库 docs/data-stats-design.md,这里说结论。

三原则

  1. 不逆向签名:不碰 X-Bogus / _signature 这类平台签名算法。逆向签名短期能跑通,但每次平台改算法就崩一次,而且性质上是对抗性的。
  2. 不绕风控:单并发采集、请求间隔 2~4 秒、平台之间间隔 5 秒、失败指数退避。不伪造 UA,沿用浏览器环境自带的。
  3. 数据不出本机:采集结果只写本地 <userData> 目录,导出 CSV 由用户自选路径,没有任何回传。

三级取数策略

一级:页面上下文 fetch。 用隐藏的 BrowserWindow 复用用户已登录的会话,在 page.evaluate 里用页面自己的 JS 环境发 fetch。Cookie、UA、Referer 全部由浏览器自然携带,平台侧看起来和用户人工按 F5 刷新没有区别——因为本质上就是同一套环境发出的请求。七个平台里有六个用这一级就通了。

二级:被动嗅探。 有些平台接口签名太重、签名与请求体绑定且无法在页面外调用,就退化为监听:挂 page.on('response'),让页面自己发 XHR,我们只读响应体。快手就是这套方案,配合 preload 嗅探 + 滚动列表容器驱动「加载更多」,按 workId 去重汇总。全程零逆向、零签名算法实现。

三级:主进程直取。 仅限无签名的开放接口,默认不启用。

适配器架构

每个平台一个适配器,纯配置 + pick 纯函数,不含流程逻辑。平台接口字段变了,只改对应适配器,框架和其他平台不受影响。这次修复的两个字段问题——视频号点赞/收藏映射反转、头条 repinCount 实为收藏数——都只动了适配器层。

本地存储与增量对比

快照路径为 <userData>/data-stats/<分组>/<平台>/<时间戳>.json,另维护一份 latest.json。读取时与同分组同平台的上一份快照按 workId join,算出 playDelta / likeDelta 等增量字段,UI 上展示为「较上次 +N」。默认保留 90 天。

代价明示

单分组全量采集需要 3~8 分钟。慢是合规的既定代价——我们把间隔和退避都留着,宁可不追求速度。

CLI / HTTP / MCP 三通道:让 AI Agent 能查你的数据

数据统计不只服务 GUI,三个程序化通道同步开放。

CLI

matrixmedia cli stats -p sph --phone 123
matrixmedia cli stats-sync -p dy --phone 123
matrixmedia cli stats-work -p ks --phone 123 --title "你家猫也这样睡?倒挂笼子都不醒"
  • stats 读本地快照,stats-sync 主动采集并写入快照(需该分组此平台已在 GUI 登录),stats-work 按完整标题查单个视频的发布数据(含发布时间)
  • 平台参数支持短码 dy sph blbl bjh tt ks xhs 或中文名,--phone 是分组名
  • 输出 JSON(含 success 字段),exit code 0/1/2/3,方便脚本判断

HTTP API

curl -H "Origin: http://localhost:30088" "http://localhost:30088/stats?phone=123&pt=blbl"
curl -X POST -H "Content-Type: application/json" -H "Origin: http://localhost:30088" \
  -d '{"phone":"123","pt":"sph"}' http://localhost:30088/stats/sync
方法路径说明
GET/stats?phone=<分组>&pt=<平台>读本地快照中的账号粉丝数据
POST/stats/sync主动采集
GET/stats/work?phone=<分组>&pt=<平台>&title=<标题>按完整标题查视频发布数据

守卫与发布接口一致:需 X-Matrix-Token 头或 localhost/file Origin。POST /stats/sync 返回 overview(fans/plays/likes/comments/shares/favorites)与 workCount。

MCP

MatrixMedia 自带 MCP server(stdio transport),数据统计暴露三个 tool:

工具说明
get_account_stats读账号粉丝数据(本地快照):{phone, platform}
sync_account_stats主动采集该账号最新数据:{phone, platform}
get_work_stats按完整标题查视频发布数据:{phone, platform, title}

可以直接接 DeepSeek-TUI、Claude Desktop、Cursor 等任何 MCP 客户端。实际场景:你在 AI 对话里问「我昨天发的猫视频数据怎么样」,Agent 调 get_work_stats 传入标题,直接返回播放/点赞/评论数据——数据没离开你的电脑,AI 只是替你查了本地快照。没有数据时 Agent 会先调 sync_account_stats 再查。

本版其他更新

  • 视频号短剧/剧集挂载:支持列表选择与输入搜索,不用再手动粘贴链接
  • 发布历史导出 CSV:本地留档
  • 匿名启动统计可视化开关:隐私可控
  • 稳定性修复:发布失败队列、失败截图独立超时等

感谢社区贡献者

这个版本有大量社区贡献,特别感谢:

  • ruijh(PR #20-#24):发布失败队列修复、失败截图超时、历史截图点击、CSV 导出、匿名统计开关——一个人贡献了五个 PR
  • twoicewoo(PR #25):视频号登录会话冲突修复 + Chrome 回退
  • ababa00(PR #26):短剧/剧集搜索竞态修复

社区目前已有 124 Fork,外部 PR 持续合入中。作为 maintainer 我们的姿态很简单:PR 及时审、及时合,让贡献者有正反馈。

最后

MatrixMedia 目前 GitHub Star 935、Fork 124,GPL-2.0 开源免费,支持 Windows / macOS / Linux。仓库地址:github.com/hanliang97/… ,欢迎试用、欢迎 PR。

数据统计这条线还没完,后续计划做跨分组的对比视图和更长的趋势分析。有需求或想法,欢迎在仓库 issue 里聊。


系列文章:上一篇 视频号短剧挂载功能详解