Python 3 哈希 HMAC-SHA512

Bal*_*yar 8 python hash hmac sha512 python-3.x

我正在为https://poloniex.com/support/api/编写一个机器人

公共方法都可以正常工作,但交易 API 方法需要一些额外的技巧:

对交易 API 的所有调用都通过 HTTP POST 发送到https://poloniex.com/tradingApi,并且必须包含以下标头:
密钥 - 您的 API 密钥。
签名 - 查询的 POST 数据根据 HMAC-SHA512 方法由您的密钥的“秘密”签名。
此外,所有查询都必须包含“nonce”POST 参数。nonce 参数是一个整数,它必须始终大于之前使用的 nonce。
来自交易 API 的所有响应都是 JSON 格式。

我的 returnBalances 代码如下所示:

import hashlib
import hmac
from time import time

import requests


class Poloniex:
    def __init__(self, APIKey, Secret):
        self.APIKey = APIKey
        self.Secret = Secret

    def returnBalances(self):
        url = 'https://poloniex.com/tradingApi'
        payload = {
            'command': 'returnBalances',
            'nonce': int(time() * 1000),
        }

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

        r = requests.post(url, headers=headers, data=payload)
        return r.json()
Run Code Online (Sandbox Code Playgroud)

交易.py:

APIkey = 'AAA-BBB-CCC'
secret = b'123abc'

polo = Poloniex(APIkey, secret)
print(polo.returnBalances())
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Traceback (most recent call last):
  File "C:/Python/Poloniex/trading.py", line 5, in <module>
    print(polo.returnBalances())
  File "C:\Python\Poloniex\poloniex.py", line 22, in returnBalances
    'Sign': hmac.new(self.Secret, payload, hashlib.sha512).hexdigest(),
  File "C:\Users\Balazs91\AppData\Local\Programs\Python\Python35-32\lib\hmac.py", line 144, in new
    return HMAC(key, msg, digestmod)
  File "C:\Users\Balazs91\AppData\Local\Programs\Python\Python35-32\lib\hmac.py", line 84, in __init__
    self.update(msg)
  File "C:\Users\Balazs91\AppData\Local\Programs\Python\Python35-32\lib\hmac.py", line 93, in update
    self.inner.update(msg)
TypeError: object supporting the buffer API required

Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)

我也尝试实现以下内容,但没有帮助:https : //stackoverflow.com/a/25111089/7317891

任何帮助表示高度赞赏!

PM *_*ing 8

您传递给的有效负载requests.post必须是有效的查询字符串或与该查询字符串对应的字典。通常,只传递一个 dict 并获取请求来为您构建查询字符串会更方便,但在这种情况下,我们需要从查询字符串构建一个 HMAC 签名,因此我们使用标准的 urlib.parse 模块来构建查询细绳。

令人讨厌的是,该urlib.parse.urlencode函数返回一个文本字符串,因此我们需要将其编码为一个字节字符串,以使 hashlib 可以接受它。要使用的明显编码是 UTF-8:将仅包含纯 ASCII 的文本字符串编码为 UTF-8 将创建一个与等效的 Python 2 字符串相同的字节序列(当然urlencode只会返回纯 ASCII),所以这代码的行为与您链接的 Poloniex API 页面上的旧 Python 2 代码相同。

from time import time
import urllib.parse
import hashlib
import hmac

APIkey = b'AAA-BBB-CCC'
secret = b'123abc'

payload = {
    'command': 'returnBalances',
    'nonce': int(time() * 1000),
}

paybytes = urllib.parse.urlencode(payload).encode('utf8')
print(paybytes)

sign = hmac.new(secret, paybytes, hashlib.sha512).hexdigest()
print(sign)
Run Code Online (Sandbox Code Playgroud)

输出

b'command=returnBalances&nonce=1492868800766'
3cd1630522382abc13f24b78138f30983c9b35614ece329a5abf4b8955429afe7d121ffee14b3c8c042fdaa7a0870102f9fb0b753ab793c084b1ad6a3553ea71
Run Code Online (Sandbox Code Playgroud)

然后你可以做类似的事情

headers = {
    'Key': APIKey,
    'Sign': sign,
}

r = requests.post(url, headers=headers, data=paybytes)
Run Code Online (Sandbox Code Playgroud)