为什么我用 Python 3 从 Poloniex API 得到 'invalid command'?

Why am I getting 'invalid command' from Poloniex API with Python 3?

我正在尝试使用我的 Poloniex API 密钥和密钥来检查我的帐户余额。但是,我不断收到“invalid command”作为响应返回。

下面是我在 Python3 中的代码:

        command = 'returnBalances'
        req['command'] = command
        req['nonce'] = int(time.time()*1000)
        post_data = urllib.parse.urlencode(req).encode()

        sign = hmac.new(str.encode(self.Secret), post_data, hashlib.sha512).hexdigest()
        headers = {
            'Sign': sign,
            'Key': self.APIKey
        }

        print(post_data)
        req = urllib.request.Request(url='https://poloniex.com/tradingApi', headers=headers)
        res = urllib.request.urlopen(req, timeout=20)

        jsonRet = json.loads(res.read().decode('utf-8'))
        return self.post_process(jsonRet)

print(post_data) returns 我希望看到的内容:

b'nonce=1491334646563&command=returnBalances'

我想您必须将 post_data 与请求一起发送。我喜欢直接使用 requests 库而不是 urllib,但它应该是这样的 urllib:

req = urllib.request.Request('https://poloniex.com/tradingApi', post_data, headers)

发送Content-Typeheader

这个 excellent article 为我指明了正确的方向。出现python3的请求库跳过发送Content-Typeheader,导致Polo拒绝请求

'Content-Type': 'application/x-www-form-urlencoded'

headers:

headers = {
    'Sign': hmac.new(SECRET.encode(), post_data, hashlib.sha512).hexdigest(),
    'Key': API_KEY,
    'Content-Type': 'application/x-www-form-urlencoded'
}