gpt4 book ai didi

Python - 扭曲、代理和修改内容

转载 作者:IT老高 更新时间:2023-10-28 21:02:30 28 4
gpt4 key购买 nike

所以我已经查看了一些涉及使用 python 和 Twisted 框架编写 HTTP 代理的事情。

基本上,就像其他一些问题一样,我希望能够修改将发送回浏览器的数据。也就是说,浏览器请求资源,代理将获取它。在资源返回到浏览器之前,我希望能够修改任何(HTTP header 和内容)内容。

这(Need help writing a twisted proxy)是我最初发现的。我试过了,但它对我不起作用。我还发现了这个(Python Twisted proxy - how to intercept packets),我认为它可以工作,但是我只能看到来自浏览器的 HTTP 请求。

我正在寻求任何建议。我的一些想法是使用 ProxyClient 和 ProxyRequest 类并覆盖这些函数,但我读到 Proxy 类本身是两者的组合。

对于那些可能要求查看一些代码的人,应该注意的是,我只使用了上述两个示例。任何帮助都很棒。

谢谢。

最佳答案

要创建可以修改服务器响应 header 的 ProxyFactory,您可以覆盖 ProxyClient.handle*() methods 的内容:

from twisted.python import log
from twisted.web import http, proxy

class ProxyClient(proxy.ProxyClient):
"""Mangle returned header, content here.

Use `self.father` methods to modify request directly.
"""
def handleHeader(self, key, value):
# change response header here
log.msg("Header: %s: %s" % (key, value))
proxy.ProxyClient.handleHeader(self, key, value)

def handleResponsePart(self, buffer):
# change response part here
log.msg("Content: %s" % (buffer[:50],))
# make all content upper case
proxy.ProxyClient.handleResponsePart(self, buffer.upper())

class ProxyClientFactory(proxy.ProxyClientFactory):
protocol = ProxyClient

class ProxyRequest(proxy.ProxyRequest):
protocols = dict(http=ProxyClientFactory)

class Proxy(proxy.Proxy):
requestFactory = ProxyRequest

class ProxyFactory(http.HTTPFactory):
protocol = Proxy

我通过查看 twisted.web.proxy 的来源得到了这个解决方案.我不知道它是多么地道。

要将其作为脚本或通过 twistd 运行,请在末尾添加:

portstr = "tcp:8080:interface=localhost" # serve on localhost:8080

if __name__ == '__main__': # $ python proxy_modify_request.py
import sys
from twisted.internet import endpoints, reactor

def shutdown(reason, reactor, stopping=[]):
"""Stop the reactor."""
if stopping: return
stopping.append(True)
if reason:
log.msg(reason.value)
reactor.callWhenRunning(reactor.stop)

log.startLogging(sys.stdout)
endpoint = endpoints.serverFromString(reactor, portstr)
d = endpoint.listen(ProxyFactory())
d.addErrback(shutdown, reactor)
reactor.run()
else: # $ twistd -ny proxy_modify_request.py
from twisted.application import service, strports

application = service.Application("proxy_modify_request")
strports.service(portstr, ProxyFactory()).setServiceParent(application)

用法

$ twistd -ny proxy_modify_request.py

在另一个终端:

$ curl -x localhost:8080 http://example.com

关于Python - 扭曲、代理和修改内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9465236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com