WebSocket API v1 komut satırı istemcisi (Python)

Son güncelleme: 1 Nis 2025

Aşağıdaki Python kodu, borsa WebSocket API v1'imiz için bir komut satırı API istemcisi uygular. Kod, bağımsız bir API istemcisi olarak veya diğer yorumlanmış veya derlenmiş programlama dillerinden (Bash, C++ vb.) çağrılabilir.

WebSocket ağ iletişimi için standart Python WebSocket kütüphanesi (websocket-client) gereklidir, ancak başka hiçbir API kütüphanesi/modülü gerekli değildir.

WebSocket API komut satırı istemcisi krakenws.py olarak da indirilebilir.

Tüm genel piyasa veri akışları (ticker, book, spread, ohlc, trade), özel hesap yönetimi akışları (openOrders ve ownTrades) ve işlem uç noktaları (addOrder, cancelOrder, cancelAll) desteklenmektedir.

Özel akışlar/uç noktalar için, REST API GetWebSocketsToken uç noktasından jeton alınarak ve ardından jeton değeri WS_Token adlı bir metin dosyasına (komut satırı API istemcisiyle aynı dizinde/klasörde) kopyalanıp yapıştırılarak bir WebSocket kimlik doğrulama jetonu sağlanmalıdır.

Kullanım

  • krakenws.py besleme/uç nokta [parametreler]

  • ./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 komut satırı istemcisinin kullanımı aşağıdaki gibidir:

Python Kodu

#!/usr/bin/env python

# Kraken WebSocket API
#
# Kullanım: ./krakenws.py besleme/uç nokta [parametreler]
# Örnek: ./krakenws.py ticker XBT/USD
# Örnek: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Örnek: ./krakenws.py book XBT/USD XBT/EUR 10
# Örnek: ./krakenws.py openOrders
# Örnek: ./krakenws.py ownTrades
# Örnek: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Örnek: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Hesap yönetimi ve alım satım için, geçerli bir WebSocket kimlik doğrulama jetonu (REST API GetWebSocketsToken uç noktasından) WS_Token adlı düz metin bir dosyada sağlanmalıdır.

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("Kullanım: %s besleme/uç nokta [parametreler]" % sys.argv[0])
print("Örnek: %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 kimlik doğrulama jetonu eksik (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 kimlik doğrulama jetonu eksik (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("Kullanım: %s besleme/uç nokta [parametreler]" % sys.argv[0])
print("Örnek: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

try:
ws = create_connection(api_domain)
print("WebSocket -> İstemci: %s" % ws.recv())
except Exception as error:
print("WebSocket bağlantısı başarısız oldu (%s)" % error)
sys.exit(1)

try:
print("İstemci -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> İstemci: %s" % ws.recv())
except Exception as error:
print("WebSocket aboneliği/isteği başarısız oldu (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> İstemci: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("WebSocket mesajları başarısız oldu (%s)" % error)
sys.exit(1)

sys.exit(1)

Daha fazla yardıma mı ihtiyacınız var?