pythonsubscribewamp-protocolpoloniex

How can I build a WAMP protocol client to subscibe in Python2?


I want to build a WAMP(the Web Application Messaging Protocol) client to subscribe ticker of poloniex. There are some useful infomation in poloniex's API document like following:

The best way to get public data updates on markets is via the push API,
which pushes live ticker, order book, trade, and Trollbox updates over 
WebSockets using the WAMP protocol. In order to use the push API, 
connect to wss://api.poloniex.com and subscribe to the desired feed. 
In order to receive ticker updates, subscribe to "ticker". 

But they didn't say how to use python to subscribe it.Then I try to search in google, I coundn't anything help.

Can anyone show me how to build a WAMP client to subscibe the ticker of poloniex? Thanks!

----------- update -------------- I found code following what seems do what I want:

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(u"wss://api.poloniex.com:443", "realm1")
    runner.run(PoloniexComponent)


if __name__ == "__main__":
    main()

But it show error following:

Traceback (most recent call last):
  File "wamp.py", line 5, in <module>
    from autobahn.asyncio.wamp import ApplicationSession
  File "/usr/lib/python2.7/site-packages/autobahn/asyncio/__init__.py", line 36, in <module>
    from autobahn.asyncio.websocket import \
  File "/usr/lib/python2.7/site-packages/autobahn/asyncio/websocket.py", line 32, in <module>
    txaio.use_asyncio()
  File "/usr/lib/python2.7/site-packages/txaio/__init__.py", line 122, in use_asyncio
    from txaio import aio
  File "/usr/lib/python2.7/site-packages/txaio/aio.py", line 47, in <module>
    import asyncio
  File "/usr/lib/python2.7/site-packages/asyncio/__init__.py", line 9, in <module>
    from . import selectors
  File "/usr/lib/python2.7/site-packages/asyncio/selectors.py", line 39
    "{!r}".format(fileobj)) from None
                               ^
SyntaxError: invalid syntax

I found some clue that seems some module only work correctly in python3. How disappointed!


Solution

  • Finally I found the answer following, it can do what I want:

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

    Thanks for author who named Ricky Han!