ApiCatcher开放实时同步协议 - 将 iOS / Android 设备上捕获的HTTP流量实时推送至您的接收器

ApiCatcher开放实时同步协议 - 将 iOS / Android 设备上捕获的HTTP流量实时推送至您的接收器

ApiCatcher 在 iOS 和 Android 上用 VPN 抓 App 的 HTTP/HTTPS 流量,不用把手机挂到电脑代理。

抓到的数据只存在设备上,以前如果你要把流量接到自己的系统——安全检测、跑分析——就得等导出 HAR,再拷到电脑上,实时性很差,且无法做自动化。

现在可以把流量推出去。按 Real-time Sync Protocol 写一个接收器,手机上的包会经 WebSocket 推到你的服务。Desktop、Burp 扩展也是这么接的。


流量怎么从手机实时推到接收端

VPN 拦住 HTTP/HTTPS 之后,请求还在走,抓包进程就已经按生命周期往外推,不必等整条结束,也不必在手机里先攒一份完整记录。

目标 App 发请求
    ↓
ApiCatcher VPN 解密、抓到请求/响应
    ↓
按事件拆成 JSON 帧(边抓边推)
    ↓
WebSocket  ws://局域网IP:端口
    ↓
你的接收器按 requestId 拼成完整请求

接收端开 WebSocket Server,App 当 Client。目前只支持局域网明文 ws://。推过去的是一串 JSON 帧,不是会话结束时的一个文件。

一条请求拆成:

req_start → req_body* → res_start → res_body* → req_end

req_start 先到,只有 URL、方法、请求头。Body 读到大约 16KB~32KB 就推一片(req_body / res_body,Base64),大文件拆开推,VPN 进程不用把整份 Body 先读进内存。响应头到了发 res_start。整条结束发 req_end,带上有没有出错,以及发送、等待、接收各花了多少毫秒。

并发请求会交叉推,靠 requestId 区分。接收端按这个 ID 拼,收到 req_end 才算完整。断线后 App 会重连。

一帧大概是:

{
  "type": "http",
  "requestId": "550e8400-e29b-41d4-a716-446655440000",
  "event": "req_start",
  "timestamp": 1711268370123,
  "payload": {
    "url": "https://api.example.com/data",
    "method": "POST",
    "httpVersion": "HTTP/1.1",
    "headers": [{"name": "User-Agent", "value": "ApiCatcher/1.0"}]
  }
}

不想自己解析分片,可以用 Java SDK。一条请求拼完后,回调一条 HAR 1.2 entry。

规范:https://github.com/apicatcher/apicatcher-realtime-sync-protocol/blob/main/README_zh.md


借助ApiCatcher的实时同步功能,这些场景都能完全自动化

这类工作现在都要先导出 HAR,再拷到电脑丢给工具。每做一轮就得有人导一次,整条链路没法自动化。接上实时同步,请求直接推到你的接收器,分析、更新文档、出报告都可以自动跑,不用再靠人手导文件。

抓包生成 OpenAPI、导入 Postman

OpenAPI、Postman 集合通常是抓完包导出 HAR,再用 har-to-openapihar2api 转一版。发版后接口变了,这份东西就过时。接上实时同步,自己在接收端分析新来的请求、对比已有 API,字段有变化就改文档,文档能一直跟着接口走。

HAR 转 k6 / JMeter 压测脚本

k6、JMeter 也常从 HAR 转,比如 Grafana 的 HAR → k6。接口一变,脚本对不上,又得重新导。接收器里按真机上实际发过的请求出脚本,路径和参数变了,下一轮压测用的还是当前这版。

检测 App 是否把设备信息传给广告 SDK

TrackHARReportHAR 吃的是抓完之后的 HAR:有没有把设备标识、位置送给广告或统计 SDK,要等整轮测完、文件导出来才能扫。接收器里对着 Header、Query、Body 扫这些字段,请求到了就能报,加了新 SDK 也不用再走一遍「抓完再离线分析」。

HAR 文件里的 Token、Cookie 怎么扫

websec-scanner 查安全头和 Cookie,Gitleaks 会把导出的 *.har 当密钥来源。问题是新包没导进去就扫不到,整份带着 Token 的文件还要在人之间传。接收器边收边扫,密钥出现在请求里就可以告警,不必先落一份 HAR。

用抓包结果生成 Mock

rekit mockapi 用 HAR 起本地 Mock。接口改了,夹具还是旧的。接收器把拼完的请求落下来当 Mock,下次联调对上的是刚抓到的那一版。

怎么写接收器、字段怎么解析,见《实时同步使用文档》。


常见问题

iOS / Android 抓包一定要把手机挂到电脑代理吗?
不必。ApiCatcher 在设备上用 VPN 抓 HTTP/HTTPS,电脑不用开 Charles、Proxyman 当系统代理。

手机抓包怎么实时同步到自己的服务器?
接收端开一个 WebSocket 服务,App 里填 ws:// 地址并打开实时同步。请求按 Real-time Sync Protocol 推过来,拼完就是一条完整 HTTP。

不想每次手动导出 HAR 怎么办?
实时同步推的是流式帧。用 Java SDK 的话,一条请求结束会回调 HAR 1.2 entry,后面转 OpenAPI、出压测脚本、扫密钥都可以接着自动跑。

和 Charles / mitmproxy 导出 HAR 再转换有什么差别?
Charles、Proxyman、mitmproxy 也能导出 HAR,但每轮都要有人点导出。实时同步是抓的时候就往外推,接得进你自己的流水线。


相关链接