如果你厌倦了Charles的卡顿和Fiddler的复杂配置,今天介绍的mitmproxy可能会成为你的新宠。这个基于Python开发的抓包工具,不仅轻量高效,还能无缝对接Python生态,让抓包和自动化测试变得前所未有的简单。
在开发过程中,抓包工具就像开发者的"第三只眼"。传统的GUI工具如Charles虽然功能强大,但存在几个痛点:
mitmproxy恰好解决了这些问题:
核心优势对比:
| 特性 | mitmproxy | Charles |
|---|---|---|
| 资源占用 | 极低 | 较高 |
| 运行方式 | 命令行/Web界面 | GUI |
| Python集成 | 原生支持 | 有限支持 |
| 跨平台 | 完全一致 | 略有差异 |
| 价格 | 开源免费 | 付费 |
提示:mitmproxy特别适合需要频繁修改请求/响应、自动化测试和批量处理数据的场景。
确保你的系统满足以下条件:
推荐使用pipx安装,避免污染全局环境:
bash复制# 先安装pipx(如果尚未安装)
python -m pip install --user pipx
python -m pipx ensurepath
# 安装mitmproxy
pipx install mitmproxy
安装完成后,验证是否成功:
bash复制mitmproxy --version
为了更好的开发体验,建议安装:
bash复制pipx inject mitmproxy mitmweb
HTTPS抓包的核心是证书配置。以下是分步指南:
首次运行mitmproxy会自动生成证书:
bash复制mitmproxy
证书默认存储在:
C:\Users\<用户名>\.mitmproxy~/.mitmproxyWindows用户:
certmgr.mscmitmproxy-ca.p12到"受信任的根证书颁发机构"macOS用户:
bash复制open ~/.mitmproxy/mitmproxy-ca-cert.pem
然后在钥匙串访问中,将证书标记为"始终信任"。
以MuMu模拟器为例:
mitmproxy-ca-cert.pem拖入模拟器共享文件夹常见问题:如果安装后仍无法抓取HTTPS,检查是否在"信任的凭据 → 用户"中能看到mitmproxy证书。
启动监听(默认端口8080):
bash复制mitmproxy -p 8888
常用快捷键:
↑/↓:选择请求Enter:查看详情q:返回d:删除选中请求只监听特定域名:
bash复制mitmproxy -p 8888 --ignore-hosts '^(?!.*example\.com).*$'
创建modify.py脚本:
python复制def request(flow):
if "example.com" in flow.request.url:
flow.request.headers["User-Agent"] = "My-Custom-UA"
def response(flow):
if flow.response.status_code == 404:
flow.response.status_code = 200
flow.response.content = b"Custom 404 Page"
运行脚本:
bash复制mitmproxy -p 8888 -s modify.py
保存会话:
bash复制mitmproxy -p 8888 -w session.mitm
回放会话:
bash复制mitmproxy -p 8888 -nr session.mitm
结合pytest实现自动化断言:
python复制# test_proxy.py
import pytest
@pytest.fixture
def proxy():
from mitmproxy.tools.main import mitmdump
proc = mitmdump(["-p", "8888", "-s", "modify.py"])
yield
proc.kill()
def test_api_response(proxy):
import requests
resp = requests.get("http://example.com", proxies={"http": "http://localhost:8888"})
assert "expected_content" in resp.text
手机配置步骤:
mitm.it安装证书统计请求耗时:
python复制def response(flow):
elapsed = flow.response.timestamp_end - flow.request.timestamp_start
print(f"{flow.request.url} took {elapsed:.2f}s")
问题1:证书安装后仍无法解密HTTPS
解决方案:
问题2:手机显示"无网络连接"
可能原因:
问题3:某些应用无法抓包
原因可能是:
绕过方法(仅限测试环境):
python复制def request(flow):
flow.request.verify = False
--no-http2禁用HTTP/2提升性能bash复制# 优化后的启动命令示例
mitmproxy -p 8888 --no-http2 -s fast_script.py
mitmproxy2swagger:自动生成API文档
bash复制pip install mitmproxy2swagger
mitmproxy2swagger -i flow.mitm -o schema.yaml
PyPCAP:深度分析网络包
python复制from pypcap import capture
for ts, pkt in capture("eth0"):
print(ts, len(pkt))
AutoDecoder:自动解码加密内容
python复制from autodecoder import analyze
analyze(flow.response.content)
在实际项目中,我发现最实用的组合是mitmproxy + pytest + Allure,可以构建完整的接口测试流水线。特别是在微服务调试时,能够快速定位是前端还是后端的问题。