如何使用python库连接到poloniex.com websocket api

Mat*_*van 20 api websocket python-3.x

我正在尝试连接到wss://api.poloniex.com并订阅自动收报机.我在python中找不到任何有用的例子.我曾尝试使用autobahn/twisted和websocket-client 0.32.0.

这样做的目的是获取实时的自动收报机数据并将其存储在mysql数据库中.

到目前为止,我已尝试使用库文档中提供的示例.它们适用于localhost或测试服务器,但如果我改为wss://api.poloniex.com,我会收到一堆错误.

这是我尝试使用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()
Run Code Online (Sandbox Code Playgroud)

这是使用高速公路/扭曲:

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()
Run Code Online (Sandbox Code Playgroud)

一个完整而简单的示例显示如何使用任何python库连接和订阅websocket push api将非常感激.

Ric*_*Han 28

这使用了未记录的websocket端点,因为Poloniex已经取消了对原始WAMP套接字端点的支持.

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()
Run Code Online (Sandbox Code Playgroud)

渠道是:

1001 = trollbox (you will get nothing but a heartbeat)
1002 = ticker
1003 = base coin 24h volume stats
1010 = heartbeat
'MARKET_PAIR' = market order books
Run Code Online (Sandbox Code Playgroud)

  • @ riccio777我刚开始将此代码用于订单(货币对)数据.消息输出如下:[148,394056638,[["o",0,"0.07615527","0.34317849"]]] 148:似乎是货币对的ID.394056638:序列号(我假设完整订单簿之前的最后一个序列值)"o"+ 0:orderBookRemove"o"+ 1:orderBookModify"0.07615527":价格"0.34317849":数量 (6认同)
  • 对@GabeSpradlin赞赏的规范稍作修改:我相信他们在这次迭代中已经取消了orderBookRemove(证据:"o"+1消息指定了一个卷,它并不总是0).因此,对于"o"消息,0是要求,1是要修改的出价(证据:从经验数据推断,0/1也匹配从这些通道提供的订单簿快照中的要求/出价的索引). (5认同)
  • 除了@GabeSpradlin所提到的:`["t","9394200",1,"5545.00000000","0.00009541",1508060546]`这是一个贸易条目(t)并被定义为`[trade,tradeId ,0/1(卖/买),价格,金额,时间戳]` (4认同)
  • 另外一个补充:`["i",{"currencyPair":"BTC_XMR","orderBook":[{"0.02427000":"18.91841222","0.02431500":"0.16475174",...},{... }]}]`.这似乎是一个"初始"消息,它在一开始就被检索到.所有其他数据只是更新.正如您所看到的那样,它显示了哪一对发送以及该对的整个订单簿(包含2个对象的数组:bid/ask) (2认同)

Ion*_*iuc 13

您要完成的任务可以通过使用WAMP完成,特别是使用高速公路库的WAMP模块(您已经尝试使用).

在关注他们的文档之后,我设法使用autobahn和asyncio建立了一个简单的例子.以下示例订阅"ticker"订阅源并打印接收的值:

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()
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关使用高速公路进行WAMP编程的更多详细信息:http://autobahn.ws/python/wamp/programming.html

  • 这种方法已经过时了.我不认为Poloniex目前支持这个端点.请参阅下面的答案. (6认同)
  • 您使用的是什么Python版本?这个例子适用于Python 3.3+,因为它使用`asyncio`和`yield from`构造将执行委托给不同的协程.您可以在此处找到更多详细信息:https://docs.python.org/3/library/asyncio-task.html (4认同)

leb*_*cht 9

与此同时poloniex更改了自动收录器API,所以现在它返回一个符号ID而不是名称,所以也许有人会觉得这很有用:

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
Run Code Online (Sandbox Code Playgroud)