【问题标题】:Is there a way to start mitmproxy v.7.0.2 programmatically in the background?有没有办法在后台以编程方式启动 mitmproxy v.7.0.2?
【发布时间】:2021-08-04 15:32:10
【问题描述】:

有没有办法在后台以编程方式启动 mitmproxy v.7.0.2? ProxyConfig 和 ProxyServer 自 7.0.0 版本起已被移除,下面的代码不起作用。

from mitmproxy.options import Options
from mitmproxy.proxy.config import ProxyConfig
from mitmproxy.proxy.server import ProxyServer
from mitmproxy.tools.dump import DumpMaster

import threading
import asyncio
import time

class Addon(object):
    def __init__(self):
        self.num = 1

    def request(self, flow):
        flow.request.headers["count"] = str(self.num)

    def response(self, flow):
        self.num = self.num + 1
        flow.response.headers["count"] = str(self.num)
        print(self.num)


# see source mitmproxy/master.py for details
def loop_in_thread(loop, m):
    asyncio.set_event_loop(loop)  # This is the key.
    m.run_loop(loop.run_forever)


if __name__ == "__main__":
    options = Options(listen_host='0.0.0.0', listen_port=8080, http2=True)
    m = DumpMaster(options, with_termlog=False, with_dumper=False)
    config = ProxyConfig(options)
    m.server = ProxyServer(config)
    m.addons.add(Addon())

    # run mitmproxy in backgroud, especially integrated with other server
    loop = asyncio.get_event_loop()
    t = threading.Thread( target=loop_in_thread, args=(loop,m) )
    t.start()

    # Other servers, such as a web server, might be started then.
    time.sleep(20)
    print('going to shutdown mitmproxy')
    m.shutdown()

from BigSully's gist

【问题讨论】:

    标签: mitmproxy


    【解决方案1】:

    您可以将Addon 类放入your_script.py,然后运行mitmdump -s your_script.py。 mitmdump 没有控制台界面,可以在后台运行。

    我们(mitmproxy 开发人员)正式不再支持从 Python 手动实例化,因为这给我们带来了大量的支持负担。如果你有一些 Python 经验,你可能会找到自己的方法。

    如果我的插件有额外的依赖怎么办?

    方法 1: pip install mitmproxy 仍然得到完美支持,并为您提供与独立二进制文件相同的功能。额外提示:您可以运行 venv/bin/mitmproxyvenv/Scripts/mitmproxy.exe 在您的 virtualenv 中调用 mitmproxy,而无需激活您的 virtualenv。

    方法 2: 您可以使用 pipx 安装 mitmproxy,然后运行 ​​pipx inject mitmproxy <your dependency name>。详情请见https://docs.mitmproxy.org/stable/overview-installation/#installation-from-the-python-package-index-pypi

    如何调试 mitmproxy 本身?

    如果您从命令行调试(无论是打印语句还是 pdb),最简单的方法是运行mitmdump 而不是mitmproxy,它提供了相同的功能,但没有控制台界面。或者,您可以使用 PyCharm 的远程调试功能,该功能在控制台界面处于活动状态时也可以使用 (https://github.com/mitmproxy/mitmproxy/blob/main/examples/contrib/remote-debug.py)。

    【讨论】:

    • 感谢您的评论。如果您自己的脚本需要您通常会在虚拟环境中安装的其他库,那么现在推荐的使用 mitmproxy 的方法是什么?另外,还有什么方法可以在 pycharm 之类的 GUI 中编写代码并具有调试器访问权限吗?
    • 我已经扩展了我的答案,见上文。 :)
    【解决方案2】:

    下面的这个例子应该可以在 mitmproxy v7 上正常工作

    from mitmproxy.tools import main
    from mitmproxy.tools.dump import DumpMaster
    
    options = main.options.Options(listen_host='0.0.0.0', listen_port=8080)
    m = DumpMaster(options=options)
    # the rest is same in the previous versions
    

    【讨论】:

      【解决方案3】:
          from mitmproxy.addons.proxyserver import Proxyserver
          from mitmproxy.options import Options
          from mitmproxy.tools.dump import DumpMaster
          options = Options(listen_host='127.0.0.1', listen_port=8080, http2=True)
          m = DumpMaster(options, with_termlog=True, with_dumper=False)
          m.server = Proxyserver()
          m.addons.add(
                  // addons here
          )
          m.run()
      

      你好,我认为应该这样做

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      相关资源
      最近更新 更多