Как передать query string при подключении к вебсокету OKX?

Рейтинг: 0Ответов: 1Опубликовано: 30.07.2023

пишу приложение на Python и возникла необходимость воспользоваться вебсокетом от OKX, нужно получать книгу ордеров. В документации нашёл какие параметры нужно передавать и попытался написать код. К вебсокету подключаюсь, но никаких данных от туда не получают, подскажите пожалуйста в чём проблема? Думаю что проблема кроется в том что я неправильно передаю параметры

import websockets
import asyncio


async def on_message(message):
    print("publicCallback", message)


async def main():
    url = 'wss://ws.okx.com:8443/ws/v5/public?op=subscribe&args=[{"channel":"books","instId":"BTC-USDT"}]'
    async with websockets.connect(url) as client:
        while True:
            print(await client.recv())

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

Ответы

▲ 0

Вот здесь в документации, описано, как подписаться на получение сообщений.
Прежде чем перекладывать на код, потренироваться можно в POSTMAN:

Скриншот POSTMAN показывающий работу сокета

Работает.

Забираем это же сообщение в Python:

from websocket import create_connection
import json

request = {
  "op": "subscribe",
  "args": [
    {
      "channel": "books",
      "instId": "BTC-USDT"
    }
  ]
}

ws = create_connection('wss://ws.okx.com:8443/ws/v5/public')

ws.send(json.dumps(request))
response = ws.recv()
print(response)
Вывод:
'{"event":"subscribe","arg":{"channel":"books","instId":"BTC-USDT"}}'

Для простоты примера я не использовал асинхрон, но ничто не мешает вам получать сообщения после отправки подписки точно так же, как вы это хотели делать в вопросе.

Поясню ещё чуть подробнее про сообщение. То что вы делаете, вы соединяетесь с сокетом, и передаёте параметры при попытке соединения, но для соединения они не нужны, поэтому дальше ничего и не происходит. После подключения необходимо сокету отправить сообщение, вот в нём то, как раз, и необходимо ваши параметры перечислить.