如何使用autobahn与asyncio连接到binance websocket服务

时间:2018-04-25 15:27:05

标签: python-3.x websocket python-asyncio autobahn binance

我试图通过以下方式连接到binance服务:

wss://stream.binance.com:9443/ws/bnbbtc@kline_1m

我知道它有效,因为我已尝试使用在线网络服务检查程序并注册以收听服务器并接收1米蜡烛而没有问题。

正如我所看到的那样,当我向主机添加路径时会出现问题。如果我没有添加路径" / ws / bnbbtc @ kline_1m"它连接但是中间错误:

WebSocket connection closed: connection was closed uncleanly (WebSocket connection upgrade failed (400 - BadRequest))

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

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()

使用这个我从getaddrinfo得到以下错误:

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

我真的坚持这一点,如果有人能提供帮助,我会非常感激。

2 个答案:

答案 0 :(得分:3)

好吧,经过几个小时的尝试修复很明显,我会留下代码供任何人检查是否需要:

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()

我错过了ssl = True部分。

答案 1 :(得分:1)

我知道,它来晚了,但这也可以解决问题,您必须使用4行代码:

$ pip安装unicorn-binance-websocket-api

from unicorn_binance_websocket_api.unicorn_binance_websocket_api_manager import BinanceWebSocketApiManager
from unicorn_binance_websocket_api_process_streams import BinanceWebSocketApiProcessStreams

binance_websocket_api_manager = BinanceWebSocketApiManager(BinanceWebSocketApiProcessStreams.process_stream_data)
binance_websocket_api_manager.create_stream('kline_1m', 'bnbbtc')

您使用'create_stream'创建的每个websocket将在单独的线程中创建,并与asyncio一起作为协程编写。

要处理收到的数据,可以使用以下模板:https://github.com/unicorn-data-analysis/unicorn-binance-websocket-api/blob/master/unicorn_binance_websocket_api_process_streams.py