SHA 256是什么?

时间:2017-08-26 16:36:22

标签: python request sha256

https://www.binance.com/restapipub.html

我一直在尝试编码交易机器人。我已经找到了该计划的数据和决策部分。现在我需要编写程序的制作顺序部分。

我检查了他们的网站,发现我需要提供

的sha256
  

clientsecret | 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)

我需要弄清楚签名和扩展名是什么。

3 个答案:

答案 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&timestamp=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()