Web API Reverse
Overview
对任意 Web 平台做 API 逆向:用 mitmproxy 拦截流量 → 分析鉴权链路 → 用 Playwright 复用登录态构建自动化脚本。整个流程不污染用户日常浏览器(独立 profile + 代理),支持扫码登录态跨会话复用。
Prerequisites
- mitmproxy MCP connector 已连接(提供
mcp__mitmproxy-mcp__*工具集) - 系统 Chrome 已安装(Playwright 走
channel="chrome",无需额外下载浏览器) - Python 3.12+ + playwright + pillow(装在 managed venv)
四阶段工作流
Phase 1: Setup(一次性环境准备)
安装 mitmproxy CA 证书(Chrome 信任 HTTPS 拦截):
# Windows: 把 mitmproxy CA 装入当前用户的受信任根证书
certutil -user -addstore Root "$env:USERPROFILE\.mitmproxy\mitmproxy-ca-cert.cer"
# 验证
certutil -user -store Root | Select-String "mitmproxy"
> 首次运行 mitmproxy 会自动在 ~/.mitmproxy/ 生成 CA 证书。如果该目录为空,先启动一次代理(start_proxy)再关闭,证书会自动生成。
安装 Python 依赖(managed venv):
CPYTHON="C:/Users/Administrator/.workbuddy/binaries/python/versions/3.13.12/python.exe"
VENV="C:/Users/Administrator/.workbuddy/binaries/python/envs/default"
"$CPYTHON" -m venv "$VENV"
"$VENV/Scripts/pip.exe" install playwright pillow
启动代理 Chrome(独立实例,不碰用户日常浏览器):
# 用 scripts/launch_proxy_chrome.py 一键启动
python scripts/launch_proxy_chrome.py --profile-name myproject
# 或手动启动
chrome.exe --proxy-server=http://127.0.0.1:8080 \
--user-data-dir="C:/Users/Administrator/.workbuddy/skills/web-api-reverse/chrome_profiles/myproject" \
--no-first-run --no-default-browser-check
> 关键设计:每个平台/项目用独立的 --user-data-dir,登录态互不干扰,与用户日常 Chrome 完全隔离。profile 目录持久化,关闭后下次复用。
Phase 2: Capture(抓包)
- 启动 mitmproxy 代理:调用
mcp__mitmproxy-mcp__start_proxy(默认监听 127.0.0.1:8080)
- ⚠️ 若返回 "MITM is already running":说明是旧实例在跑,start_proxy 的 dump_file 参数不会生效。先stop_proxy→ 再start_proxy(带dump_file),否则用户操作期间的流量可能写不进你的 dump。 - 限定抓包范围:
mcp__mitmproxy-mcp__set_scope只关注目标域名(如.*\.example\.com),减少噪音。注意 set_scope 的 dump 只记录 scope 内域,跨域上传(如资源直传到 CDN)要提前把该域加进 scope。 - 用户操作:让用户在代理 Chrome 里完成:扫码登录 → 选账号 → 进入目标页面 → 执行目标动作(发帖/查看/删除等)
- 用户完成后:调用
mcp__mitmproxy-mcp__get_traffic_summary看流量概览,确认有数据
- ⚠️ 若查询库为空但 dump 文件在增长:MCP 查询库与 mitmproxy dump 不同步。用mcp__mitmproxy-mcp__load_traffic_file(file_path=dump 文件,append=true,scope=逗号分隔域名)把 dump 载入数据库,之后所有查询工具即可用。
- ⚠️ QUIC/HTTP3 绕过代理:Chrome 对部分域(尤其字节/抖音系)走 HTTP/3(UDP),mitmproxy 是 TCP 代理抓不到。现象:页面 API 能抓到、但文件上传请求缺失。解决:代理 Chrome 启动参数加--disable-quic --disable-http3强制走 TCP(launch_proxy_chrome.py暂未内置,手动启动 Chrome 时附加)。
- ⚠️ 服务端去重会"吞"上传流量:若重复上传同一文件(MD5 相同),服务端可能直接返回已有 ID、不再发生内容上传。要抓上传协议,必须用内容不同的新文件触发完整流程。
Phase 3: Analysis(鉴权链路分析)
这是核心分析阶段。详细方法见 references/auth_chain_patterns.md,关键步骤:
- 搜登录请求:
mcp__mitmproxy-mcp__search_traffic搜关键词login/oauth/token - 逐条检视:
mcp__mitmproxy-mcp__inspect_flow看请求头、请求体、响应头(尤其set-cookie)、响应体 - 识别 token 链:
- 登录响应 → 找set-cookie(session cookie)
- URL 变化 → 找?token=xxx或#token=xxx(URL 里的数字 token)
- API 调用 → 找请求头Authorization: Bearer xxx或 query?token=xxx - 自动模式检测:
mcp__mitmproxy-mcp__get_api_patterns自动识别 API 端点、参数模式 - 提取关键数据:
mcp__mitmproxy-mcp__extract_from_flow从特定 flow 中提取 token、session key、用户标识等 - 生成 OpenAPI 规范:
mcp__mitmproxy-mcp__export_openapi_spec自动生成接口文档
常见鉴权模式(详见 references/auth_chain_patterns.md):
- 单域 cookie 鉴权:登录 → set-cookie → 后续请求自动带 cookie
- URL token 鉴权:登录 → 跳转 URL 带 ?token=数字 → 后续请求 query 带 token
- 多域 token 交换:域 A 登录 → 跳转域 B → 调中间接口换 API token → 后续 API 用 token
- iframe 中转:主域页面内嵌 iframe 指向 API 域,iframe URL 带身份参数
Phase 4: Implementation(构建自动化脚本)
用 Playwright 复用代理 Chrome 的 profile 实现自动化。详见 references/playwright_login_reuse.md。
核心模式:
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
# 复用代理 Chrome 的 profile(登录态已持久化)
ctx = await p.chromium.launch_persistent_context(
user_data_dir=str(PROFILE_DIR), # 必须与代理 Chrome 的 --user-data-dir 一致
channel="chrome", # 用系统 Chrome,无需下载浏览器
headless=True, # 无头模式跑 API 调用
args=["--no-first-run", "--disable-background-networking"],
)
page = await ctx.new_page()
# 导航到平台 → 检测是否已登录 → 执行目标 API 调用
登录态检测原则:
- 以浏览器实测为唯一真相来源(导航到平台,检查 URL 中是否有 token 或页面内容是否为已登录状态)
- 不要依赖 cookie SQLite 文件预检(Chrome 运行时文件被锁,且 cookie 表名/域名假设容易出错)
- profile 被占用时明确报 PROFILE_IN_USE,提示关闭代理 Chrome 后重试
Quick Reference
| 操作 | 命令/工具 |
|---|---|
| 安装 CA 证书 | scripts/cert_setup_windows.ps1 |
| 启动代理 Chrome | python scripts/launch_proxy_chrome.py --profile-name <name> |
| 安全读 cookie | python scripts/read_chrome_cookies.py --profile <name> |
| 启动 mitmproxy | mcp__mitmproxy-mcp__start_proxy |
| 设抓包范围 | mcp__mitmproxy-mcp__set_scope (domains: ["目标域名"]) |
| 流量概览 | mcp__mitmproxy-mcp__get_traffic_summary |
| 搜索流量 | mcp__mitmproxy-mcp__search_traffic (keyword: "login") |
| 检视单条 | mcp__mitmproxy-mcp__inspect_flow (flow_id) |
| 批量检视 | mcp__mitmproxy-mcp__inspect_flows (flow_ids) |
| 自动模式检测 | mcp__mitmproxy-mcp__get_api_patterns |
| 提取数据 | mcp__mitmproxy-mcp__extract_from_flow (flow_id, pattern) |
| 导出 OpenAPI | mcp__mitmproxy-mcp__export_openapi_spec |
| 清除流量 | mcp__mitmproxy-mcp__clear_traffic |
Resources
| 文件 | 用途 |
|---|---|
scripts/launch_proxy_chrome.py |
一键启动带代理+独立 profile 的 Chrome |
scripts/cert_setup_windows.ps1 |
Windows 安装 mitmproxy CA 证书 |
scripts/read_chrome_cookies.py |
安全读取 Chrome profile 中的 cookie(处理文件锁) |
references/mitmproxy_mcp_tools.md |
mitmproxy MCP 工具完整目录与使用模式 |
references/auth_chain_patterns.md |
鉴权链路分析模式(4 种模式 + 多域 token 交换案例) |
references/playwright_login_reuse.md |
Playwright 复用登录态脚本编写指南 |
references/windows_pitfalls.md |
Windows 环境特有陷阱与解决方案 |