嗯....看起来这是我在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 方法是否可行。
这是替换方法文档的链接。
有谁知道如何做到这一点?我很绝望。:'(