https://www.binance.com/restapipub.html
我一直在尝试编码一个交易机器人。我已经算出了程序的数据和决策部分。现在我需要对程序中的制造订单部分进行编码。
我查看了他们的网站,发现我需要提供
“客户秘密”
那就是
totalParams被定义为与请求体连接的查询字符串。
到目前为止,这就是我所拥有的:
import requests
headers = {
'X-MBX-APIKEY': MY_API_KEY,
}
data = [
('symbol', 'LTCBTC'),
('side', 'BUY'),
('type', 'LIMIT'),
('timeInForce', 'GTC'),
('quantity', '1'),
('price', '0.1'),
('recvWindow', '6000000'),
('timestamp', '1499827319559'),
('signature', NO_IDEA ),
]
requests.post('https://www.binance.com/api/v1/order', headers=headers, data=data)我需要弄清楚签名是什么,进而算出总数是多少。
发布于 2017-08-26 16:42:24
文档只希望您在一个字符串中使用请求体、url上的查询字符串和客户端秘密(查询字符串和请求正文连接在一起,然后客户端秘密加上一个|字符)。
您可以使用准备好的请求;这使您可以在发送之前访问查询字符串和请求体。
import requests
import hashlib
from urllib.parse import urlparse
def calculate_signature(secret, data=None, params=None):
# the actual URL doesn't matter as this request is never sent.
request = requests.Request('POST', 'http://example.com',
data=data, params=params)
prepped = request.prepare()
query_string = urlparse(prepped.url).query
# neither the URL nor the body are encoded to bytes yet
total_params = query_string + prepped.body
return hashlib.sha256('{}|{}'.format(secret, total_params).encode('ASCII')).hexdigest()
MY_API_KEY = 'XXX'
CLIENT_SECRET = 'XXX'
headers = {
'X-MBX-APIKEY': MY_API_KEY,
}
data = [
('symbol', 'LTCBTC'),
('side', 'BUY'),
('type', 'LIMIT'),
('timeInForce', 'GTC'),
('quantity', '1'),
('price', '0.1'),
('recvWindow', '6000000'),
('timestamp', '1499827319559'),
]
data.append(
('signature', calculate_signature(CLIENT_SECRET, data=data)))
response = requests.post('https://www.binance.com/api/v1/order', data=data, headers=headers)准备好的请求对象仅用于授予您要签名的请求主体。它们的API有点复杂,因为它们期望您将签名附加到请求主体本身,而不是在头(这是大多数REST所做的)。
calculate_signature()函数产生与文档相同的结果:
>>> from urllib.parse import parse_qsl
>>> documentation_secret = 'NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j'
>>> requestBody = parse_qsl('symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=6000000×tamp=1499827319559')
>>> calculate_signature(documentation_secret, requestBody)
'24b39c6588d0f2378a2b641e68c00e87bc81d997146ca3c5482337857a045041'
>>> queryString = parse_qsl('symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC')
>>> requestBody = parse_qsl('quantity=1&price=0.1&recvWindow=6000000×tamp=1499827319559')
>>> calculate_signature(documentation_secret, requestBody, queryString)
'77eb3b3727bc8c523646e2a35f52a8eb4cc4418b24c113f3ea0b3b59248579d4'发布于 2017-08-26 16:42:06
hashlib提供了包括sha256在内的各种哈希函数,例如:
import hashlib
hashlib.sha256('|'.join([clientsecret, totalparams]).encode('utf-8')).hexdigest()发布于 2017-08-26 16:54:03
在您链接的页面中,有如何计算它的示例:
echo -n "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j|symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=6000000×tamp=1499827319559" | sha256sum
24b39c6588d0f2378a2b641e68c00e87bc81d997146ca3c5482337857a045041 -在不需要太多请求操作的情况下计算sig的简单函数(因为我们知道数据是元组列表--它将被正确地排序和传递,如果不正确,它可能无法保持顺序)
import hashlib
from urllib.parse import urlencode
data = [...] # your params
def calc_sig(data, your_secret_key):
sig_content = '%s|%s' % (your_secret_key, urlencode(data))
return hashlib.sha256(sig_content).hexdigest()https://stackoverflow.com/questions/45897556
复制相似问题