Клієнт командного рядка WebSocket API v1 (Python)

Останнє оновлення: 1 квіт. 2025 р.

Наведений нижче код Python реалізує клієнт командного рядка API для нашого обмінного WebSocket API v1. Код можна використовувати як автономний клієнт API або викликати з інших інтерпретованих чи компільованих мов програмування (Bash, C++, тощо).

Стандартна бібліотека Python WebSocket (websocket-client) потрібна для роботи мережі WebSocket, але інші бібліотеки/модулі API не потрібні.

Клієнт командного рядка WebSocket API також можна завантажити як krakenws.py.

Підтримуються всі публічні канали ринкових даних (тікер, книга ордерів, спред, ohlc, торгівля), приватні канали управління рахунком (openOrders та ownTrades) та торгові кінцеві точки (addOrder, cancelOrder, cancelAll).

Для приватних каналів/кінцевих точок необхідно надати токен автентифікації WebSocket, отримавши токен з кінцевої точки REST API GetWebSocketsToken, а потім скопіювавши/вставивши значення токена в текстовий файл з назвою WS_Token (у тому ж каталозі/папці, що й клієнт командного рядка API).

Використання

  • krakenws.py feed/endpoint [параметри]

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

Використання клієнта командного рядка WebSocket API v1 є наступним:

Код Python

#!/usr/bin/env python

# Kraken WebSocket API
#
# Використання: ./krakenws.py feed/endpoint [параметри]
# Приклад: ./krakenws.py ticker XBT/USD
# Приклад: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Приклад: ./krakenws.py book XBT/USD XBT/EUR 10
# Приклад: ./krakenws.py openOrders
# Приклад: ./krakenws.py ownTrades
# Приклад: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Приклад: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Для управління рахунком та торгівлі дійсний токен автентифікації WebSocket (з кінцевої точки REST API GetWebSocketsToken) має бути наданий у текстовому файлі з назвою 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("Використання: %s feed/endpoint [параметри]" % sys.argv[0])
print("Приклад: %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 відсутній (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 відсутній (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("Використання: %s feed/endpoint [параметри]" % sys.argv[0])
print("Приклад: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

try:
ws = create_connection(api_domain)
print("WebSocket -> Клієнт: %s" % ws.recv())
except Exception as error:
print("З'єднання WebSocket не вдалося (%s)" % error)
sys.exit(1)

try:
print("Клієнт -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> Клієнт: %s" % ws.recv())
except Exception as error:
print("Підписка/запит WebSocket не вдалися (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> Клієнт: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("Повідомлення WebSocket не вдалися (%s)" % error)
sys.exit(1)

sys.exit(1)

Потрібна додаткова допомога?