Cliente de linha de comandos da API WebSocket v1 (Python)

Última atualização: 1 de abril de 2025

O seguinte código Python implementa um cliente API de linha de comandos para a nossa API WebSocket v1 de exchange. O código pode ser usado como um cliente API autónomo, ou pode ser chamado a partir de outras linguagens de programação interpretadas ou compiladas (Bash, C++, etc.).

A biblioteca padrão Python WebSocket (websocket-client) é necessária para a rede WebSocket, mas nenhuma outra biblioteca/módulo API é necessário.

O cliente de linha de comandos da API WebSocket também pode ser descarregado como krakenws.py.

Todos os feeds de dados de mercado públicos (ticker, book, spread, ohlc, trade), feeds de gestão de conta privados (openOrders e ownTrades), e endpoints de negociação (addOrder, cancelOrder, cancelAll) são suportados.

Para os feeds/endpoints privados, um token de autenticação WebSocket deve ser fornecido, obtendo o token do endpoint GetWebSocketsToken da API REST, e depois copiando/colando o valor do token num ficheiro de texto chamado WS_Token (no mesmo diretório/pasta que o cliente API de linha de comandos).

Utilização

  • krakenws.py feed/endpoint [parâmetros]

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

A utilização do cliente de linha de comandos da API WebSocket v1 é a seguinte:

Código Python

#!/usr/bin/env python

# API WebSocket da Kraken
#
# Utilização: ./krakenws.py feed/endpoint [parâmetros]
# Exemplo: ./krakenws.py ticker XBT/USD
# Exemplo: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Exemplo: ./krakenws.py book XBT/USD XBT/EUR 10
# Exemplo: ./krakenws.py openOrders
# Exemplo: ./krakenws.py ownTrades
# Exemplo: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Exemplo: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Para gestão de conta e negociação, um token de autenticação WebSocket válido (do endpoint GetWebSocketsToken da API REST) deve ser fornecido num ficheiro de texto simples chamado 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("Utilização: %s feed/endpoint [parâmetros]" % sys.argv[0])
print("Exemplo: %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 de autenticação WebSocket em falta (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 de autenticação WebSocket em falta (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("Utilização: %s feed/endpoint [parâmetros]" % sys.argv[0])
print("Exemplo: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

try:
ws = create_connection(api_domain)
print("WebSocket -> Cliente: %s" % ws.recv())
except Exception as error:
print("Falha na ligação WebSocket (%s)" % error)
sys.exit(1)

try:
print("Cliente -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> Cliente: %s" % ws.recv())
except Exception as error:
print("Falha na subscrição/pedido WebSocket (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> Cliente: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("Falha nas mensagens WebSocket (%s)" % error)
sys.exit(1)

sys.exit(1)

Precisa de mais ajuda?