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

Última atualização: 1/04/2025

O seguinte código Python implementa um cliente API de linha de comandos para a nossa API WebSocket v1 de câmbio. 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ária.

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 (na mesma diretoria/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("A ligação WebSocket falhou (%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("A subscrição/pedido WebSocket falhou (%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("As mensagens WebSocket falharam (%s)" % error)
sys.exit(1)

sys.exit(1)

Precisa de mais ajuda?