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

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

Клієнт командного рядка REST API на Python надає повний доступ до REST API Kraken через командний рядок (наприклад, Terminal на macOS), тому не вимагає знань програмування або досвіду роботи з API.

Усі функції REST API доступні, зокрема:

  • публічні кінцеві точки ринкових даних

  • приватні кінцеві точки даних облікового запису

  • приватні кінцеві точки торгівлі

  • приватні кінцеві точки фінансування

  • приватні кінцеві точки заробітку

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

Встановлення

1. Встановіть Python 3 (за потреби).

  • На macOS та Linux Python 3, можливо, вже встановлено.

  • На Windows Python 3, ймовірно, не встановлено, але його можна завантажити з https://www.python.org/.

2. Завантажте та збережіть файл krakenapi.py на свій комп’ютер у вибрану вами папку (каталог).

Наприклад: Macintosh HD > Users > Satoshi > KrakenAPI


3. Відкрийте командний рядок (наприклад, Terminal на macOS) і перейдіть до папки (каталогу), вибраної на попередньому кроці. Для навігації можна використовувати команду UNIX/Linux "cd" (змінити каталог).

Наприклад:cd /Users/Satoshi/KrakenAPI


4. Зробіть файл krakenapi.py виконуваним.

Ви можете використовувати команду UNIX/Linux "chmod 755" (змінити режим).

Наприклад: chmod 755 krakenapi.py


5. Додайте свій ключ API до тієї ж папки, де ви зберігаєте файл krakenapi.py.

  • Скопіюйте/вставте свій публічний ключ API з управління обліковим записом у текстовий файл під назвою "API_Public_Key".

  • Скопіюйте/вставте свій приватний (секретний) ключ API у текстовий файл під назвою "API_Private_Key".

Доступні інструкції зі створення/налаштування ключа API.

Ключ API потрібен лише в тому випадку, якщо ви плануєте використовувати приватні кінцеві точки API для доступу до свого облікового запису Kraken (наприклад, запити балансу, розміщення/скасування замовлень, експорт історії облікового запису тощо).

Приклади команд

Використання клієнта командного рядка REST API виглядає так:

./krakenapi.py endpoint [parameters] [-pretty]

Клієнт командного рядка підтримує всі кінцеві точки REST API, тому нижче наведено лише кілька прикладів команд:

python

Python

# Time
./krakenapi.py Time

# Ticker
./krakenapi.py Ticker pair=xbtusd

# Trades
./krakenapi.py Trades pair=etheur since=1574067140000000000

# Balance
./krakenapi.py Balance

# Trade Balance
./krakenapi.py TradeBalance asset=xbt

# Query Orders
./krakenapi.py QueryOrders txid=O7MN22-ZCX7J-TGLQHD

# Add Order
./krakenapi.py AddOrder pair=xbtusd type=buy ordertype=limit price=6500 volume=0.002 leverage=5

# Cancel Order
./krakenapi.py CancelOrder txid=O7MN22-ZCX7J-TGLQHD

За замовчуванням клієнт командного рядка виводить оригінальну відповідь API (JSON, придатний для інтерпретації за допомогою коду), але якщо використовується додатковий аргумент командного рядка -pretty:

./krakenapi.py TradeBalance asset=shib -pretty

клієнт виведе ту саму відповідь API у зручному для людини форматі JSON (з розривами рядків/відступами).

Код Python:

python

Python

#!/usr/bin/env python3

# Kraken Rest API
#
# Usage: ./krakenapi endpoint [parameters]
# Example: ./krakenapi Time
# Example: ./krakenapi OHLC pair=xbtusd interval=1440
# Example: ./krakenapi Balance
# Example: ./krakenapi TradeBalance asset=xdg
# Example: ./krakenapi OpenPositions
# Example: ./krakenapi AddOrder pair=xxbtzusd type=buy ordertype=market volume=0.003 leverage=5

import sys
import time
import base64
import hashlib
import hmac
import urllib.request
import json

api_public = {"Time", "Assets", "AssetPairs", "Ticker", "OHLC", "Depth", "Trades", "Spread", "SystemStatus"}
api_private = {"Balance", "BalanceEx", "TradeBalance", "OpenOrders", "ClosedOrders", "QueryOrders", "TradesHistory", "QueryTrades", "OpenPositions", "Ledgers", "QueryLedgers", "TradeVolume", "AddExport", "ExportStatus", "RetrieveExport", "RemoveExport", "GetWebSocketsToken", "CreateSubaccount", "AccountTransfer"}
api_trading = {"AddOrder", "AddOrderBatch", "EditOrder", "CancelOrder", "CancelOrderBatch", "CancelAll", "CancelAllOrdersAfter","OrderAmends","AmendOrder","ListSubaccounts"}
api_funding = {"DepositMethods", "DepositAddresses", "DepositStatus", "WithdrawMethods", "WithdrawAddresses", "WithdrawInfo", "Withdraw", "WithdrawStatus", "WithdrawCancel", "WalletTransfer"}
api_staking = {"Earn/Strategies", "Earn/Allocations", "Earn/Allocate", "Earn/Deallocate", "Earn/AllocateStatus", "Earn/DeallocateStatus", "Staking/Assets", "Staking/Balance", "Stake", "Unstake", "Staking/Pending", "Staking/Transactions"}

api_domain = "https://api.kraken.com"
api_data = ""

output_format = 0

if len(sys.argv) < 2:
	api_method = "Time"
elif len(sys.argv) == 2:
	api_method = sys.argv[1]
else:
	api_method = sys.argv[1]
	for count in range(2, len(sys.argv)):
		if sys.argv[count] == '-pretty':
			output_format = 1
			continue
		if count == 2:
			api_data = sys.argv[count]
		else:
			api_data = api_data + "&" + sys.argv[count]

if api_method in api_private or api_method in api_trading or api_method in api_funding or api_method in api_staking:
	api_path = "/0/private/"
	api_nonce = str(int(time.time()*1000))
	try:
		api_key = open("API_Public_Key").read().strip()
		api_secret = base64.b64decode(open("API_Private_Key").read().strip())
	except:
		print("API public key and API private (secret) key must be in plain text files called API_Public_Key and API_Private_Key")
		sys.exit(1)
	api_postdata = api_data + "&nonce=" + api_nonce
	api_postdata = api_postdata.encode('utf-8')
	api_sha256 = hashlib.sha256(api_nonce.encode('utf-8') + api_postdata).digest()
	api_hmacsha512 = hmac.new(api_secret, api_path.encode('utf-8') + api_method.encode('utf-8') + api_sha256, hashlib.sha512)
	api_request = urllib.request.Request(api_domain + api_path + api_method, api_postdata)
	api_request.add_header("API-Key", api_key)
	api_request.add_header("API-Sign", base64.b64encode(api_hmacsha512.digest()))
	api_request.add_header("User-Agent", "Kraken REST API")
elif api_method in api_public:
	api_path = "/0/public/"
	api_request = urllib.request.Request(api_domain + api_path + api_method + '?' + api_data)
	api_request.add_header("User-Agent", "Kraken REST API")
else:
	print("Usage: %s method [parameters]" % sys.argv[0])
	print("Example: %s OHLC pair=xbtusd interval=1440" % sys.argv[0])
	sys.exit(1)

try:
	api_reply = urllib.request.urlopen(api_request).read()
except Exception as error:
	print("API call failed (%s)" % error)
	sys.exit(1)

try:
	api_reply = api_reply.decode()
except Exception as error:
	if api_method == 'RetrieveExport':
		sys.stdout.buffer.write(api_reply)
		sys.exit(0)
	print("API response invalid (%s)" % error)
	sys.exit(1)

if '"error":[]' in api_reply:
	print(api_reply if output_format == 0 else json.dumps(json.loads(api_reply), indent = 4))
	sys.exit(0)
else:
	print(api_reply if output_format == 0 else json.dumps(json.loads(api_reply), indent = 4))
	sys.exit(1)

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