海妖 API 'EAPI:Invalid key' 与 Python3
Kraken API 'EAPI:Invalid key' with Python3
我尝试制作一个简单的函数,向 Kraken 交易所发出 HTTP 请求 API。该方法是私有的,我正在尝试获取我的帐户余额。
根据 Kraken 文档 (https://www.kraken.com/features/api#general-usage):
HTTP header:
API-Key = API key
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API
key
POST data:
nonce = always increasing unsigned 64 bit integer
otp = two-factor password (if two-factor enabled, otherwise not required)
我试图使我的签名生成类似于 "veox" Python 库(可在:https://github.com/veox/python3-krakenex/blob/master/krakenex/api.py)获得。
我在 Ubuntu 18.04 上使用 Python 3.6.7。
我在 Kraken 交易所的帐户已启用 2FA (otp),但我不确定是否需要包含在请求中。
我在堆栈溢出中搜索了解决方案,但我似乎无法从可用的帖子中获得任何信息。 (请记住,我是 Python 和 Stack Overflow 的新手)
我从服务器收到 200 个响应,所以我很确定问题出在生成签名上。
这是我的代码(xxx、yyy 和 zzz 变量是故意这样写的):
Kraken_secret_key = 'xxx'
Kraken_headers ={
'Kraken_API_key': 'yyy'
}
def Kraken_account_balance(Kraken_headers):
URI_path= '/0/private/Balance'
URL_path = 'https://api.kraken.com/0/private/Balance'
Kraken_nonce = str(int(time.time()*1000))
otp = 'zzz'
Kraken_POST_data = {
'nonce': Kraken_nonce,
'otp': str(otp)
}
encoded = (str(Kraken_nonce)+str(otp)).encode()
message = URI_path.encode() + hashlib.sha256(encoded).digest()
Kraken_signature = hmac.new(base64.b64decode(Kraken_secret_key), message, digestmod=hashlib.sha512)
Kraken_signature_digest = base64.b64encode(Kraken_signature.digest())
Kraken_headers['Kraken_API_Signature'] = Kraken_signature_digest.decode()
response = requests.post(URL_path,data= Kraken_POST_data, headers = Kraken_headers)
result = response.json()
print(result)
所以我弄清楚了为什么我的代码不起作用。
简答:
- POST Kraken API 调用中使用的数据必须进行 URL 编码。这意味着 "nonce" 和 "otp" 必须进行 URL 编码才能使 API 正常工作。我使用 "urllib" 模块中的 "urllib.parse.urlencode" 方法让 API 正常工作。
- Header 值必须明确称为与 Kraken API 手册中相同的名称。
长答案:
- 这可能是因为我是 API 编码的初学者,但是 Kraken API 手册没有明确说明 POST 数据必须 URL编码。在这种情况下,OTP(2 因素身份验证)不会影响我的代码,因此我在调用中删除了 POST 数据的那部分。
在我的例子中,我使用的唯一 POST 数据是 "nonce" 值。例如,如果在上面的代码中 nonce 等于
'nonce': 666999
与调用中使用的值相同,但使用 'urllib.parse.urlencode' 方法 URL 编码的 将等于
"nonce=666999"
- 同样,对于更有经验的开发人员来说,这可能不是问题,但对我来说,header 值必须显式地调用与 Kraken API 手册中相同的名称并不明显。
所以在上面的代码中
Kraken_headers ={
'Kraken_API_key': 'yyy'
}
和
Kraken_headers['Kraken_API_Signature'] = Kraken_signature_digest.decode()
应重命名为
Kraken_headers ={
'API-Key': 'yyy'
}
和
Kraken_headers['API-Sign'] = Kraken_signature_digest.decode()
这是完整的工作代码,只需用您的值替换私有和 public 键值:
import requests
import time
import hmac
import hashlib
import json
import base64
import urllib
Kraken_secret_key = 'xxx'
Kraken_headers ={
'API-Key': 'yyy'
}
def Kraken_account_balance(Kraken_headers):
URI_path= '/0/private/Balance'
URL_path = 'https://api.kraken.com/0/private/Balance'
Kraken_nonce = str(int(time.time()*1000))
Kraken_POST_data = {
'nonce': Kraken_nonce
}
url_encoded_post_data = urllib.parse.urlencode(Kraken_POST_data)
encoded = (str(Kraken_POST_data['nonce'])+url_encoded_post_data).encode()
message = URI_path.encode() + hashlib.sha256(encoded).digest()
Kraken_signature = hmac.new(base64.b64decode(Kraken_secret_key), message,
hashlib.sha512)
Kraken_signature_digest = base64.b64encode(Kraken_signature.digest())
Kraken_headers['API-Sign'] = Kraken_signature_digest.decode()
response = requests.post(URL_path,data= Kraken_POST_data, headers =
Kraken_headers)
result = response.json()
print(result)
Kraken_account_balance(Kraken_headers)
我尝试制作一个简单的函数,向 Kraken 交易所发出 HTTP 请求 API。该方法是私有的,我正在尝试获取我的帐户余额。
根据 Kraken 文档 (https://www.kraken.com/features/api#general-usage):
HTTP header:
API-Key = API key
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
POST data:
nonce = always increasing unsigned 64 bit integer
otp = two-factor password (if two-factor enabled, otherwise not required)
我试图使我的签名生成类似于 "veox" Python 库(可在:https://github.com/veox/python3-krakenex/blob/master/krakenex/api.py)获得。
我在 Ubuntu 18.04 上使用 Python 3.6.7。
我在 Kraken 交易所的帐户已启用 2FA (otp),但我不确定是否需要包含在请求中。
我在堆栈溢出中搜索了解决方案,但我似乎无法从可用的帖子中获得任何信息。 (请记住,我是 Python 和 Stack Overflow 的新手)
我从服务器收到 200 个响应,所以我很确定问题出在生成签名上。
这是我的代码(xxx、yyy 和 zzz 变量是故意这样写的):
Kraken_secret_key = 'xxx'
Kraken_headers ={
'Kraken_API_key': 'yyy'
}
def Kraken_account_balance(Kraken_headers):
URI_path= '/0/private/Balance'
URL_path = 'https://api.kraken.com/0/private/Balance'
Kraken_nonce = str(int(time.time()*1000))
otp = 'zzz'
Kraken_POST_data = {
'nonce': Kraken_nonce,
'otp': str(otp)
}
encoded = (str(Kraken_nonce)+str(otp)).encode()
message = URI_path.encode() + hashlib.sha256(encoded).digest()
Kraken_signature = hmac.new(base64.b64decode(Kraken_secret_key), message, digestmod=hashlib.sha512)
Kraken_signature_digest = base64.b64encode(Kraken_signature.digest())
Kraken_headers['Kraken_API_Signature'] = Kraken_signature_digest.decode()
response = requests.post(URL_path,data= Kraken_POST_data, headers = Kraken_headers)
result = response.json()
print(result)
所以我弄清楚了为什么我的代码不起作用。
简答:
- POST Kraken API 调用中使用的数据必须进行 URL 编码。这意味着 "nonce" 和 "otp" 必须进行 URL 编码才能使 API 正常工作。我使用 "urllib" 模块中的 "urllib.parse.urlencode" 方法让 API 正常工作。
- Header 值必须明确称为与 Kraken API 手册中相同的名称。
长答案:
- 这可能是因为我是 API 编码的初学者,但是 Kraken API 手册没有明确说明 POST 数据必须 URL编码。在这种情况下,OTP(2 因素身份验证)不会影响我的代码,因此我在调用中删除了 POST 数据的那部分。
在我的例子中,我使用的唯一 POST 数据是 "nonce" 值。例如,如果在上面的代码中 nonce 等于
'nonce': 666999
与调用中使用的值相同,但使用 'urllib.parse.urlencode' 方法 URL 编码的 将等于
"nonce=666999"
- 同样,对于更有经验的开发人员来说,这可能不是问题,但对我来说,header 值必须显式地调用与 Kraken API 手册中相同的名称并不明显。
所以在上面的代码中
Kraken_headers ={
'Kraken_API_key': 'yyy'
}
和
Kraken_headers['Kraken_API_Signature'] = Kraken_signature_digest.decode()
应重命名为
Kraken_headers ={
'API-Key': 'yyy'
}
和
Kraken_headers['API-Sign'] = Kraken_signature_digest.decode()
这是完整的工作代码,只需用您的值替换私有和 public 键值:
import requests
import time
import hmac
import hashlib
import json
import base64
import urllib
Kraken_secret_key = 'xxx'
Kraken_headers ={
'API-Key': 'yyy'
}
def Kraken_account_balance(Kraken_headers):
URI_path= '/0/private/Balance'
URL_path = 'https://api.kraken.com/0/private/Balance'
Kraken_nonce = str(int(time.time()*1000))
Kraken_POST_data = {
'nonce': Kraken_nonce
}
url_encoded_post_data = urllib.parse.urlencode(Kraken_POST_data)
encoded = (str(Kraken_POST_data['nonce'])+url_encoded_post_data).encode()
message = URI_path.encode() + hashlib.sha256(encoded).digest()
Kraken_signature = hmac.new(base64.b64decode(Kraken_secret_key), message,
hashlib.sha512)
Kraken_signature_digest = base64.b64encode(Kraken_signature.digest())
Kraken_headers['API-Sign'] = Kraken_signature_digest.decode()
response = requests.post(URL_path,data= Kraken_POST_data, headers =
Kraken_headers)
result = response.json()
print(result)
Kraken_account_balance(Kraken_headers)