代码:
import websocket
ws = websocket.WebSocket()
ws.connect('wss://stream2.binance.com:9443/ws/!miniTicker@arr@3000ms')
record = ws.recv()
print(record)
我试图从Binance Websocket API获取实时数据。尝试使用此示例网址
获取数据时wss://stream.binance.com:9443/ws/bnbbtc@depth
我收到此错误,说明SSL验证失败。
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
回溯:pastebin.com/RiHn025Z
我已尝试过的内容:
所以我在SO How to create Python secure websocket client request?上找到了这个问题,并按照此代码的步骤进行了操作
ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
ws.connect("wss://stream2.binance.com:9443/ws/!miniTicker@arr@3000ms")
但是发生了一个NameError:
NameError: name 'ssl' is not defined
我试图添加一个Exception(这很荒谬但仍然......)导致了SyntaxError。
其他范围
我试过使用wss://的不同websocket API,但在第一个代码本身工作得很好。
wss://ws.blockchain.info/inv
{"op":"ping"}
条件:
我在websockets.org上尝试了一个Echo测试,wss url功能齐全。
任何帮助将不胜感激。还有其他模块专门用于binance但我想拥有原始数据,所以我使用这个api。
感谢您阅读我的问题。
websocket-client的GitHub网址:https://github.com/websocket-client/websocket-client
答案 0 :(得分:2)
看来websocket-client发布了自己的根证书包(不好主意),并且它附带的包不包含签署了stream2.binance.com证书(oops)的CA的特定CA证书。
您可以通过将websocket-client指向更好的捆绑来解决此问题。例如,在Ubuntu上,我在/etc/ssl/certs/ca-certificates.pem
的操作系统上提供了一个很好的包。因此:
WEBSOCKET_CLIENT_CA_BUNDLE=/etc/ssl/certs/ca-certificates.pem python wsexample.py
这样做,我得到了你的示例程序转储的一些数据,可能是你所追求的数据。
更好的方法是告诉websocket-client使用操作系统提供的默认根证书包。但是,我没有看到使用websocket-client执行此操作的简单方法。你可能想看看高速公路作为一个更有特色和可靠的替代方案。
答案 1 :(得分:2)
sslopt={"cert_reqs": ssl.CERT_NONE}
方式是正确的。当您收到NameError:NameError: name 'ssl' is not defined
时,您需要import ssl
它应该工作。解决了我与SSL相关的问题。
答案 2 :(得分:1)
在Mac OS X上,可通过单击 Applications 文件夹的Python目录中的“ 安装Certificates.command ”文件来解决此问题。
要运行该命令,请打开一个新的Finder窗口。点击“应用程序”。然后单击安装Python的目录。例如,“ Python 3.7”。最后,打开“ Install Certificates.command文件。
所有这些都可以通过在终端应用程序中执行以下命令来完成:
open "/Applications/Python 3.7/Install Certificates.command"
注意:您需要登录到下载并安装Python 3.7的帐户。
答案 3 :(得分:0)
http://pydoc.net/websocket-client/0.46.0/websocket._http/
不知道较新版本的websocket-client(摘自0.51.0)是怎么回事,但较旧的_http.py(链接)具有if子句,而新子句仅依赖于环境变量。不幸的是,它在我阅读的任何文档中都没有列出。故障排除花了很长时间才能找到此位,然后我找到了此页。似乎websocket-client可以更好地处理此问题。
def _ssl_socket(sock, user_sslopt, hostname):
sslopt = dict(cert_reqs=ssl.CERT_REQUIRED)
sslopt.update(user_sslopt)
certPath = os.environ.get('WEBSOCKET_CLIENT_CA_BUNDLE')
if certPath and os.path.isfile(certPath) \
and user_sslopt.get('ca_certs', None) is None \
and user_sslopt.get('ca_cert', None) is None:
sslopt['ca_certs'] = certPath
elif certPath and os.path.isdir(certPath) \
and user_sslopt.get('ca_cert_path', None) is None:
sslopt['ca_cert_path'] = certPath