Ứng dụng khách dòng lệnh REST API (Python)

Cập nhật lần cuối: 1 thg 4, 2025

Ứng dụng dòng lệnh REST API trong Python cho phép truy cập đầy đủ vào Kraken REST API thông qua dòng lệnh (chẳng hạn như Terminal trên macOS), do đó không yêu cầu kiến thức lập trình hoặc kinh nghiệm về API.

Tất cả các tính năng của REST API đều có thể truy cập, bao gồm:

  • điểm cuối dữ liệu thị trường công khai

  • điểm cuối dữ liệu tài khoản riêng tư

  • điểm cuối giao dịch riêng tư

  • điểm cuối nạp/rút riêng tư

  • điểm cuối kiếm tiền riêng tư

Ứng dụng dòng lệnh có thể được sử dụng như một ứng dụng API độc lập, hoặc có thể được gọi từ các chương trình khác (chẳng hạn như các ngôn ngữ thông dịch khác như Bash scripts, hoặc các ngôn ngữ biên dịch như C/C++).

Cài đặt

1. Cài đặt Python 3 (nếu cần).

  • macOS và Linux có thể đã cài đặt Python 3.

  • Windows có thể chưa cài đặt Python 3, nhưng có thể cài đặt từ https://www.python.org/.

2. Tải xuống và lưu tệp krakenapi.py vào máy tính của bạn trong thư mục bạn chọn.

Ví dụ: Macintosh HD > Users > Satoshi > KrakenAPI


3. Mở dấu nhắc lệnh (chẳng hạn như Terminal của macOS), và điều hướng đến thư mục đã chọn ở bước trước. Bạn có thể sử dụng lệnh "cd" của UNIX/Linux (thay đổi thư mục) để điều hướng.

Ví dụ:cd /Users/Satoshi/KrakenAPI


4. Đặt tệp krakenapi.py có thể thực thi.

Bạn có thể sử dụng lệnh "chmod 755" của UNIX/Linux (thay đổi chế độ).

Ví dụ: chmod 755 krakenapi.py


5. Thêm khóa API của bạn vào cùng thư mục nơi bạn đang lưu giữ tệp krakenapi.py.

  • Sao chép/dán khóa công khai API của bạn từ quản lý tài khoản vào một tệp văn bản thuần túy có tên "API_Public_Key".

  • Sao chép/dán khóa riêng tư (bí mật) API của bạn vào một tệp văn bản thuần túy có tên "API_Private_Key".

Hướng dẫn tạo/cấu hình cặp khóa API có sẵn.

Khóa API chỉ cần thiết nếu bạn có kế hoạch sử dụng các điểm cuối API riêng tư để truy cập tài khoản Kraken của mình (chẳng hạn như truy vấn số dư, đặt/hủy lệnh, xuất lịch sử tài khoản, v.v.).

Lệnh Ví dụ

Cách sử dụng ứng dụng dòng lệnh REST API như sau:

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

Ứng dụng dòng lệnh hỗ trợ tất cả các điểm cuối REST API, vì vậy sau đây chỉ là một vài lệnh ví dụ:

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

Theo mặc định, ứng dụng khách dòng lệnh sẽ xuất ra phản hồi API gốc (JSON phù hợp để diễn giải qua mã), nhưng nếu một đối số dòng lệnh bổ sung -pretty được sử dụng:

./krakenapi.py TradeBalance asset=shib -pretty

ứng dụng khách sau đó sẽ xuất ra cùng một phản hồi API dưới dạng JSON thân thiện với người dùng (với ngắt dòng/thụt lề).

Mã 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)

Bạn cần thêm trợ giúp?