mitmproxy 是一个强大的“中间人代理工具”,其核心功能在于拦截、查看并可能修改设备的网络请求与响应数据。对于想要理解数据流动或进行数据采集的开发者来说,它是一把利器。
它常被用来:
- 找到 App 或网页背后的真实接口。
- 观察请求参数、头部信息以及返回的原始数据。
- 为后续的爬虫开发或自动化脚本获取关键信息做准备。
1. 安装 mitmproxy(任选一种方式)
方法 A:Python pip 安装(推荐,跨平台)
这是最通用便捷的方式,前提是你的系统已安装 Python 和 pip。
python -m pip install -U mitmproxy
方法 B:macOS Homebrew
如果你使用 macOS,可以通过 Homebrew 安装。
brew install mitmproxy
方法 C:Windows Chocolatey
Windows 用户可以通过 Chocolatey 包管理器进行安装。
choco install mitmproxy
安装验证
安装完成后,可以通过以下命令验证是否成功。
mitmproxy --version
2. 基础启动与界面说明
mitmproxy 提供了三种常用模式以适应不同场景:
mitmproxy:基于终端的交互式界面,功能强大,适合熟悉命令行的用户。
mitmweb:基于 Web 的可视化界面,操作直观,对新手非常友好。
mitmdump:纯命令行模式,适合用于脚本化、批量化的抓包任务。
对于初学者,强烈建议从 mitmweb 开始,它提供了一个更直观的浏览器操作界面。
mitmweb
执行后,默认会在 127.0.0.1:8080 地址上启动代理服务,并自动打开 Web 管理页面。
3. 设置代理(让设备流量经过 mitmproxy)
要让 mitmproxy 捕获到网络流量,关键一步是配置设备使用它作为代理服务器。
3.1 电脑自身抓包
如果你想抓取本机浏览器或应用的数据,只需将系统网络代理设置为:
3.2 手机抓包(常见场景)
抓取手机 App 的流量是更常见的需求,步骤如下:
- 确保手机和运行 mitmproxy 的电脑连接在同一个 Wi-Fi 网络下。
- 在电脑上查看本机在局域网内的 IP 地址,例如
192.168.1.100。
- 在手机的 Wi-Fi 设置中,找到代理配置项,选择“手动”:
- 服务器:
192.168.1.100 (即你的电脑 IP)
- 端口:
8080
3.3 允许外部设备连接
当你尝试从手机等外部设备连接时,可能需要启动 mitmproxy 时添加参数,以允许非本地连接:
mitmweb --set block_global=false
4. 安装 HTTPS 证书(必须,否则只能看到 HTTP)
现代应用和网站普遍使用 HTTPS 加密通信。为了解密并查看这些内容,必须在客户端(手机或电脑)上安装 mitmproxy 提供的 CA 证书。
操作很简单:在已设置代理的设备上,用浏览器访问 http://mitm.it。
页面会根据你的设备类型(iOS, Android, Windows 等)提供对应的证书下载和安装指引。请务必完成安装并信任该证书(特别是在 iOS 和 Android 上需要手动在系统设置中启用完全信任),之后才能正常看到 HTTPS 请求和响应的具体内容。
5. 第一次抓包实战(看接口)
现在可以进行一次完整的抓包体验了。
5.1 开启 mitmweb
使用允许外部连接的命令启动:
mitmweb --set block_global=false
5.2 打开 App 或网页
保持 mitmproxy 运行,在手机或电脑上正常使用 App 或访问网页。此时,所有网络请求都会经过代理,并在 mitmweb 的页面列表中实时显示。
在 mitmweb 页面顶部的过滤器(Filter)输入框中,可以使用以下语法快速筛选请求:
- 只看 URL 包含 “api” 的请求:
~u api
- 只看特定域名(如
api.example.com)的请求:~d api.example.com
- 只看返回内容类型为 JSON 的请求:
~t json
6. 用脚本自动保存接口数据(爬虫的第一步)
手动查看很棒,但自动化才是效率的关键。mitmdump 模式允许我们通过 Python 脚本处理每一条流过的请求/响应。
新建一个名为 save_json.py 的脚本文件,写入以下内容:
from mitmproxy import http
import os
import time
def response(flow: http.HTTPFlow):
# 只抓取 JSON 接口
ctype = flow.response.headers.get("content-type", "")
if "application/json" not in ctype:
return
# 只抓取你关心的域名,例如 api.example.com
if "api.example.com" not in flow.request.pretty_host:
return
os.makedirs("captures", exist_ok=True)
ts = time.strftime("%Y%m%d_%H%M%S")
path = f"captures/{ts}.json"
with open(path, "wb") as f:
f.write(flow.response.content)
print(f"saved: {path}")
这个脚本实现了自动化抓包逻辑:它检查每个响应的内容类型和请求域名,如果匹配预设条件(例如来自 api.example.com 的 JSON 数据),就将其以时间戳为文件名保存到 captures 文件夹中。
使用 mitmdump 加载并运行这个脚本:
mitmdump -s save_json.py --set block_global=false
之后,你在设备上的任何操作,只要触发了目标接口,数据就会自动保存下来。这为后续的数据分析或 Python 爬虫开发提供了原材料。
7. 从抓包到“爬虫”:复现请求
抓到接口并分析其请求参数后,下一步就是用 Python 脚本模拟这个请求,实现自动化的数据获取。
以下是一个使用 requests 库复现 GET 请求的简单示例:
import requests
url = "https://api.example.com/list"
headers = {
"User-Agent": "Mozilla/5.0",
"Authorization": "Bearer your_token_here"
}
r = requests.get(url, headers=headers, timeout=10)
print(r.json())
在实际操作中,你需要从 mitmproxy 捕获的请求中仔细复制所需的 URL、请求头(Headers)、Cookie 或 Token、以及请求体(Body)参数,才能成功模拟客户端行为。掌握 HTTP/HTTPS 协议细节在此环节至关重要。
8. 常见问题排查
8.1 HTTPS 看不到内容
- 证书未安装或未完全信任:这是最常见的原因。请确保在客户端设备上访问
mitm.it 下载并安装了证书,并在系统设置中完成了信任操作(尤其是移动设备)。
- App 启用证书锁定(SSL Pinning):部分 App 会校验服务器证书,不信任用户安装的 CA 证书。对于新手,建议先从网页或未启用此功能的 App 开始练习。
8.2 手机抓不到包
- 启动命令错误:忘记添加
--set block_global=false 参数。
- 网络不通:手机和电脑不在同一局域网段,或防火墙阻止了连接。请检查 IP 地址和网络设置。
8.3 特定App请求缺失
- 绕过系统代理:一些 App 可能直接使用原生 Socket 或不经过系统代理设置。可尝试使用 VPN 模式或透明代理等高级配置,但这需要更多 逆向分析 知识。
9. 安全与合规提示(务必阅读)
技术是把双刃剑,使用 mitmproxy 时必须遵守道德与法律底线:
- 仅用于授权测试:只对你拥有合法权限访问的网站、应用或接口进行分析。
- 保护隐私:切勿抓取、保存或传播他人的个人隐私和敏感数据。
- 遵守协议:尊重目标网站的服务条款和 robots.txt 协议,避免对服务器造成过大压力。
通过本文,你已掌握了 mitmproxy 从安装配置到自动化抓包的核心流程。它不仅是爬虫数据采集的“望远镜”,更是理解网络通信、进行安全测试的利器。建议从简单的网页抓包开始实践,逐步尝试编写更复杂的处理脚本。如果你想与更多开发者交流此类工具的使用心得,欢迎访问 云栈社区 的相关板块探讨。