我得到以下错误:

Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in        __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in  run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

以下是导致此错误的代码:

if input.startswith("!web"):
    input = input.replace("!web ", "")      
    url = "https://domainsearch.p.mashape.com/index.php?name=" + input
    req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
    info = urllib2.urlopen(req).read()
    Message.Chat.SendMessage ("" + info)

我正在使用的API要求我使用HTTPS.我怎么才能让它绕过验证呢?

推荐答案

如果你想绕过验证,你可以创建一个新的SSLContext.默认情况下,新创建的上下文使用CERT_NONE.

如第17.3.7.2.1节所述,注意这一点

直接调用SSLContext构造函数时,默认为CERT_NONE.由于它不认证另一个对等方,因此可能不安全,尤其是在客户机模式下,在这种模式下,大多数情况下,您希望确保与之交谈的服务器的真实性.因此,在客户端模式下,强烈建议使用CERT_REQUIRED.

但是,如果出于其他原因,您现在只想让它工作,您可以执行以下操作,您也必须将其设置为import ssl:

input = input.replace("!web ", "")      
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

这应该可以解决你的问题,但你没有真正解决任何问题,但你不会看到[SSL: CERTIFICATE_VERIFY_FAILED],因为你现在没有验证证书!

除此之外,如果你想更多地了解为什么会出现这些问题,你会想看看PEP 476.

本PEP建议在默认情况下,允许对X509证书签名进行验证,以及对Python的HTTP客户端进行主机名验证,但每次调用都会 Select 退出.此更改将应用于Python2.7、Python3.4和Python3.5.

这里有一个建议退出的建议,这与我上面的建议没有什么不同:

import ssl

# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

它还提供了一个highly discouraged选项via monkeypatching,这在python中是不常见的:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

它会用创建未验证上下文的函数覆盖默认的上下文创建函数.

请注意,如政治公众人物中所述:

本指南主要针对希望在尚未支持HTTPS连接上的证书验证的遗留环境中采用较新版本的Python来实现此PEP的系统管理员.例如,管理员可以通过将上面的monkeypatch添加到sitecustomize来 Select 退出.py在Python的标准操作环境中.Applications and libraries SHOULD NOT be making this change process wide(系统管理员控制的配置设置除外).

如果你想读一篇关于为什么不在软件中验证证书是不好的文章,you can find it here

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

Pandas 有条件轮班操作

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

Pandas:将多级列名改为一级

如果值发生变化,则列上的极性累积和

如何在表中添加重复的列?

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

启用/禁用shiny 的自动重新加载

Gekko中基于时间的间隔约束

根据客户端是否正在传输响应来更改基于Flask的API的行为

如何将一组组合框重置回无 Select tkinter?

如何在信号的FFT中获得正确的频率幅值

如何在PythonPandas 中对同一个浮动列进行逐行划分?

Polars表达式无法访问中间列创建表达式

按条件计算将记录拆分成两条记录

文本溢出了Kivy的视区

FileNotFoundError:[WinError 2]系统找不到指定的文件:在os.listdir中查找扩展名

了解如何让库认识到我具有所需的依赖项

Python:使用asyncio.StreamReader.readline()读取长行