【问题标题】:How To Subscribe To Websocket API Channel Using Python?如何使用 Python 订阅 Websocket API 通道?
【发布时间】:2016-02-19 11:11:15
【问题描述】:

我正在尝试订阅 Bitfinex.com websocket API 公共频道BTCUSD。

代码如下:

from websocket import create_connection
ws = create_connection("wss://api2.bitfinex.com:3000/ws")
ws.connect("wss://api2.bitfinex.com:3000/ws")
ws.send("LTCBTC")
while True:

    result = ws.recv()
    print ("Received '%s'" % result)

ws.close()

我相信ws.send("BTCUSD")是订阅公共频道的?我收到一条消息,我认为正在确认订阅({"event":"info","version":1},但之后我没有收到数据流。我错过了什么?

更新:这是最终有效的代码。

import json

from websocket import create_connection
ws = create_connection("wss://api2.bitfinex.com:3000/ws")
#ws.connect("wss://api2.bitfinex.com:3000/ws")
ws.send(json.dumps({
    "event": "subscribe",
    "channel": "book",
    "pair": "BTCUSD",
    "prec": "P0"
}))


while True:
    result = ws.recv()
    result = json.loads(result)
    print ("Received '%s'" % result)

ws.close()

【问题讨论】:

标签: python api python-3.x websocket


【解决方案1】:

The documentation 表示所有消息都是 JSON 编码的。

消息编码

通过 Bitfinex 的 websocket 通道发送和接收的每条消息都以 JSON 格式编码

您需要导入json 库,对您的消息进行编码和解码。

The documentation 提到了三个公共频道:book、trades 和 ticker。
如果你想订阅一个频道,你需要发送一个订阅事件。

订阅LTCBTC交易的例子,根据the documentation:

ws.send(json.dumps({
    "event":"subscribe",
    "channel":"trades",
    "channel":"LTCBTC"
})

那么你还需要解析传入的 JSON 编码消息。

result = ws.recv()
result = json.loads(result)

【讨论】:

  • @Emily 如果某个答案解决了您的问题,请考虑接受它,它会奖励回答者并帮助未来的访问者更轻松地找到解决方案
  • 你知道如何同时订阅多个事件吗?
  • 是否需要定义一个函数来处理数据?你能用完整的代码更新你的答案吗?
【解决方案2】:

我认为您在这里混合了 2 个不同的 python 包。一个是 websockets 包,它是您最终注释掉的行 (#ws.connect("wss://api2.bitfinex.com:3000/ws")),另一个是您正在使用的实际包,它是 websocket-client

【讨论】:

    【解决方案3】:

    我更喜欢在打开时发送参数并添加 ssl 以防止错误

    import websocket
    import ssl
    import json
    
    SOCKET = 'wss://api-pub.bitfinex.com/ws/2'
    
    params = {
        "event": "subscribe",
        "channel": "book",
        "pair": "BTCUSD",
        "prec": "P0"
        }
    
    def on_open(ws):
        print('Opened Connection')
        ws.send(json.dumps(params))
    
    def on_close(ws):
        print('Closed Connection')
    
    def on_message(ws, message):
        print (message)
    
    def on_error(ws, err):
      print("Got a an error: ", err)
    
    
    ws = websocket.WebSocketApp(SOCKET, on_open = on_open, on_close = on_close, on_message = on_message,on_error=on_error)
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
    

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2021-12-04
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多