扭曲的 HTTPS 客户端

2024-01-20

我目前在使用扭曲的 python 库访问通过 https 托管的内容时遇到一些问题。我是这个库的新手,并且假设我缺少一些导致问题的概念,但可能不是基于示例。

这是我收集示例的页面的链接:https://twistedmatrix.com/documents/current/web/howto/client.html https://twistedmatrix.com/documents/current/web/howto/client.html

在标题下基于 SSL 的 HTTP

from twisted.python.log import err
from twisted.web.client import Agent
from twisted.internet import reactor
from twisted.internet.ssl import optionsForClientTLS

def display(response):
    print("Received response")
    print(response)

def main():
    contextFactory = optionsForClientTLS(u"https://example.com/")
    agent = Agent(reactor, contextFactory)
    d = agent.request("GET", "https://example.com/")
    d.addCallbacks(display, err)
    d.addCallback(lambda ignored: reactor.stop())
    reactor.run()

if __name__ == "__main__":
    main()

运行这段代码时,它直接失败了。我收到如下错误:

Traceback (most recent call last):
  File "https.py", line 19, in <module>
    main()
  File "https.py", line 11, in main
    contextFactory = optionsForClientTLS(u"https://example.com/")
  File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1336, in optionsForClientTLS
    return ClientTLSOptions(hostname, certificateOptions.getContext())
  File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1198, in __init__
    self._hostnameBytes = _idnaBytes(hostname)
  File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 86, in _idnaBytes
    return idna.encode(text)
  File "/usr/local/lib/python2.7/dist-packages/idna/core.py", line 355, in encode
    result.append(alabel(label))
  File "/usr/local/lib/python2.7/dist-packages/idna/core.py", line 276, in alabel
    check_label(label)
  File "/usr/local/lib/python2.7/dist-packages/idna/core.py", line 253, in check_label
    raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
idna.core.InvalidCodepoint: Codepoint U+003A at position 6 of u'https://example' not allowed

这个错误让我相信参数被传递到客户端TLS选项是不正确的。它需要主机名而不是完整的 url,因此我将参数缩短为简单的example.com。进行更改后,该功能成功完成。

但不幸的是,进行更改后,脚本现在在调用行失败代理请求。它提供的错误是这样的:

Traceback (most recent call last):
  File "https.py", line 19, in <module>
    main()
  File "https.py", line 13, in main
    d = agent.request("GET", "https://example.com/")
  File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 1596, in request
    endpoint = self._getEndpoint(parsedURI)
  File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 1580, in _getEndpoint
    return self._endpointFactory.endpointForURI(uri)
  File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 1456, in endpointForURI
    uri.port)
  File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 982, in creatorForNetloc
    context = self._webContextFactory.getContext(hostname, port)
AttributeError: 'ClientTLSOptions' object has no attribute 'getContext'

此错误使我相信 optionsForClientTLS 生成的对象不是预期在创建时传递到代理的对象类型。正在尝试调用不存在的函数。综上所述,我有两个问题。

  1. 这个例子是否已被弃用?前面的 http 请求示例都非常有效。我做错了什么,还是这个例子不再有效?
  2. 我只是在寻找一种使用 HTTPS 从服务器检索数据的简单方法。如果这种方式不是解决方案,那么有人熟悉如何使用twisted 发出HTTPS 请求吗?

是的,您完全正确,文档中的示例是错误的。我注意到了这个错误工作时与/treq https://github.com/twisted/treq/issues/65#issuecomment-249660064。尝试以下这个例子 https://twistedmatrix.com/documents/14.0.0/web/howto/client.html#http-over-ssl从 v14 开始。话虽这么说,你应该使用treq https://treq.readthedocs.io/en/latest/而不是尝试直接使用 Twisted。大部分繁重的工作已为您完成。这是您的示例的简单转换:

from __future__ import print_function
import treq
from twisted.internet import defer, task
from twisted.python.log import err

@defer.inlineCallbacks
def display(response):
    content = yield treq.content(response)
    print('Content: {0}'.format(content))

def main(reactor):
    d = treq.get('https://twistedmatrix.com')
    d.addCallback(display)
    d.addErrback(err)
    return d

task.react(main)

如你看到的treq为您处理 SSL 事务。这display()回调函数可用于提取 HTTP 响应的各种组件,例如标头、状态代码、正文等。如果您只需要单个组件,例如响应正文,那么您可以进一步简化,如下所示:

def main(reactor):
    d = treq.get('https://twistedmatrix.com')
    d.addCallback(treq.content)     # get response content when available
    d.addErrback(err)
    d.addCallback(print)
    return d

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

扭曲的 HTTPS 客户端 的相关文章

  • xlrd.biffh.XLRDError:Excel xlsx 文件;不支持[重复]

    这个问题在这里已经有答案了 我正在尝试使用读取启用宏的 Excel 工作表pandas read excel与 xlrd 库 它在本地运行良好 但是当我尝试将其推送到 PCF 时 我收到此错误 2020 12 11T21 09 53 441
  • Kivy - 文本换行工作错误

    我正在尝试在 Kivy 1 8 0 应用程序中换行文本 当没有太多文字时 一切正常 但如果文本很长并且窗口不是很大 它只是剪切文本 这是示例代码 vbox BoxLayout orientation vertical size hint y
  • for 循环如何评估其参数

    我的问题很简单 Does a for循环评估它每次使用的参数 Such as for i in range 300 python 是否会为此循环的每次迭代创建一个包含 300 个项目的列表 如果是的话 这是避免这种情况的方法吗 lst ra
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 更改 python tkinter canvas 中的线坐标

    我画了一条线tkinter Canvas现在我想移动一端 这可能吗 例如和itemconfig import tkinter tk tkinter Tk canvas tkinter Canvas tk canvas pack line c
  • `list()` 被认为是一个函数吗?

    list显然是内置类型 https docs python org 3 library stdtypes html list在Python中 我看到底下有一条评论this https stackoverflow com a 53645813
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 如何在 robobrowser-python 中发出 POST 请求

    http robobrowser readthedocs org en latest api html http robobrowser readthedocs org en latest api html 我正在尝试使用 APIbrows
  • Pandas - 合并数据框以将所有值保留在左侧,如果“左侧没有键”,则从右侧“插入”值,否则“更新”左侧现有的“键”

    我有两个数据框 df1 和 df2 np random seed 0 df1 pd DataFrame key A B C D id 2 23 234 2345 2021 np random randn 4 df2 pd DataFrame
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • vb6 ADODB 连接字符串到 sql server 2008

    我最近将数据库从 sql server 2005 迁移到 windows server 2008 上的 2008 客户端从 XP 计算机连接得很好 SQL Management Studio 2008 也是如此 我还使用 LINQPad 测
  • 在 Android 上共享音频输入

    我正在为 Android 手机应用程序做一些准备研究 该应用程序将涉及用户同时拨打电话时的语音搜索或语音识别 我发现当我正在通话并尝试调用语音搜索或类似的操作 从麦克风获取输入 时 我会收到 音频错误 消息 手机应用程序是否对手机的麦克风输
  • 我应该在抽象方法的主体中放置什么?

    假设我有以下抽象类Foo import abc class Foo abc ABC abc abstractmethod def bar self raise NotImplementedError 我应该在主体中放入什么bar方法 我看到
  • 如何判断该帐户是否是Google Apps帐户?

    我正在使用 net V3 dll 版本 2 0 1 0 的 Google 文档列表 api 我正在使用此链接中所述的客户端登录身份验证https developers google com google apps documents lis
  • iPhone 推送通知自定义声音,静音模式下没有振动?

    因此 我的推送通知可以通过自定义声音在我的应用程序中正常工作 然而 当我的iPhone处于静音模式时 我发送带有自定义声音的推送通知时 声音明显不播放 但也没有振动 如果我发送带有 sound chime 或类似不存在的内容的推送通知 iP
  • 如何实现动态@ConfigurationProperties前缀

    我需要将动态环境名称作为配置属性的前缀传递 我将从命令行将环境作为 VM 参数传递 并且应为该环境加载所有属性 我的配置 Configuration EnableConfigurationProperties PropertySource
  • 如何使用正则表达式提取PHP中的文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的文字 12a49803 713c 4204 a8e6 248e554a352d Content Type text plain c
  • MaterialDatePicker 不适用于 Android

    我想将项目的日期选择器更改为 Android 的 Material Components 提供的日期选择器 但它不起作用 这是我尝试过的代码 MaterialDatePicker Builder
  • 使用 RWeka 2-gram 和 3-gram 而不是 1-gram

    我正在尝试使用 RWeka NGramTokenizer 函数从训练语料库中提取 1 gram 2 gram 和 3 gram 不幸的是 只得到1克 有我的代码 train corpus clean up cleanset1 lt tm m
  • 为什么 virtualenv 环境包含 argparse、distribute 和 wsgiref? [复制]

    这个问题在这里已经有答案了 我在用virtualenv版本 1 7 1 2python2 7 3 创建虚拟python环境 但是当我创建这样的环境并激活它时 我可以看到安装了以下软件包 使用pip freeze argparse 1 2 1
  • 无法使用 Rails 2.3.4 发送电子邮件(我可以使用 2.3.2)

    我正在使用 ruby on Rails 2 3 4 昨天我发现我无法再发送电子邮件了 与电子邮件相关的凭据没问题 因为我可以发送电子邮件 直到大约两周前升级我的 Rails 版本 我收到的错误消息如下 ArgumentError in Us
  • GetAllNetworkInterfaces() 抛出异常

    在 Android 的 Mono 中 我试图获取本地网络中我的设备的所有 IP 地址 我不介意环回 但我对调用 DNS 不感兴趣 最好的办法似乎是打电话 using System Net NetworkInformation Network
  • 部署到 Azure 时找不到 ConnectionString configSource

    我通过将连接字符串从 web config 移到外部文件中来保护我的 MVC5 项目 而不是将其签入源代码管理 也不将其添加到项目中 我的 web config 看起来像
  • ServiceStack路由设计

    这3条路线一样吗 通常首选哪一种 Route todo id DELETE Route todo delete POST Route todo delete id GET public class DeleteTodo IReturnVoi
  • 如何为同一发行版中的多个 Perl 模块设计单元测试?

    我一直在开发一个内部框架 它是用一堆 Perl 模块设计的 所有这些模块都依赖于公开一些 Win32 功能的单个模块 例如A B C D 等模块都依赖于单个模块 Z 因此所有这些模块都将通过 use MyFramework Z 导入 所有这
  • Moshi 适配器跳过 List 中的坏对象

    我使用 Moshi 我需要用有问题的后端来解决我的问题 有时 当我请求对象列表时 其中一些不包含必填字段 当然 我可以捕获并处理JsonDataException 但我想跳过这些对象 我怎样才能用莫西做到这一点 Update 我有几个模型可
  • Python scipy/numpy 中相关性的层次聚类?

    如何在相关矩阵上运行层次聚类scipy numpy 我有一个 100 行 x 9 列的矩阵 我想根据 9 个条件中每个条目的相关性进行分层聚类 我想使用 1 pearson 相关性作为聚类距离 假设我有一个numpy array X包含 1
  • 如何解决“构建:未知编译器选项‘listemitedfiles’。”在 Visual Studio 2015 更新 3 上?

    更新 NuGet 类型脚本包后 我遇到了一个常见的构建错误问题 tsc exe 退出 代码为 1 经过搜索 我找到了解决方法 按照建议 我安装了另外两个名为 Microsoft TypeScript Compiler 和 Microsoft
  • Shell执行多个文件

    我想知道是否可以通过某种方式使用 ShellExecute 使用默认动词处理程序一次打开多个文件 例如 如果一个文件夹中有多个 mp3 文件 我可以选择所有文件 然后右键单击并选择 播放 这将打开一个 WMP 实例 这是我的默认 mp3 播
  • 扭曲的 HTTPS 客户端

    我目前在使用扭曲的 python 库访问通过 https 托管的内容时遇到一些问题 我是这个库的新手 并且假设我缺少一些导致问题的概念 但可能不是基于示例 这是我收集示例的页面的链接 https twistedmatrix com docu