Как подключиться к сервису веб-сокетов binance с помощью автобана с помощью 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

Я действительно застрял с этим, если кто-нибудь может помочь, я был бы очень признателен.


person Notbad    schedule 25.04.2018    source источник


Ответы (2)


Что ж, после нескольких часов попыток исправления стало довольно очевидно, я оставлю здесь код, чтобы кто-нибудь мог проверить, нужен ли он:

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.

person Notbad    schedule 25.04.2018
comment
вы запускаете это внутри работника сельдерея? как вы справляетесь с возможностью того, что ваш сервер перестает отвечать на запросы клиентов при получении данных из потоков, я предполагаю, что все это выполняется в основном потоке основного процесса - person PirateApp; 15.06.2018

Я знаю, уже поздно, но это тоже поможет, и вам нужно использовать 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, будет создан в отдельном потоке и написан как сопрограмма с asyncio.

Для обработки полученных данных вы можете использовать этот шаблон: https://github.com/unicorn-data-analysis/unicorn-binance-websocket-api/blob/master/unicorn_binance_websocket_api_process_streams.py

person Oliver    schedule 04.06.2019