我正在为https://poloniex.com/support/api/
编写机器人公共方法一切正常,但Trading API方法需要一些额外的技巧:
所有对交易API的调用都通过HTTP POST发送到https://poloniex.com/tradingApi,并且必须包含以下标题:
密钥 - 您的API密钥。
签名 - 根据HMAC-SHA512方法,由您的密钥“秘密”签名的查询的POST数据 此外,所有查询都必须包含“nonce”POST参数。 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()
trading.py:
APIkey = 'AAA-BBB-CCC'
secret = b'123abc'
polo = Poloniex(APIkey, secret)
print(polo.returnBalances())
我收到以下错误:
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
我也试过实现以下内容,但它没有帮助: https://stackoverflow.com/a/25111089/7317891
非常感谢任何帮助!
答案 0 :(得分:4)
传递给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)
<强>输出强>
b'command=returnBalances&nonce=1492868800766'
3cd1630522382abc13f24b78138f30983c9b35614ece329a5abf4b8955429afe7d121ffee14b3c8c042fdaa7a0870102f9fb0b753ab793c084b1ad6a3553ea71
然后你可以做类似
的事情headers = {
'Key': APIKey,
'Sign': sign,
}
r = requests.post(url, headers=headers, data=paybytes)