使用 API (Python) 的 mitmproxy 加载脚本

mitmproxy load script using API (Python)

美好的一天,

我正在尝试将 mitmproxy 实现到更大的应用程序中。 为此,我需要能够在我的代码中而不是通过命令行加载那些所谓的内联脚本。我在文档中找不到任何有用的信息。

我正在使用 mitmproxy 版本 0.17 和 Python 2.7.

我知道有更新的版本可用,但那个版本无法使用代码示例。

这是我的基本代码:

from mitmproxy import controller, proxy
from mitmproxy.proxy.server import ProxyServer


class ProxyMaster(controller.Master):
    def __init__(self, server):
        controller.Master.__init__(self, server)

    def run(self):
        try:
            return controller.Master.run(self)
        except KeyboardInterrupt:
            self.shutdown()

    def handle_request(self, flow):
        flow.reply()

    def handle_response(self, flow):
        flow.reply()


config = proxy.ProxyConfig(port=8080)
server = ProxyServer(config)
m = ProxyMaster(server)
m.run()

我如何 运行 这个代理使用内联脚本?

提前致谢

我想出了一个非常丑陋的解决方法。

我不得不使用 flow.FlowMaster 而不是使用 controller.Master,因为 controller.Master 库似乎无法处理内联脚本。

由于某些原因,仅仅加载文件不起作用,它们会立即被触发,但不会被 运行 它们匹配的钩子触发。

我没有使用不起作用的挂钩,而是加载了匹配函数,如您在 handle_response 中所见(缺少 try/except,线程可能有用)

from mitmproxy import flow, proxy
from mitmproxy.proxy.server import ProxyServer
import imp


class ProxyMaster(flow.FlowMaster):
    def run(self):
        try:
            return flow.FlowMaster.run(self)
        except KeyboardInterrupt:
            self.shutdown()

    def handle_request(self, flow):
        flow.reply()

    def handle_response(self, flow):
        for inline_script in self.scripts:
            script_file = imp.load_source("response", inline_script.filename)
            script_file.response(self, flow)

        flow.reply()


proxy_config = proxy.ProxyConfig(port=8080)
server = ProxyServer(proxy_config)
state = flow.State()
m = ProxyMaster(server, state)

m.load_script("upsidedowninternet.py")
m.load_script("add_header.py")

m.run()

任何关于以正确方式进行操作的想法都将受到赞赏。