0

嗯....看起来这是我在stackoverflow上的第一篇文章。在这个小项目上工作完全被困住和浪费时间,我准备放弃了。希望有人可以帮助我。

我一直在使用 mitmproxy。我正在编写一个 python 脚本,以在用户加载页面时用自定义内容替换 http 响应中的 body 标记。

from libmproxy import controller, proxy
import re
import os
import sys

class BodyInjector(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, msg):
        print 'New request detected.'
        if 'Accept-Encoding' in msg.headers:
            msg.headers["Accept-Encoding"] = ["none"]
            print 'Changing encoding.'
        msg.reply()

    def handle_response(self, msg):
        if 'Content-Type' in msg.headers:
            if msg.headers["Content-Type"] == ["text/html"]:
                print 'Webpage detected.  Injecting response.'
                if msg.content:
                    c = msg.replace('/<body itemscope itemtype=\"http:\/\/schema\.org\/WebPage\">.*?<\/body>/', '<body><p>Replacement text.</p></body>')
                    print 'Num replacements:  ' + str(c)
                    if c > 0:
                        print 'Injection successful.'
                    else:
                        print 'Injection unsuccessful.'
        msg.reply()

def main(argv):
    config = proxy.ProxyConfig(cacert = os.path.expanduser("~/.mitmproxy/mitmproxy-ca.pem"))
    server = proxy.ProxyServer(config, 1080)
    print 'Starting Body Replace Server'
    m = BodyInjector(server)
    m.run()

main(sys.argv)

我认为问题在于:

c = msg.replace('/<body itemscope itemtype=\"http:\/\/schema\.org\/WebPage\">.*?<\/body>/', '<body><p>Replacement text.</p></body>')

我已经使用在线正则表达式测试器测试了正则表达式。我认为我的问题是 HTML 是多行的。我需要以某种方式设置 re.DOTALL 标志,但我不确定开发人员编写的 msg.replace 方法是否可行。

这是替换方法文档的链接。

有谁知道如何做到这一点?我很绝望。:'(

4

0 回答 0