4

Coinbase Exchange API、特に Websocket フィードを使用して、オーダーブックのスナップショットを作成しようとしています。

https://docs.exchange.coinbase.com/?python#websocket-feed

接続を確立し、最初のサブスクライブ メッセージを送信することに成功したと思います。最初のサブスクライブ メッセージの後、onMessage イベントを期待しています。しかし、そのようなメッセージは到着していないようです。最終的に接続はタイムアウトになり、閉じます。

コード:

from twisted.internet import reactor
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS
import json

class ClientProtocol(WebSocketClientProtocol):
    def onConnect(self, response):
        print("Server connected: {0}".format(response.peer))
    def initMessage(self):
        message_data = [{"type": "subscribe", "product_id": "BTC-USD"}]
        message_json = json.dumps(message_data)
        print "sendMessage: " + message_json
        self.sendMessage(message_json)
    def onOpen(self):
        print "onOpen calls initMessage()"
        self.initMessage()
    def onMessage(self, msg, binary):
        print "Got echo: " + msg
    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))

if __name__ == '__main__':
    factory = WebSocketClientFactory("wss://ws-feed.exchange.coinbase.com")
    factory.protocol = ClientProtocol
    connectWS(factory)
    reactor.run()

出力:

python orders_twisted.py
サーバーが接続されました: tcp4:190.93.242.231:443
onOpen は initMessage() を呼び出します
sendMessage: [{"type": "subscribe", "product_id": "BTC-USD"}]
WebSocket 接続が閉じられました: 接続が正しく閉じられませんでした (ピアは以前の WebSocket クローズ ハンドシェイクなしで TCP 接続をドロップしました)
4

1 に答える 1

2

購読リクエストを辞書の JSON 配列として送信していましたが、単なる辞書である必要があります。コードを次のように変更します。

def initMessage(self):
    message_data = [{"type": "subscribe", "product_id": "BTC-USD"}]
    message_json = json.dumps(message_data)
    ...

に:

def initMessage(self):
    message_data = {"type": "subscribe", "product_id": "BTC-USD"}
    message_json = json.dumps(message_data)
    ...

この変更により、コードは正常にサブスクライブされます...

于 2015-02-08T17:40:35.577 に答える