https://www.binance.com/restapipub.html
我一直在尝试编码交易机器人。我已经找到了该计划的数据和决策部分。现在我需要编写程序的制作顺序部分。
我检查了他们的网站,发现我需要提供
的sha256clientsecret | totalparams
那个
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)
我需要弄清楚签名和扩展名是什么。
答案 0 :(得分:2)
文档只是希望您在一个字符串中使用请求正文,url上的查询字符串和客户端密码(查询字符串和请求正文连接在一起,然后客户端密钥前面加上{ {1}}字符)。
您可以使用prepared request;这使您可以在发送之前访问查询字符串并请求正文:
|
准备好的请求对象仅用于为您提供签名请求正文。他们的API有点令人费解,因为他们希望您将签名附加到请求正文本身而不是标题中(这是大多数REST API所做的)。
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)
函数产生与文档相同的结果:
calculate_signature()
答案 1 :(得分:0)
hashlib
提供各种哈希函数,包括sha256
,例如:
import hashlib
hashlib.sha256('|'.join([clientsecret, totalparams]).encode('utf-8')).hexdigest()
答案 2 :(得分:0)
从您链接的页面中有一个如何计算它的示例:
echo -n "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j|symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=6000000×tamp=1499827319559" | sha256sum
24b39c6588d0f2378a2b641e68c00e87bc81d997146ca3c5482337857a045041 -
在没有太多请求操作的情况下计算sig的简单函数(因为我们知道数据是元组列表,它将被正确排序和传递,如果它是dict它可能不会保留顺序)
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()