Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 努力通过WebSocket API接收数据_Python_Json_Websocket - Fatal编程技术网

Python 努力通过WebSocket API接收数据

Python 努力通过WebSocket API接收数据,python,json,websocket,Python,Json,Websocket,我正在尝试使用exchange.blockchain.com服务器的API连接到该服务器。如果你想查看的话,这是最新的。我正在编写一个简单的python脚本,每x秒接收一次比特币价格。注意:API限制为每分钟1200个请求。以下是我的代码的第一部分: from websocket import create_connection options = {} options['origin'] = 'https://exchange.blockchain.com' url = "wss:/

我正在尝试使用exchange.blockchain.com服务器的API连接到该服务器。如果你想查看的话,这是最新的。我正在编写一个简单的python脚本,每
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 }
到目前为止,一切都是正确的。现在官方文件说我必须通过渠道
价格
接收市场数据,因此:

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和套接字是如何工作的。因此,我的代码中缺少了一些东西。它是什么?

我不知道这个API的具体情况,但在我看来,您似乎收到了API的第一个响应,如下所示:

{
  "seqnum": 0,
  "event": "subscribed",
  "channel": "prices",
  "symbol": "BTC-USD"
}
然后在收到更新之前退出

您需要保持连接打开以继续接收更新。或许您可以尝试以下方式:

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

为了解释前面的代码片段,我们的总体思路是通过websockets打开一个异步连接,然后继续使用API发送/接收数据。要使此代码正常工作,您仍然需要在代码中执行saem过程,如:已验证、订阅频道等。)

谢谢!您启发我以自己的方式实现它,就像这样:
while True:result=ws.recv()print(result)
@DennisConcepciónMartín乐于帮助:)尽管您的while True实现可以很好地打印结果,在处理WebSocket时,我建议您使用异步函数,这样就不会阻止代码的执行。请记住,在接收数据之后,您可能还希望在该真实循环之外发送数据或处理数据。此外,while-True可以用于打印数据,但一次只限于一个操作/端点,例如,您不能扩展它以从其他端点获取数据。没错,我在运行while-True代码时才意识到这一点。。。我将尝试实现你的代码。@DennisConcepciónMartín当然。如果你需要进一步的帮助,请告诉我。