如何将mitmdump兼容的Python脚本转为mitmproxy独立脚本?
正确创建mitmproxy独立脚本的方法
你说得没错,继承FlowMaster确实不是官方推荐的实现方式——这个类属于mitmproxy的内部核心逻辑,API不稳定,版本更新时很容易出兼容性问题。官方更推荐基于inline脚本/Addon机制来构建独立可运行的脚本,下面两种方法都是符合官方规范的正确姿势:
方法1:给现有脚本添加直接运行入口
如果你的现有脚本已经有request()和response()这两个函数,完全不需要大改,只需要在脚本末尾添加一段入口代码,让它可以直接调用mitmdump的命令行逻辑:
def request(flow): # 你的请求处理逻辑 print(f"拦截到请求:{flow.request.url}") def response(flow): # 你的响应处理逻辑 print(f"拦截到响应:{flow.response.status_code}") if __name__ == "__main__": from mitmproxy.tools import main # 这里传入的参数和你原来用的mitmdump命令完全对应 # "-q" 是静默模式,"-s" 指定脚本文件(这里用__file__指代当前脚本) main.mitmdump(["-q", "-s", __file__])
这样你直接运行python script.py,就和原来执行mitmdump -q -s script.py的效果完全一样,不需要手动输入mitmdump命令,完美保留你原来的脚本逻辑。
方法2:封装成Addon类(进阶结构化写法)
如果你的脚本逻辑比较复杂,需要扩展更多mitmproxy的生命周期事件(比如客户端连接、服务器断开等),官方更推荐把逻辑封装成Addon类,这也是inline脚本的标准进阶写法:
from mitmproxy import ctx class MyProxyAddon: def request(self, flow): # 原有的请求处理逻辑 ctx.log.info(f"请求URL:{flow.request.url}") def response(self, flow): # 原有的响应处理逻辑 ctx.log.info(f"响应状态码:{flow.response.status_code}") # 还可以添加更多生命周期方法,比如客户端连接时触发 def clientconnect(self, client): ctx.log.info(f"客户端 {client.address} 已连接") # 告诉mitmproxy要加载这个Addon addons = [ MyProxyAddon() ] if __name__ == "__main__": from mitmproxy.tools import main # 这里不需要再用"-s"参数,直接传入当前脚本即可 main.mitmdump(["-q", __file__])
这种方式结构更清晰,扩展性更强,而且完全基于官方对外暴露的稳定API,不用担心版本更新带来的兼容问题。
一些额外提示
- 确保已经通过
pip install mitmproxy安装了最新版本的mitmproxy - 如果需要自定义代理端口、证书路径等参数,直接在
main.mitmdump()的参数列表里添加即可,比如["-q", "-p", "8081", __file__] - 调试阶段可以去掉
-q参数,这样能看到mitmproxy的详细日志,方便排查问题
内容的提问来源于stack exchange,提问作者Keek
相关产品推荐
相关产品推荐

