Проблемы с получением данных через WebSocket API - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь подключиться к серверу exchange.blockchain.com, используя их API. Вот официальная документация , если вы хотите ее проверить. Я работаю над простым python скриптом для получения Bitcoin цен каждые x секунд. Примечание: API имеет ограничение в 1200 запросов в минуту. Вот первая часть моего кода:

from websocket import create_connection
options = {}
options['origin'] = 'https://exchange.blockchain.com'
url = "wss://ws.prod.blockchain.info/mercury-gateway/v1/ws"
ws = create_connection(url, **options)
msg = '{"token": "{API_SECRET}", "action": "subscribe", "channel": "auth"}'
ws.send(msg)
result =  ws.recv()
print(result)
ws.close()

Я получаю следующий результат:

{ "seqnum":0,
  "event":"subscribed",
  "channel":"auth",
  "readOnly":false }

Пока все правильно. Теперь в официальной документации сказано, что я должен подписаться на канал prices для получения рыночных данных, поэтому:

msg = {
     "action": "subscribe",
     "channel": "prices",
     "symbol": "BTC-USD",
     "granularity": 60
      }

ws.send(str(msg))
result =  ws.recv()
print(result)
ws.close()

Результат:

{
  "seqnum": 0,
  "event": "subscribed",
  "channel": "prices",
  "symbol": "BTC-USD"
}

Все в порядке, но, согласно в документацию, я предполагаю получить также следующий вывод с данными, запрошенными через канал

{
  "seqnum": 2,
  "event": "updated",
  "channel": "prices",
  "symbol": "BTC-USD",
  "price": [1559039640, 8697.24, 8700.98, 8697.27, 8700.98, 0.431]
}

Конечно, моя проблема в том, что я не получаю последнюю и наиболее важную часть вывода . Я думаю, это потому, что я не знаю, как работает API и сокет. Поэтому в моем коде чего-то не хватает. Что это?

1 Ответ

1 голос
/ 12 июля 2020
• 1000 1004 *

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

import websockets as ws
import asyncio
async def givme_bitcoins(websocket): # takes in the ws connection object
    while True:
        try:
            data = await websocket.recv()
        except ws.ConnectionClosed:
            print(f"Terminated")
            break

        print(data)



async def main():
    try:
        await asyncio.wait([givme_bitcoins(URL)])
    except Exception as e:
        raise e


if __name__ == "__main__":
    asyncio.run(main())

Чтобы объяснить предыдущий фрагмент, общая идея заключается в том, что мы открываем асинхронное соединение через веб-сокеты и продолжаем отправлять / получать данные с помощью API. для работы вам все равно нужно выполнить процесс saem в своем коде, например: аутентифицирован, подписаться на каналы ... et c.).

...