【问题标题】:Kraken API 'EAPI:Invalid key' with Python3使用 Python3 的 Kraken API 'EAPI:Invalid key'
【发布时间】:2019-06-24 02:55:24
【问题描述】:

我尝试制作一个简单的函数,向 Kraken 交换 API 发出 HTTP 请求。该方法是私有的,我正在尝试获取我的帐户余额。

根据 Kraken 文档 (https://www.kraken.com/features/api#general-usage):

HTTP 标头:

API-Key = API 密钥

API-Sign = 使用 HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) 和 base64 解码秘密 API 的消息签名 键

POST 数据:

nonce = 总是递增的无符号 64 位整数

otp = 双因素密码(如果启用双因素,否则不需要)

我尝试使我的签名生成类似于“veox”Python 库(可在:https://github.com/veox/python3-krakenex/blob/master/krakenex/api.py 获得)。

我在 Ubuntu 18.04 上使用 Python 3.6.7。

2FA (otp) 已在 Kraken 交易所为我的帐户开启,但我不确定是否需要包含在请求中。

我在堆栈溢出中搜索了解决方案,但我似乎无法从可用的帖子中获得任何信息。 (请记住,我对 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)

【问题讨论】:

    标签: python-3.x kraken.com


    【解决方案1】:

    所以我弄清楚了为什么我的代码不起作用。

    简答:

    1. Kraken API 调用中使用的 POST 数据必须经过 URL 编码。这意味着“nonce”和“otp”必须进行 URL 编码,API 才能正常工作。我使用“urllib”模块中的“urllib.parse.urlencode”方法让 API 正常工作。
    2. 标头值必须明确命名为与 Kraken API 手册中相同的名称。

    长答案:

    1. 这可能是因为我是编码 API 的初学者,但 Kraken API 手册并没有明确说明 POST 数据必须经过 URL 编码。在这种情况下,OTP(2 因素身份验证)不会影响我的代码,所以我在调用中去掉了那部分 POST 数据。

    就我而言,我使用的唯一 POST 数据是“nonce”值。例如,如果在上面的代码中 nonce 等于

    'nonce': 666999
    

    调用中使用的值相同,但 URL 编码 使用 'urllib.parse.urlencode' 方法将等于

    "nonce=666999"
    
    1. 同样,对于更有经验的开发人员来说,这可能不是问题,但对我来说,头值必须明确称为与 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()
    

    这是完整的工作代码,只需将私钥和公钥值替换为您的值:

    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)
    

    【讨论】:

    • 谢谢,url 编码帮助我使用了 oflags 参数,逗号需要在签名前进行 url 编码。看到你的回答之前没想到。
    • 这对期货/衍生品平台有何作用?似乎是另一种编码方法。
    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 2017-12-29
    • 2023-03-12
    • 2018-07-22
    • 1970-01-01
    • 2023-03-11
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多