1

再会,

我正在尝试将 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()

如何使用内联脚本运行此代理?

提前致谢

4

1 回答 1

0

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

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

由于某种原因,仅加载文件不起作用,它们会立即触发,但不是通过运行匹配的挂钩来触发。

正如您在 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()

任何关于以正确方式做事的想法都值得赞赏。

于 2016-12-22T03:02:04.993 回答