Klient wiersza poleceń WebSocket API v1 (Python)

Ostatnia aktualizacja: 1 kwi 2025

Poniższy kod w Pythonie implementuje klienta API wiersza poleceń dla naszego interfejsu API WebSocket v1 giełdy. Kod może być używany jako samodzielny klient API lub może być wywoływany z innych interpretowanych lub skompilowanych języków programowania (Bash, C++ itp.).

Standardowa biblioteka Python WebSocket (websocket-client) jest wymagana do obsługi sieci WebSocket, ale żadne inne biblioteki/moduły API nie są wymagane.

Klient wiersza poleceń WebSocket API można również pobrać jako krakenws.py.

Obsługiwane są wszystkie publiczne kanały danych rynkowych (ticker, book, spread, ohlc, trade), prywatne kanały zarządzania kontem (openOrders i ownTrades) oraz punkty końcowe handlu (addOrder, cancelOrder, cancelAll).

W przypadku prywatnych kanałów/punktów końcowych, token uwierzytelniający WebSocket musi zostać dostarczony poprzez pobranie tokenu z punktu końcowego REST API GetWebSocketsToken, a następnie skopiowanie/wklejenie wartości tokenu do pliku tekstowego o nazwie WS_Token (w tym samym katalogu/folderze co klient API wiersza poleceń).

Użycie

  • krakenws.py feed/endpoint [parametry]

  • ./krakenws.py ticker XBT/USD ETH/EUR XDG/XBT

  • ./krakenws.py book ETH/USD 10

  • ./krakenws.py ohlc LTC/EUR XBT/USD 60

  • ./krakenws.py openOrders

  • ./krakenws.py ownTrades

  • ./krakenws.py addOrder pair=XBT/USD type=buy ordertype=market volume=0.002 leverage=5

  • ./krakenws.py cancelOrder txid=O6L3CW-FD5CZ-NE373X

Sposób użycia klienta wiersza poleceń WebSocket API v1 jest następujący:

Kod Python

#!/usr/bin/env python

# Kraken WebSocket API
#
# Użycie: ./krakenws.py feed/endpoint [parametry]
# Przykład: ./krakenws.py ticker XBT/USD
# Przykład: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Przykład: ./krakenws.py book XBT/USD XBT/EUR 10
# Przykład: ./krakenws.py openOrders
# Przykład: ./krakenws.py ownTrades
# Przykład: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Przykład: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Do zarządzania kontem i handlu, ważny token uwierzytelniający WebSocket (z punktu końcowego REST API GetWebSocketsToken) musi być dostarczony w zwykłym pliku tekstowym o nazwie WS_Token.

import sys
import signal
from websocket import create_connection

def timeoutfunction(signalnumber, frame):
raise KeyboardInterrupt

signal.signal(signal.SIGALRM, timeoutfunction)

api_status = {"ping"}
api_public = {"trade", "book", "ticker", "spread", "ohlc"}
api_private = {"openOrders", "ownTrades", "balances"}
api_trading = {"addOrder", "editOrder", "cancelOrder", "cancelAll", "cancelAllOrdersAfter"}
api_domain_public = "wss://ws.kraken.com/"
api_domain_private = "wss://ws-auth.kraken.com/"
api_symbols = ""
api_number = 0

if len(sys.argv) < 2:
api_feed = "ping"
else:
api_feed = sys.argv[1]

if api_feed in api_status:
api_domain = api_domain_public
api_data = '{"event":"%(feed)s"}' % {"feed":api_feed}
signal.alarm(3)
elif api_feed in api_public:
if len(sys.argv) < 3:
print("Użycie: %s feed/endpoint [parametry]" % sys.argv[0])
print("Przykład: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)
for count in range(2, len(sys.argv)):
if sys.argv[count].isdecimal() == True:
api_number = int(sys.argv[count])
else:
if len(api_symbols) == 0:
api_symbols += sys.argv[count].upper()
else:
api_symbols += '","' + sys.argv[count].upper()
if api_feed == 'book':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "depth":%(depth)d}, "pair":["%(symbols)s"]}' % {"feed":api_feed, "symbols":api_symbols, "depth":api_number if api_number != 0 else 10}
elif api_feed == 'ohlc':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "interval":%(interval)d}, "pair":["%(symbols)s"]}' % {"feed":api_feed, "symbols":api_symbols, "interval":api_number if api_number != 0 else 1}
else:
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s"}, "pair":["%(symbols)s"]}' % {"feed":api_feed, "symbols":api_symbols}
api_domain = api_domain_public
elif api_feed in api_private:
api_domain = api_domain_private
try:
api_token = open("WS_Token").read().strip()
except:
print("Brak tokenu uwierzytelniającego WebSocket (WS_Token)")
sys.exit(1)
if len(sys.argv) >= 3:
if api_feed == 'openOrders':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "ratecounter":%(ratecounter)s, "token":"%(token)s"}}' % {"feed":api_feed, "ratecounter":sys.argv[2].split('=')[1], "token":api_token}
elif api_feed == 'ownTrades':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "snapshot":%(snapshot)s, "token":"%(token)s"}}' % {"feed":api_feed, "snapshot":sys.argv[2].split('=')[1], "token":api_token}
else:
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "token":"%(token)s"}}' % {"feed":api_feed, "token":api_token}
else:
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "token":"%(token)s"}}' % {"feed":api_feed, "token":api_token}
elif api_feed in api_trading:
api_domain = api_domain_private
try:
api_token = open("WS_Token").read().strip()
except:
print("Brak tokenu uwierzytelniającego WebSocket (WS_Token)")
sys.exit(1)
api_data = '{"event":"%(feed)s", "token":"%(token)s"' % {"feed":api_feed, "token":api_token}
for count in range(2, len(sys.argv)):
if sys.argv[count].split('=')[0] == 'txid':
api_data = api_data + ', "%(name)s":["%(value)s"]' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1].replace(',', '","')}
elif sys.argv[count].split('=')[0] == 'reqid':
api_data = api_data + ', "%(name)s":%(value)s' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1]}
elif sys.argv[count].split('=')[0] == 'timeout':
api_data = api_data + ', "%(name)s":%(value)s' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1]}
else:
api_data = api_data + ', "%(name)s":"%(value)s"' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1]}
api_data = api_data + '}'
signal.alarm(3)
else:
print("Użycie: %s feed/endpoint [parametry]" % sys.argv[0])
print("Przykład: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

try:
ws = create_connection(api_domain)
print("WebSocket -> Klient: %s" % ws.recv())
except Exception as error:
print("Połączenie WebSocket nie powiodło się (%s)" % error)
sys.exit(1)

try:
print("Klient -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> Klient: %s" % ws.recv())
except Exception as error:
print("Subskrypcja/żądanie WebSocket nie powiodło się (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> Klient: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("Wiadomości WebSocket nie powiodły się (%s)" % error)
sys.exit(1)

sys.exit(1)

Potrzebujesz więcej pomocy?