首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么沙256?

什么沙256?
EN

Stack Overflow用户
提问于 2017-08-26 16:36:22
回答 3查看 1.8K关注 0票数 0

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

我一直在尝试编码一个交易机器人。我已经算出了程序的数据和决策部分。现在我需要对程序中的制造订单部分进行编码。

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

“客户秘密”

那就是

totalParams被定义为与请求体连接的查询字符串。

到目前为止,这就是我所拥有的:

代码语言:javascript
复制
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)

我需要弄清楚签名是什么,进而算出总数是多少。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-26 16:42:24

文档只希望您在一个字符串中使用请求体、url上的查询字符串和客户端秘密(查询字符串和请求正文连接在一起,然后客户端秘密加上一个|字符)。

您可以使用准备好的请求;这使您可以在发送之前访问查询字符串和请求体。

代码语言:javascript
复制
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()函数产生与文档相同的结果:

代码语言:javascript
复制
>>> 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&timestamp=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&timestamp=1499827319559')
>>> calculate_signature(documentation_secret, requestBody, queryString)
'77eb3b3727bc8c523646e2a35f52a8eb4cc4418b24c113f3ea0b3b59248579d4'
票数 2
EN

Stack Overflow用户

发布于 2017-08-26 16:42:06

hashlib提供了包括sha256在内的各种哈希函数,例如:

代码语言:javascript
复制
 import hashlib
 hashlib.sha256('|'.join([clientsecret, totalparams]).encode('utf-8')).hexdigest()
票数 0
EN

Stack Overflow用户

发布于 2017-08-26 16:54:03

在您链接的页面中,有如何计算它的示例:

代码语言:javascript
复制
echo -n "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j|symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=6000000&timestamp=1499827319559" | sha256sum
24b39c6588d0f2378a2b641e68c00e87bc81d997146ca3c5482337857a045041  -

在不需要太多请求操作的情况下计算sig的简单函数(因为我们知道数据是元组列表--它将被正确地排序和传递,如果不正确,它可能无法保持顺序)

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45897556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档