Pra*_*tik 7 python ssl client websocket
代码:
import websocket
ws = websocket.WebSocket()
ws.connect('wss://stream2.binance.com:9443/ws/!miniTicker@arr@3000ms')
record = ws.recv()
print(record)
Run Code Online (Sandbox Code Playgroud)
我试图从 Binance Websocket API 获取实时数据。尝试使用此示例 url 获取数据时
wss://stream.binance.com:9443/ws/bnbbtc@depth
Run Code Online (Sandbox Code Playgroud)
我收到此错误,表示 SSL 验证失败。
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
Run Code Online (Sandbox Code Playgroud)
追溯: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")
Run Code Online (Sandbox Code Playgroud)
但随后发生了NameError:
NameError: name 'ssl' is not defined
Run Code Online (Sandbox Code Playgroud)
我尝试添加一个异常(这很荒谬,但仍然......),这导致了语法错误。
其他范围
我尝试使用不同的 websocket API,它使用 wss:// 但在第一个代码本身中工作得很好。
wss://ws.blockchain.info/inv
{"op":"ping"}
Run Code Online (Sandbox Code Playgroud)
状况:
我在 websockets.org 上尝试了 Echo 测试,wss url 功能齐全。
任何帮助将不胜感激。还有其他专门用于 binance 的模块,但我想要原始数据,所以我使用这个 api。
感谢您阅读我的问题。
websocket-client 的 GitHub URL:https ://github.com/websocket-client/websocket-client
小智 9
在 Mac OS X 上,通过单击位于“Applications”文件夹的 Python 目录中的“ Install Certificates.command ”文件即可解决该问题。
要运行该命令,请打开一个新的 Finder 窗口。单击“应用程序”。然后点击Python的安装目录。例如,“Python 3.7”。最后,启动“安装证书.命令文件”。
所有这些都可以通过在终端应用程序中执行以下命令来完成:
open "/Applications/Python 3.7/Install Certificates.command"
Run Code Online (Sandbox Code Playgroud)
注意:您需要登录下载并安装 Python 3.7 的帐户。
方法sslopt={"cert_reqs": ssl.CERT_NONE}是正确的。当你收到 NameError:NameError: name 'ssl' is not defined你需要import ssl
并且它应该可以工作。解决了我的 SSL 相关问题。
看来 websocket-client 发布了自己的根证书捆绑包(坏主意),并且它发布的捆绑包不包含签署了 Stream2.binance.com 证书的 CA 的特定 CA 证书(哎呀)。
您可以通过将 websocket-client 指向更好的包来解决此问题。例如,在 Ubuntu 上,我有一个由操作系统提供的良好捆绑包,位于/etc/ssl/certs/ca-certificates.pem. 所以:
WEBSOCKET_CLIENT_CA_BUNDLE=/etc/ssl/certs/ca-certificates.pem python wsexample.py
Run Code Online (Sandbox Code Playgroud)
这样做,我得到了您的示例程序转储的一些数据,大概就是您想要的数据。
更好的方法是告诉 websocket-client 使用操作系统提供的默认根证书包。但是,我没有看到使用 websocket-client 执行此操作的简单方法。您可能想看看 Autobahn,这是一个功能更强大、更可靠的替代方案。