You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:47