Как подключиться к веб-сокету api poloniex.com с помощью библиотеки python
Я пытаюсь подключиться к wss://api.poloniex.com и подписаться на тикер. Я не могу найти ни одного рабочего примера в Python. Я попытался использовать autobahn/twisted и websocket-client 0.32.0.
Цель этого - получить данные тикера в реальном времени и сохранить их в базе данных mysql.
До сих пор я пытался использовать примеры, приведенные в документации библиотеки. Они работают для локального хоста или тестового сервера, но если я перехожу на wss://api.poloniex.com, я получаю кучу ошибок.
вот моя попытка с помощью websocket-клиента 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()
и это использует автобан / витой:
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()
Был бы очень признателен за полный, но простой пример, показывающий, как подключиться и подписаться на push-API websocket с использованием любой библиотеки python.
4 ответа
То, что вы пытаетесь выполнить, можно сделать с помощью WAMP, в частности, с помощью модулей WAMP библиотеки autobahn (которую вы уже пытаетесь использовать).
После ознакомления с их документами мне удалось создать простой пример с использованием 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()
Вы можете найти более подробную информацию о программировании WAMP с помощью автобана здесь: http://autobahn.ws/python/wamp/programming.html
При этом используется недокументированная конечная точка веб-сокета, поскольку 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()
Каналы:
1001 = trollbox (you will get nothing but a heartbeat)
1002 = ticker
1003 = base coin 24h volume stats
1010 = heartbeat
'MARKET_PAIR' = market order books
Между тем, Poloniex изменил API тикера, поэтому теперь он возвращает идентификатор символа вместо имени, так что, возможно, кто-то найдет это полезным:
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
В настоящее время Twisted неправильно использует хранилище доверенных сертификатов Windows. Таким образом, проверка сертификата TLS не удастся. Чтобы обойти это, пока Twisted или Autobahn не включат обходной путь, вы можете:
- устанавливать
certifi
модуль (pip install certifi
) - установить SSL_CERT_FILE, как
export SSL_CERT_FILE="$(python -m certifi)"