Как подключиться к сервису binance websocket с помощью автобана с помощью asyncio
Я пытаюсь подключиться к службе 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
Я действительно застрял с этим, если бы кто-нибудь мог помочь, я был бы очень признателен.
1 ответ
Что ж, после нескольких часов попыток исправления стало довольно очевидным, я оставлю здесь код, чтобы все могли проверить, нужно ли ему:
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.
Я знаю, уже поздно, но это тоже поможет, и вам придется использовать 4 строки кода:
$ pip установить единорог-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, будет создан в отдельном потоке и написан как сопрограмма с asyncio.
Для обработки полученных данных вы можете использовать этот шаблон: https://github.com/unicorn-data-analysis/unicorn-binance-websocket-api/blob/master/unicorn_binance_websocket_api_process_streams.py