如何使用Python订阅Websocket API频道?

25

我正在尝试订阅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},但之后我没有收到数据流。我错过了什么吗?


如果你正在使用API,请先阅读文档。http://docs.bitfinex.com/#subscribe-to-channels - gre_gor
我已经仔细阅读了这些文档。据我所知,我缺少订阅频道的正确代码。然而,通过查阅此处的所有文档 https://pypi.python.org/pypi/websocket-client/ 然后发送('LTCBTC')是正确的订阅方式。我做错了什么? - Emily
我认为您在混淆两个不同的Python包。一个是 websockets 包,这是您最终注释掉的那一行 (#ws.connect("wss://api2.bitfinex.com:3000/ws")),而另一个是您正在使用的实际包 websocket-client - carkod
3个回答

19

文档指出,所有的消息都是以JSON格式进行编码的。

消息编码

通过Bitfinex的WebSocket通道发送和接收的每个消息都以JSON格式进行编码

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

文档提到了三个公共频道:booktradesticker
如果您想订阅一个频道,您需要发送一个订阅事件。

订阅LTCBTC交易的示例,根据文档

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

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

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

@Emily 如果一个答案解决了你的问题,请考虑接受它,这会奖励回答者并帮助未来的访问者更容易地找到解决方案。 - Tim
你解决了如何同时订阅多个事件的问题吗? - readytotaste
你需要定义一个函数来处理数据吗?你能否更新你的答案并提供完整的代码呢? - AndiAna

2
我认为你在混淆两个不同的Python包。其中一个是websockets包,这是你最终注释掉的那一行(#ws.connect("wss://api2.bitfinex.com:3000/ws")),而另一个则是你正在使用的实际包,即websocket-client

1
我更喜欢在打开时发送参数并添加 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})

那个不是OP代码中使用的同样的WebSocket库。 - gre_gor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接