Klien baris perintah REST API (Python)

Terakhir dikemas kini: 1 April 2025

Klien baris perintah REST API dalam Python membenarkan akses penuh kepada Kraken REST API melalui baris perintah (seperti Terminal pada macOS), oleh itu tiada pengetahuan pengaturcaraan atau pengalaman API diperlukan.

Semua ciri REST API boleh diakses termasuk:

  • titik akhir data pasaran awam

  • titik akhir data akaun peribadi

  • titik akhir dagangan peribadi

  • titik akhir pendanaan peribadi

  • titik akhir perolehan peribadi

Klien baris perintah boleh digunakan sebagai klien API kendiri, atau boleh dipanggil daripada program lain (seperti bahasa ditafsir lain seperti skrip Bash, atau bahasa dikompilasi seperti C/C++).

Pemasangan

1. Pasang Python 3 (jika perlu).

  • macOS dan Linux mungkin sudah mempunyai Python 3 terpasang.

  • Windows mungkin tidak mempunyai Python 3 terpasang, tetapi ia boleh dipasang dari https://www.python.org/.

2. Muat turun dan simpan fail krakenapi.py ke komputer anda dalam folder (direktori) pilihan anda.

Contoh: Macintosh HD > Users > Satoshi > KrakenAPI


3. Buka gesaan perintah (seperti Terminal macOS), dan navigasi ke folder (direktori) yang dipilih dalam langkah sebelumnya. Anda boleh menggunakan perintah UNIX/Linux "cd" (tukar direktori) untuk navigasi.

Contoh:cd /Users/Satoshi/KrakenAPI


4. Jadikan fail krakenapi.py boleh laksana.

Anda boleh menggunakan perintah UNIX/Linux "chmod 755" (tukar mod).

Contoh: chmod 755 krakenapi.py


5. Tambah kunci API anda ke folder yang sama di mana anda menyimpan fail krakenapi.py.

  • Salin/tampal kunci awam API anda dari pengurusan akaun ke dalam fail teks biasa yang dipanggil "API_Public_Key".

  • Salin/tampal kunci peribadi (rahsia) API anda ke dalam fail teks biasa yang dipanggil "API_Private_Key".

Arahan untuk mencipta/mengkonfigurasi kunci API tersedia.

Kunci API hanya diperlukan jika anda bercadang untuk menggunakan titik akhir API peribadi untuk mengakses akaun Kraken anda (seperti pertanyaan baki, meletakkan/membatalkan pesanan, eksport sejarah akaun, dsb.).

Contoh Perintah

Penggunaan klien baris perintah REST API adalah seperti berikut:

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

Klien baris perintah menyokong semua titik akhir REST API, jadi berikut adalah beberapa contoh perintah:

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

Secara lalai, klien baris perintah akan mengeluarkan respons API asal (JSON sesuai untuk ditafsirkan melalui kod), tetapi jika argumen baris perintah tambahan -pretty digunakan:

./krakenapi.py TradeBalance asset=shib -pretty

klien kemudian akan mengeluarkan respons API yang sama sebagai JSON mesra manusia (dengan pemisah baris/inden).

Kod 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)

Perlu bantuan lebih lanjut?