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

时间:2016-12-21 00:03:42

标签: python python-2.7 proxy mitmproxy

美好的一天,

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

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

提前致谢

1 个答案:

答案 0 :(得分: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()

任何关于以正确的方式做到这一点的想法都会受到赞赏。