Client da riga di comando dell'API WebSocket v1 (Python)

Ultimo aggiornamento: 1 apr 2025

Il seguente codice Python implementa un client API da riga di comando per la nostra API WebSocket v1 di scambio. Il codice può essere utilizzato come client API autonomo o può essere richiamato da altri linguaggi di programmazione interpretati o compilati (Bash, C++, ecc.).

La libreria standard Python WebSocket (websocket-client) è necessaria per il networking WebSocket, ma non sono richieste altre librerie/moduli API.

Il client da riga di comando dell'API WebSocket può anche essere scaricato come krakenws.py.

Sono supportati tutti i feed di dati di mercato pubblici (ticker, book, spread, ohlc, trade), i feed di gestione dell'account privati (openOrders e ownTrades) e gli endpoint di trading (addOrder, cancelOrder, cancelAll).

Per i feed/endpoint privati, è necessario fornire un token di autenticazione WebSocket recuperando il token dall'endpoint GetWebSocketsToken dell'API REST, e quindi copiando/incollando il valore del token in un file di testo chiamato WS_Token (nella stessa directory/cartella del client API da riga di comando).

Utilizzo

  • krakenws.py feed/endpoint [parametri]

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

L'utilizzo del client da riga di comando dell'API WebSocket v1 è il seguente:

Codice Python

#!/usr/bin/env python

# API WebSocket di Kraken
#
# Utilizzo: ./krakenws.py feed/endpoint [parametri]
# Esempio: ./krakenws.py ticker XBT/USD
# Esempio: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Esempio: ./krakenws.py book XBT/USD XBT/EUR 10
# Esempio: ./krakenws.py openOrders
# Esempio: ./krakenws.py ownTrades
# Esempio: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Esempio: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Per la gestione dell'account e il trading, un token di autenticazione WebSocket valido (dall'endpoint GetWebSocketsToken dell'API REST) deve essere fornito in un file di testo semplice chiamato 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("Utilizzo: %s feed/endpoint [parametri]" % sys.argv[0])
print("Esempio: %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("Token di autenticazione WebSocket mancante (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("Token di autenticazione WebSocket mancante (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("Utilizzo: %s feed/endpoint [parametri]" % sys.argv[0])
print("Esempio: %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("Connessione WebSocket fallita (%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("Sottoscrizione/richiesta WebSocket fallita (%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("Messaggi WebSocket falliti (%s)" % error)
sys.exit(1)

sys.exit(1)

Hai ancora bisogno di aiuto?