(Python)Bittrex API v3不断返回无效的内容哈希
为个人项目编写bot时,Bittrex api拒绝验证我的内容哈希。我已经尝试了我能想到的一切,也尝试了类似问题的所有建议,但到目前为止没有任何效果。尝试散列'None',尝试空白字符串,尝试货币符号,尝试整个uri,尝试命令&balance,尝试其他一些也不起作用的东西。将请求重新格式化了几次(bytes/string/dict),仍然没有任何内容 文档说散列请求体(在关于通过api进行事务的类似问题中,它似乎与有效负载同义),但它是一个没有有效负载的简单get/chcek平衡请求 问题是,当我运行它时,我得到一个“BITTREX错误:无效内容哈希”响应 任何帮助都将不胜感激,这感觉像是一个简单的问题,但它让我非常沮丧。我对python非常陌生,但bot的其余部分运行得非常好,这使得我无法将其连接到我的帐户上,这让我感到非常沮丧:/(Python)Bittrex API v3不断返回无效的内容哈希,python,api,Python,Api,为个人项目编写bot时,Bittrex api拒绝验证我的内容哈希。我已经尝试了我能想到的一切,也尝试了类似问题的所有建议,但到目前为止没有任何效果。尝试散列'None',尝试空白字符串,尝试货币符号,尝试整个uri,尝试命令&balance,尝试其他一些也不起作用的东西。将请求重新格式化了几次(bytes/string/dict),仍然没有任何内容 文档说散列请求体(在关于通过api进行事务的类似问题中,它似乎与有效负载同义),但它是一个没有有效负载的简单get/chcek平衡请求 问题是,当
import hashlib
import hmac
import json
import os
import time
import requests
import sys
# Base Variables
Base_Url = 'https://api.bittrex.com/v3'
APIkey = os.environ.get('B_Key')
secret = os.environ.get('S_B_Key')
timestamp = str(int(time.time() * 1000))
command = 'balances'
method = 'GET'
currency = 'USD'
uri = Base_Url + '/' + command + '/' + currency
payload = ''
print(payload) # Payload Check
# Hashes Payload
content = json.dumps(payload, separators=(',', ':'))
content_hash = hashlib.sha512(bytes(json.dumps(content), "utf-8")).hexdigest()
print(content_hash)
# Presign
presign = (timestamp + uri + method + str(content_hash) + '')
print(presign)
# Create Signature
message = f'{timestamp}{uri}{method}{content_hash}'
sign = hmac.new(secret.encode('utf-8'), message.encode('utf-8'),
hashlib.sha512).hexdigest()
print(sign)
headers = {
'Api-Key': APIkey,
'Api-Timestamp': timestamp,
'Api-Signature': sign,
'Api-Content-Hash': content_hash
}
print(headers)
req = requests.get(uri, json=payload, headers=headers)
tracker_1 = "Tracker 1: Response =" + str(req)
print(tracker_1)
res = req.json()
if req.ok is False:
print('bullshit error #1')
print("Bittex response: %s" % res['code'], file=sys.stderr)
我可以看到两个主要问题:
json.dumps
和bytes
)和请求(使用json=payload
参数到request.get
)序列化/编码有效负载。您无法知道请求库将如何格式化您的数据,即使一个字节不同,您也会得到不同的哈希值。最好先将数据转换为字节,然后将相同的字节用于散列和请求正文
仔细检查文档,它说“如果没有有效负载,请输入一个空白字符串”。在尝试“无”后,我将切换回该代码。我在没有json=payload参数的情况下尝试过它,但似乎没有什么不同。如果我正确地理解了这一点,我应该将空白字符串(或有效载荷,当它有一个)转换为字节,然后散列字节,忽略GET请求中的JSON=有效载荷参数,对吗?是的,这是我的理解。此外,如果停止使用
json
参数,则需要添加内容类型:application/json
头。这是Bittrex所必需的,如果您使用json
参数,则请求库会添加它,但如果您不使用json
参数,则需要手动添加它。感谢您的回复,但似乎有些地方仍然不正确。格式很讨厌这些评论,所以请容忍我。我从我的请求头中删除了JSON=有效载荷,如:“Req=请求”。GET(URI,Health=头文件)'',并且尝试做空白字符串->字节->哈希序列,但是HasLI.B.Sh512不会接受除此之外的任何形式的输入:'HasLIb.Sh512(字节(STR(内容),UTF-8))。坦白地说,我不知道我做错了什么(实际上是在9周前开始使用python),我非常感谢一些示例代码片段json.dumps(“”
为您提供字符串“”
,但API需要实际的空字符串。也许这两者之间的差异是造成你问题的原因?