Python - Twisted、代理和修改内容

2024-02-15

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

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

This ( 需要帮助编写扭曲的代理 https://stackoverflow.com/questions/6491932/need-help-writing-a-twisted-proxy)是我最初发现的。我尝试过,但它对我不起作用。我还发现了这个(Python Twisted代理-如何拦截数据包 https://stackoverflow.com/questions/9063583/python-twisted-proxy-how-to-intercept-packets)我认为这可行,但是我只能看到来自浏览器的 HTTP 请求。

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

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

Thanks.


创造ProxyFactory可以修改服务器响应标头,您可以覆盖的内容ProxyClient.handle*() methods http://twistedmatrix.com/trac/browser/trunk/twisted/web/proxy.py#L62:

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 http://twistedmatrix.com/trac/browser/trunk/twisted/web/proxy.py。我不知道这有多么地道。

将其作为脚本运行或通过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)

Usage

$ twistd -ny proxy_modify_request.py

在另一个终端中:

$ curl -x localhost:8080 http://example.com
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python - Twisted、代理和修改内容 的相关文章

  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • Pycharm 在 os.path 连接上出现“未解析的引用”

    将pycharm升级到2018 1 并将python升级到3 6 5后 pycharm报告 未解析的引用 join 最新版本的 pycharm 不会显示以下行的任何警告 from os path import join expanduser
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 如何在 sqlalchemy 中比较日期?

    我有以下简单的设置 其中 fromDate 和 toDate 是格式为 YYYY MM DD 的字符串 class SomeType Base date Column DateTime def findAll fromDate toDate
  • MongoDB C# foreach BsonElement

    我有一个 C 类 我实例化并使用它在集合中执行 CRUD 操作 public class Property BsonId public long id get set BsonElement address line public stri
  • 无法让 rspec、spork 和调试器发挥良好作用

    Given I am a dumb programmer and I am using rspec and I am using spork and I want to debug mmm let s saaay a spec for Ph
  • JPA 中的引用完整性约束违规错误

    我正在尝试解析网络请求并将其保存到数据库 我有 3 个模型 第一个节点是 virtualDocument 这是uniq表 根据请求url VirtualRequest 表包含所有请求主体 HttpHeaderList 表根据其 virtua
  • 原始 Win32 中的 Rich Edit 控件

    Rich Edit Controls 的文档真的像看起来那样糟糕 错误吗 现在 我正在手动调用 LoadLibrary riched20 dll 以便显示 Rich Edit 控件 Rich Edit 的文档在使用 Rich Edit 控件
  • 下拉列表中页面加载时已选择的选项,也可更改[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 预选择下拉选项 https stackoverflow com questions 3030604 php pre select drop down option 我的 php 项目中有一种情
  • 是否可以将“plt.yticks”放在水平条之间?

    我试图将价值放入plt yticks酒吧之间 不幸的是 我不知道该怎么做 有可能吗 如果有的话 有人可以给一些提示吗 import pandas as pd import numpy as np import matplotlib pypl
  • 从信号图像(RGB)中去除背景“噪音”

    I have some signal images 正如您所看到的 其中一些包含颜色信号 一些只是灰色 黑色信号 我的任务是提取白色背景的纯信号仅有的 这意味着我需要删除图像中除信号之外的所有内容 我检查了虚线 点线 实线 顶部和底部 具有
  • 当我两次启动闹钟时会发生什么?

    我正在克服困难 当然 这并不那么复杂 以避免两次启动警报 基本代码如下 AlarmManager mgr AlarmManager getSystemService Context ALARM SERVICE Intent i new In
  • ElasticSearch 服务启动但无法访问并且不执行任何日志记录

    Azure 中 Linux Ubuntu 16 04 3 VM 上的 ElasticSearch 6 2 2 它一直运行良好 但几天前我重新启动机器后 我根本无法启动 ElasticSearch 服务 问题已在这里分享和解决 Elastic
  • 更改相关产品标题在 WooCommerce 中添加产品名称

    我有这段代码 试图将 相关产品 翻译成 这些产品与产品名称搭配得很好 这是我的代码 add filter gettext change related products title 10 3 function change related
  • 在编译时将 this 指针和类方法的参数传递给本地 lambda 函数

    假设您有一个场景 当您想要创建一个constexprlambda 在编译时计算某些内容的方法中 struct A int a constexpr A int a a a constexpr auto operator const A rhs
  • “if-then-else”(总是)可以被函数调用替换吗?

    这个问题主要是出于对 PL 如何工作的好奇 实际上我是在查看 SML 时想到的 SML 与 Haskell 的不同之处在于前者使用按值调用 但我的问题是关于 Haskell 的 Haskell 据我了解 具有 按需调用 语义 这是否意味着如
  • 快速的射弹并不总是能击中

    因此 对于我的游戏 有一个快速移动的子弹对象 其精灵大小为 5x5 大约 以大约 30 的速度移动 需要撞击厚度仅为 5 像素左右的相对较薄的 Enemy 物体 子弹以一定的固定距离间隔穿过敌人而不会发生碰撞 I think这是因为子弹移动
  • DataMan iPhone 应用程序如何在后台工作

    AppStore 上的 DataMan 应用程序 DataMan Lite 是该应用程序的免费版本 有助于监控您的数据使用情况 http www iphonelife com blog 2686 monitor your data usag
  • matlab如何求解大型、对称和稀疏线性系统

    也就是说 当我这样做时A b对于非常大 对称且稀疏的 A matlab 使用什么算法 如果矩阵是稀疏且对称正定的 但有very窄带 然后使用专门的带解算器 大多数矩阵没有足够窄的带来触发这种情况 通常 它会在样条工具箱中提供一维样条 二维问
  • 评估 MySQL 中的表达式

    我有一个包含 a b expr 列的表 expr 是其他列的表达式 例如表包含 a b expr 2 5 a b 3 4 a b 3 我喜欢简单地运行一个查询并获得流动的结果 a b expr 2 5 7 3 4 15 我在文档中搜索函数
  • SQL在同一字段中搜索多个值

    我正在构建一个简单的search算法 我想打破我的带空格的字符串 并在其上搜索我的数据库 如下所示 search Sony TV with FullHD support search explode search SELECT name F
  • 仅删除 vb.net 中的一个特定事件处理程序

    我正在编写一个小型 2D 引擎 使用 Lua 来控制它 过去一段时间我一直在 Lua 和 VB net 之间设置事件 我意识到 问题是我似乎无法删除那些搞砸了很多事情的事件 因为它们在应该完成的时候被调用 为了解决这个问题 我想添加某种方法
  • Python - Twisted、代理和修改内容

    所以我研究了一些涉及使用 python 和 Twisted 框架编写 HTTP 代理的事情 本质上 像其他一些问题一样 我希望能够修改将发送回浏览器的数据 也就是说 浏览器请求资源 代理将获取它 在资源返回到浏览器之前 我希望能够修改任何