GitHub - zuoye520/Crawling_API

API 逆向分析工具

面向任意网址的自动化 API 与 WebSocket 逆向分析工具。指定一个 URL 后,工具会:

  1. 爬取:自动浏览站点(BFS 发现页面、点击按钮、滚动、悬停)
  2. 捕获:记录所有 HTTP API 请求与 WebSocket 连接/消息帧
  3. 分类:将流量归类为 REST / GraphQL / SSE / WebSocket,并按 URL 模式去重
  4. JS 静态提取:从 /_next/static/chunks/*.js 等打包文件中正则提取 URL(fetch/axios/WebSocket 等),补充未在爬取时触发的接口
  5. 分析:用 AI(OpenAI 或 Claude)分析每个接口的用途
  6. 输出:生成结构化报告(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 的独立配置目录(内含钱包扩展):

  1. 准备一个专用配置目录(二选一)

    • 方式 A:复制现有 Chrome 配置后用副本(推荐,避免占用主配置)
      • macOS: cp -r ~/Library/Application\ Support/Google/Chrome ./chrome-wallet-profile
      • 在该副本中已登录/安装好钱包即可。
    • 方式 B:使用全新目录,首次运行会打开一个干净 Chrome,你手动安装钱包并连接一次,之后该目录即带钱包。
  2. 运行前关闭 Chrome
    若使用系统默认配置或该目录正在被其它 Chrome 进程使用,需先关闭所有 Chrome 窗口,否则会报「profile in use」。

  3. 启动时指定配置目录

    node src/cli.js --url https://swapbox.io/ --user-data-dir ./chrome-wallet-profile

    指定 --user-data-dir 后,工具会改用系统已安装的 Chromechannel: 'chrome'),并加载该目录下的扩展与登录态;同时会自动关闭 headless,以便钱包弹窗可操作。

  4. 首次或需要重新授权时
    第一次用该配置跑目标站点时,浏览器会打开,可能弹出「连接钱包」;在弹窗里完成连接/授权后,后续同目录再跑即可复用该状态。

使用示例

# 更深爬取、更长时长
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 服务,返回结构化分析,包括用途、类别、参数说明和认证要求。