API 逆向分析工具
面向任意网址的自动化 API 与 WebSocket 逆向分析工具。指定一个 URL 后,工具会:
- 爬取:自动浏览站点(BFS 发现页面、点击按钮、滚动、悬停)
- 捕获:记录所有 HTTP API 请求与 WebSocket 连接/消息帧
- 分类:将流量归类为 REST / GraphQL / SSE / WebSocket,并按 URL 模式去重
- JS 静态提取:从
/_next/static/chunks/*.js等打包文件中正则提取 URL(fetch/axios/WebSocket 等),补充未在爬取时触发的接口 - 分析:用 AI(OpenAI 或 Claude)分析每个接口的用途
- 输出:生成结构化报告(JSON + Markdown)
快速开始
# 安装依赖 npm install # 安装浏览器(仅首次需要) npm run install-browser # 仅爬取与分类(不调用 AI) node src/cli.js --url https://example.com --no-ai # 启用 AI 分析(需在 .env 中配置 API Key) cp .env.example .env # 编辑 .env,填入 OPENAI_API_KEY 或 ANTHROPIC_API_KEY node src/cli.js --url https://example.com
命令行参数
-u, --url <url> 目标网站 URL(必填)
-d, --depth <number> 链接跟随的爬取深度(默认:2)
-t, --duration <minutes> 最大爬取时长(分钟,默认:3)
-o, --output <dir> 报告输出目录(默认:./output)
--ai-provider <name> AI 服务:openai 或 claude(默认:openai)
--no-ai 跳过 AI 分析
--no-js-extract 不从 _next/static/chunks/*.js 中提取 API/WS URL
--min-page-time <s> 每页最少停留秒数,用于执行点击/输入等交互(默认 20)
--interaction-rounds <n> 每页执行的点击、悬停、输入轮数(默认 3)
--user-data-dir <path> 使用已装钱包的 Chrome 配置目录(见下方「需要连接钱包」)
--headless 无头模式运行浏览器
--cookie <string> 用于已登录会话的 Cookie 字符串
需要连接钱包的站点
若目标站点必须「连接钱包」才能请求大部分 API,而默认启动的 Chromium 没有安装 MetaMask、Phantom 等插件,可使用本机已安装 Chrome 的独立配置目录(内含钱包扩展):
-
准备一个专用配置目录(二选一)
- 方式 A:复制现有 Chrome 配置后用副本(推荐,避免占用主配置)
- macOS:
cp -r ~/Library/Application\ Support/Google/Chrome ./chrome-wallet-profile - 在该副本中已登录/安装好钱包即可。
- macOS:
- 方式 B:使用全新目录,首次运行会打开一个干净 Chrome,你手动安装钱包并连接一次,之后该目录即带钱包。
- 方式 A:复制现有 Chrome 配置后用副本(推荐,避免占用主配置)
-
运行前关闭 Chrome
若使用系统默认配置或该目录正在被其它 Chrome 进程使用,需先关闭所有 Chrome 窗口,否则会报「profile in use」。 -
启动时指定配置目录
node src/cli.js --url https://swapbox.io/ --user-data-dir ./chrome-wallet-profile
指定
--user-data-dir后,工具会改用系统已安装的 Chrome(channel: 'chrome'),并加载该目录下的扩展与登录态;同时会自动关闭 headless,以便钱包弹窗可操作。 -
首次或需要重新授权时
第一次用该配置跑目标站点时,浏览器会打开,可能弹出「连接钱包」;在弹窗里完成连接/授权后,后续同目录再跑即可复用该状态。
使用示例
# 更深爬取、更长时长 node src/cli.js --url https://example.com --depth 3 --duration 5 # 使用 Claude 进行分析 node src/cli.js --url https://example.com --ai-provider claude # 无头模式(不显示浏览器窗口) node src/cli.js --url https://example.com --headless --no-ai # 带 Cookie 的已登录爬取 node src/cli.js --url https://example.com --cookie "session=abc123; token=xyz" # 需要连接钱包的站点:使用带钱包插件的 Chrome 配置目录 node src/cli.js --url https://swapbox.io/ --user-data-dir ./chrome-wallet-profile
输出说明
报告会保存到 output/ 目录:
api_report_<时间戳>.json:完整结构化数据,包含所有接口详情、AI 分析结果、请求/响应样本api_report_<时间戳>.md:人类可读的报告,含汇总表与接口说明
项目结构
src/
├── cli.js # CLI 入口与流程编排
├── crawler/
│ ├── auto-crawler.js # 基于 Playwright 的自动爬虫(BFS、交互)
│ └── interceptor.js # 网络流量拦截(HTTP + 通过 CDP 的 WebSocket)
├── analyzer/
│ ├── classifier.js # 流量去重与分类
│ ├── js-extractor.js # 从 chunk JS 中静态提取 API/WebSocket URL
│ └── ai-analyzer.js # 基于 AI 的接口分析(OpenAI / Claude)
└── reporter/
└── generator.js # JSON + Markdown 报告生成
工作原理
爬取: 自动爬虫在反检测配置下启动 Chromium,访问目标 URL,然后按配置的深度以 BFS 跟随同源链接。每页会执行多轮交互(默认 3 轮),每轮包括:滚动到底部、点击按钮/标签/下拉/Connect/Select/Swap 等常见控件、打开下拉并选择选项、在搜索/选币类输入框内输入字符以触发联想接口、悬停带 tooltip 的元素;每轮结束后等待网络空闲再进入下一轮。每页最少停留时间由 --min-page-time 控制,以便等待懒加载与异步接口。
拦截: 所有 XHR/Fetch 请求及响应通过 Playwright 事件监听捕获。WebSocket 连接与消息帧通过 Chrome DevTools Protocol (CDP) 捕获。图片、CSS、字体等静态资源会自动过滤。
分类: 对捕获的流量做 URL 路径归一化(将 ID、哈希、UUID 等替换为 :id 占位符),按「方法 + URL 模式」分组去重。接口被分为 REST、GraphQL(通过 POST body 中的 query 字段识别)、SSE(通过 text/event-stream 的 Content-Type 识别)或 WebSocket。请求/响应结构从样本数据中推断。
JS 静态提取: 爬取完成后,从同源请求里识别 _next/static/chunks/*.js,拉取这些文件内容,用正则匹配 fetch/axios/WebSocket 等调用中的 URL 字符串,得到「从 JS 推断的接口」列表并写入报告;可通过 --no-js-extract 关闭。
AI 分析: 每个唯一接口会连同 URL、方法、请求/响应样本和站点上下文一起发送给配置的 AI 服务,返回结构化分析,包括用途、类别、参数说明和认证要求。