WebSocket API v1 Befehlszeilen-Client (Python)

Zuletzt aktualisiert: 1. Apr. 2025

Der folgende Python-Code implementiert einen Befehlszeilen-API-Client für unsere Exchange WebSocket API v1. Der Code kann als eigenständiger API-Client verwendet oder von anderen interpretierten oder kompilierten Programmiersprachen (Bash, C++, etc.) aufgerufen werden.

Die Standard-Python-WebSocket-Bibliothek (websocket-client) ist für die WebSocket-Netzwerkkommunikation erforderlich, aber keine anderen API-Bibliotheken/Module sind notwendig.

Der WebSocket API Befehlszeilen-Client kann auch als krakenws.py heruntergeladen werden.

Alle öffentlichen Marktdaten-Feeds (Ticker, Orderbuch, Spread, OHLC, Trade), privaten Kontoverwaltungs-Feeds (openOrders und ownTrades) und Trading-Endpunkte (addOrder, cancelOrder, cancelAll) werden unterstützt.

Für die privaten Feeds/Endpunkte muss ein WebSocket-Authentifizierungstoken bereitgestellt werden, indem der Token vom REST API GetWebSocketsToken Endpunkt abgerufen und der Token-Wert dann in eine Textdatei namens WS_Token (im selben Verzeichnis/Ordner wie der Befehlszeilen-API-Client) kopiert/eingefügt wird.

Verwendung

  • krakenws.py feed/endpoint [Parameter]

  • ./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

Die Verwendung des WebSocket API v1 Befehlszeilen-Clients ist wie folgt:

Python-Code

#!/usr/bin/env python

# Kraken WebSocket API
#
# Verwendung: ./krakenws.py feed/endpoint [Parameter]
# Beispiel: ./krakenws.py ticker XBT/USD
# Beispiel: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Beispiel: ./krakenws.py book XBT/USD XBT/EUR 10
# Beispiel: ./krakenws.py openOrders
# Beispiel: ./krakenws.py ownTrades
# Beispiel: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Beispiel: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Für die Kontoverwaltung und den Handel muss ein gültiger WebSocket-Authentifizierungstoken (vom REST API GetWebSocketsToken Endpunkt) in einer einfachen Textdatei namens WS_Token bereitgestellt werden.

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("Verwendung: %s feed/endpoint [Parameter]" % sys.argv[0])
print("Beispiel: %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("WebSocket-Authentifizierungstoken fehlt (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("WebSocket-Authentifizierungstoken fehlt (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("Verwendung: %s feed/endpoint [Parameter]" % sys.argv[0])
print("Beispiel: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

try:
ws = create_connection(api_domain)
print("WebSocket -> Client: %s" % ws.recv())
except Exception as error:
print("WebSocket-Verbindung fehlgeschlagen (%s)" % error)
sys.exit(1)

try:
print("Client -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> Client: %s" % ws.recv())
except Exception as error:
print("WebSocket-Abonnement/Anfrage fehlgeschlagen (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> Client: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("WebSocket-Nachrichten fehlgeschlagen (%s)" % error)
sys.exit(1)

sys.exit(1)

Brauchst du weitere Hilfe?