如何使用带有 asyncio 的高速公路连接到 binance websocket 服务

Not*_*bad 5 websocket python-3.x autobahn python-asyncio binance

我正在尝试通过以下方式连接到币安服务:

wss://stream.binance.com:9443/ws/bnbbtc@kline_1m
Run Code Online (Sandbox Code Playgroud)

我知道它有效,因为已经尝试过使用在线网络服务检查器,它注册以侦听服务器并毫无问题地接收 100 万支蜡烛。

正如我所见,当我将路径添加到主机时会出现问题。如果我不添加路径“/ws/bnbbtc@kline_1m”,它会连接但会立即出现错误:

WebSocket connection closed: connection was closed uncleanly (WebSocket connection upgrade failed (400 - BadRequest))
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码,主要是从示例中提取的:

from autobahn.asyncio.websocket import WebSocketClientProtocol, WebSocketClientFactory

class MyClientProtocol(WebSocketClientProtocol):

    def onConnect(self, response):
        print("Server connected: {0}".format(response.peer))

    def onOpen(self):
        print("WebSocket connection open.")

    def onMessage(self, payload, isBinary):
        if isBinary:
            print("Binary message received: {0} bytes".format(len(payload)))
        else:
            print("Text message received: {0}".format(payload.decode('utf8')))

    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))


if __name__ == '__main__':

    import asyncio

    factory = WebSocketClientFactory()
    factory.protocol = MyClientProtocol

    loop = asyncio.get_event_loop()
    coro = loop.create_connection(factory,"stream.binance.com/ws/bnbbtc@kline_1m", 9443)
    loop.run_until_complete(coro)
    loop.run_forever()
loop.close()
Run Code Online (Sandbox Code Playgroud)

使用它,我从 getaddrinfo 得到以下错误:

for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11003] getaddrinfo failed
Run Code Online (Sandbox Code Playgroud)

我真的坚持这一点,如果有人能帮助我真的很感激。

Not*_*bad 7

好吧,经过几个小时的尝试修复非常明显,我将在这里留下代码供任何人检查他们是否需要:

factory = WebSocketClientFactory("wss://stream.binance.com:9443/ws/bnbbtc@kline_1m")
factory.protocol = MyClientProtocol

loop = asyncio.get_event_loop()
coro = loop.create_connection(factory,"stream.binance.com", 9443, ssl=True)
loop.run_until_complete(coro)
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)

我错过了 ssl=True 部分。