Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Python)Bittrex API v3不断返回无效的内容哈希_Python_Api - Fatal编程技术网

(Python)Bittrex API v3不断返回无效的内容哈希

(Python)Bittrex API v3不断返回无效的内容哈希,python,api,Python,Api,为个人项目编写bot时,Bittrex api拒绝验证我的内容哈希。我已经尝试了我能想到的一切,也尝试了类似问题的所有建议,但到目前为止没有任何效果。尝试散列'None',尝试空白字符串,尝试货币符号,尝试整个uri,尝试命令&balance,尝试其他一些也不起作用的东西。将请求重新格式化了几次(bytes/string/dict),仍然没有任何内容 文档说散列请求体(在关于通过api进行事务的类似问题中,它似乎与有效负载同义),但它是一个没有有效负载的简单get/chcek平衡请求 问题是,当

为个人项目编写bot时,Bittrex api拒绝验证我的内容哈希。我已经尝试了我能想到的一切,也尝试了类似问题的所有建议,但到目前为止没有任何效果。尝试散列'None',尝试空白字符串,尝试货币符号,尝试整个uri,尝试命令&balance,尝试其他一些也不起作用的东西。将请求重新格式化了几次(bytes/string/dict),仍然没有任何内容

文档说散列请求体(在关于通过api进行事务的类似问题中,它似乎与有效负载同义),但它是一个没有有效负载的简单get/chcek平衡请求

问题是,当我运行它时,我得到一个“BITTREX错误:无效内容哈希”响应

任何帮助都将不胜感激,这感觉像是一个简单的问题,但它让我非常沮丧。我对python非常陌生,但bot的其余部分运行得非常好,这使得我无法将其连接到我的帐户上,这让我感到非常沮丧:/

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
    )序列化/编码有效负载。您无法知道请求库将如何格式化您的数据,即使一个字节不同,您也会得到不同的哈希值。最好先将数据转换为字节,然后将相同的字节用于散列和请求正文

  • GET请求通常没有正文(有关更多详细信息,请参阅),因此可能是API忽略了您发送的负载。您应该检查API文档,看看是否真的需要发送带有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需要实际的空字符串。也许这两者之间的差异是造成你问题的原因?