2015-08-22 5 views
18

Ich versuche, eine Verbindung zu wss: //api.poloniex.com und Abonnieren von Ticker. Ich kann kein funktionierendes Beispiel in Python finden. Ich habe versucht, Autobahn/twisted und websocket-client 0.32.0 zu verwenden.Verbindung mit polonyex.com Websocket API mit einer Python-Bibliothek

Der Zweck davon ist, Echtzeit Ticker-Daten zu erhalten und es in einer MySQL-Datenbank zu speichern.

Bisher habe ich versucht, Beispiele aus der Bibliotheksdokumentation zu verwenden. Sie arbeiten für localhost oder den Testserver, aber wenn ich zu wss: //api.poloniex.com wechsel, bekomme ich eine Reihe von Fehlern.

hier ist mein Versuch mit WebSocket-Client 0.32.0:

from websocket import create_connection 
ws = create_connection("wss://api.poloniex.com") 
ws.send("ticker") 
result = ws.recv() 
print "Received '%s'" % result 
ws.close() 

und dies wird mit Autobahn/twisted:

from autobahn.twisted.websocket import WebSocketClientProtocol 
from autobahn.twisted.websocket import WebSocketClientFactory 


class MyClientProtocol(WebSocketClientProtocol): 

    def onConnect(self, response): 
     print("Server connected: {0}".format(response.peer)) 

    def onOpen(self): 
     print("WebSocket connection open.") 

     def hello(): 
      self.sendMessage(u"ticker".encode('utf8')) 
      self.sendMessage(b"\x00\x01\x03\x04", isBinary=True) 
      self.factory.reactor.callLater(1, hello) 

     # start sending messages every second .. 
     hello() 

    def onMessage(self, payload, isBinary): 
     if isBinary: 
      print("Binary message received: {0} bytes".format(len(payload))) 
     else: 
      print("Text message received: {0}".format(payload.decode('utf8'))) 

    def onClose(self, wasClean, code, reason): 
     print("WebSocket connection closed: {0}".format(reason)) 


if __name__ == '__main__': 

    import sys 

    from twisted.python import log 
    from twisted.internet import reactor 

    log.startLogging(sys.stdout) 

    factory = WebSocketClientFactory("wss://api.poloniex.com", debug=False) 
    factory.protocol = MyClientProtocol 

    reactor.connectTCP("wss://api.poloniex.com", 9000, factory) 
    reactor.run() 

Ein komplettes aber einfaches Beispiel zeigt, wie eine Verbindung herstellen und abonnieren zu einem Websocket-Push-API unter Verwendung einer Python-Bibliothek würde sehr geschätzt werden.

Antwort

12

Was Sie erreichen möchten, können Sie mit WAMP durchführen, insbesondere mit den WAMP-Modulen der Autobahnbibliothek (die Sie bereits verwenden).

Nachdem ich ihren Dokumenten gefolgt war, gelang es mir, ein einfaches Beispiel mit Autobahn und Asyncio einzurichten. Das folgende Beispiel schließt sich der ‚Ticker‘ Futtermittel und druckt die empfangenen Werte:

from autobahn.asyncio.wamp import ApplicationSession 
from autobahn.asyncio.wamp import ApplicationRunner 
from asyncio import coroutine 


class PoloniexComponent(ApplicationSession): 
    def onConnect(self): 
     self.join(self.config.realm) 

    @coroutine 
    def onJoin(self, details): 
     def onTicker(*args): 
      print("Ticker event received:", args) 

     try: 
      yield from self.subscribe(onTicker, 'ticker') 
     except Exception as e: 
      print("Could not subscribe to topic:", e) 


def main(): 
    runner = ApplicationRunner("wss://api.poloniex.com:443", "realm1") 
    runner.run(PoloniexComponent) 


if __name__ == "__main__": 
    main() 

Sie können hier weitere Details über WAMP Programmierung mit Autobahn finden: http://autobahn.ws/python/wamp/programming.html

+0

Ertrag von selfScribe (onTicker, 'Ticker') SyntaxError: ungültige Syntax –

+4

In welcher Python-Version sind Sie? Dieses Beispiel ist für Python 3.3+, da es 'asyncio' und das' yield from' Konstrukt verwendet, um die Ausführung an eine andere Coroutine zu delegieren. Sie können weitere Details hier finden: https://docs.python.org/3/library/asyncio-task.html –

+0

Python 2.7.3, Sie haben Recht. Danke –

4

Derzeit unterstützt Verdrehte nicht ordnungsgemäß das Windows verwenden Vertrauensgeschäft. Die Überprüfung des TLS-Zertifikats schlägt daher fehl. um diese bis entweder Verdrehte oder Autobahn zu umgehen, eine Abhilfe enthält können Sie:

  • installieren certifi Modul (pip install certifi)
  • Satz SSL_CERT_FILE, wie export SSL_CERT_FILE="$(python -m certifi)"
+0

Danke Meejah. Das hat auch unter Linux geholfen. – Andz

+0

Twisted * sollte den globalen Trust-Store unter Linux verwenden; vielleicht sind Sie auf einer minimalen Linux-Installation, die sie aus irgendeinem Grund nicht enthält? – meejah

24

Dieses undokumentierten websocket Endpunkt weil Poloniex verwendet hat Unterstützung für den ursprünglichen WAMP-Socket-Endpunkt abgerufen.

import websocket 
import thread 
import time 
import json 

def on_message(ws, message): 
    print(message) 

def on_error(ws, error): 
    print(error) 

def on_close(ws): 
    print("### closed ###") 

def on_open(ws): 
    print("ONOPEN") 
    def run(*args): 
     ws.send(json.dumps({'command':'subscribe','channel':1001})) 
     ws.send(json.dumps({'command':'subscribe','channel':1002})) 
     ws.send(json.dumps({'command':'subscribe','channel':1003})) 
     ws.send(json.dumps({'command':'subscribe','channel':'BTC_XMR'})) 
     while True: 
      time.sleep(1) 
     ws.close() 
     print("thread terminating...") 
    thread.start_new_thread(run,()) 


if __name__ == "__main__": 
    websocket.enableTrace(True) 
    ws = websocket.WebSocketApp("wss://api2.poloniex.com/", 
           on_message = on_message, 
           on_error = on_error, 
           on_close = on_close) 
    ws.on_open = on_open 
    ws.run_forever() 

Die Kanäle sind:

1001 = trollbox (you will get nothing but a heartbeat) 
1002 = ticker 
1003 = base coin 24h volume stats 
1010 = heartbeat 
'MARKET_PAIR' = market order books 
+0

Ich bin mir sicher, dass die vorherige Antwort von @Ion Scerbatiuc perfekt funktioniert, aber ich benutze Python 2.7.x, daher war diese Antwort eine bessere Option für mich. Die Antwort von Ion basiert auf Python 3.5 und höher. – MikeyE

+0

Korrektur: Nach erneutem Lesen der Kommentare zu Ion's Antwort sieht es so aus, als ob seine Lösung auf Python 3.3 basiert. – MikeyE

+0

Froh, dass ich helfen könnte –

6

Inzwischen poloniex den Ticker API geändert, so dass jetzt gibt es ein Symbol-id anstelle eines Namens, vielleicht jemand finden diese nützlich:

7: BTC_BCN 
8: BTC_BELA 
10: BTC_BLK 
12: BTC_BTCD 
13: BTC_BTM 
14: BTC_BTS 
15: BTC_BURST 
20: BTC_CLAM 
24: BTC_DASH 
25: BTC_DGB 
27: BTC_DOGE 
28: BTC_EMC2 
31: BTC_FLDC 
32: BTC_FLO 
38: BTC_GAME 
40: BTC_GRC 
43: BTC_HUC 
50: BTC_LTC 
51: BTC_MAID 
58: BTC_OMNI 
61: BTC_NAV 
63: BTC_NEOS 
64: BTC_NMC 
69: BTC_NXT 
73: BTC_PINK 
74: BTC_POT 
75: BTC_PPC 
83: BTC_RIC 
89: BTC_STR 
92: BTC_SYS 
97: BTC_VIA 
98: BTC_XVC 
99: BTC_VRC 
100: BTC_VTC 
104: BTC_XBC 
108: BTC_XCP 
112: BTC_XEM 
114: BTC_XMR 
116: BTC_XPM 
117: BTC_XRP 
121: USDT_BTC 
122: USDT_DASH 
123: USDT_LTC 
124: USDT_NXT 
125: USDT_STR 
126: USDT_XMR 
127: USDT_XRP 
129: XMR_BCN 
130: XMR_BLK 
131: XMR_BTCD 
132: XMR_DASH 
137: XMR_LTC 
138: XMR_MAID 
140: XMR_NXT 
148: BTC_ETH 
149: USDT_ETH 
150: BTC_SC 
151: BTC_BCY 
153: BTC_EXP 
155: BTC_FCT 
158: BTC_RADS 
160: BTC_AMP 
162: BTC_DCR 
163: BTC_LSK 
166: ETH_LSK 
167: BTC_LBC 
168: BTC_STEEM 
169: ETH_STEEM 
170: BTC_SBD 
171: BTC_ETC 
172: ETH_ETC 
173: USDT_ETC 
174: BTC_REP 
175: USDT_REP 
176: ETH_REP 
177: BTC_ARDR 
178: BTC_ZEC 
179: ETH_ZEC 
180: USDT_ZEC 
181: XMR_ZEC 
182: BTC_STRAT 
183: BTC_NXC 
184: BTC_PASC 
185: BTC_GNT 
186: ETH_GNT 
187: BTC_GNO 
188: ETH_GNO 
189: BTC_BCH 
190: ETH_BCH 
191: USDT_BCH 
192: BTC_ZRX 
193: ETH_ZRX 
194: BTC_CVC 
195: ETH_CVC 
196: BTC_OMG 
197: ETH_OMG 
198: BTC_GAS 
199: ETH_GAS 
200: BTC_STORJ 
Verwandte Themen