Python 3.6调用Bittrex API遇INVALID_SIGNATURE错误求助
解决Bittrex API Python版本的INVALID_SIGNATURE问题
嘿,我一眼就看到你Python代码里的几个关键问题,正是这些导致了签名无效!咱们一步步来修正:
问题分析
你的PHP代码是正确的,但Python版本有两个核心错误:
错误的HMAC参数:你在
hmac.new()里直接写了b'apisecret'和b'url',这是把字符串字面量当成了密钥和待签名的URL,而不是你定义的apisecret和url变量!这肯定会生成错误的签名。Nonce格式不一致:PHP里的
time()返回的是整数时间戳(比如1700000000),但你Python里用'{:10.0f}'.format(time.time())会生成带宽度填充的字符串(如果时间戳是9位的话会有前置空格),这会导致nonce值和PHP版本不匹配,进而签名失效。
修正后的Python代码
import urllib.request import json import time import hashlib import hmac # 生成和PHP一致的整数时间戳字符串 nonce = str(int(time.time())) apikey = '...' # 替换成你的实际API密钥 apisecret = '...' # 替换成你的实际API密钥 BaseCurrency = 'BTC' # 构造请求URL url = f'https://bittrex.com/api/v1.1/account/getbalance?apikey={apikey}&nonce={nonce}¤cy={BaseCurrency}' # 正确生成HMAC签名:将密钥和URL转成UTF-8字节 sign = hmac.new(apisecret.encode('utf-8'), url.encode('utf-8'), hashlib.sha512).hexdigest() # 发送请求 request = urllib.request.Request(url, headers={"apisign": sign}) balance = json.load(urllib.request.urlopen(request)) print(balance)
关键修改说明
- Nonce生成:用
str(int(time.time()))直接将时间戳转成整数再转字符串,和PHP的time()输出完全一致,避免了多余的空格或格式差异。 - HMAC签名:使用
apisecret.encode('utf-8')和url.encode('utf-8')将变量转成字节类型,这是Python的hmac模块要求的,同时确保使用的是你实际的密钥和构造好的URL,而不是字面量字符串。 - 额外用了f-string来构造URL,比字符串拼接更清晰易读,不过这不是必须的,只是代码风格优化。
这样修改后,你的Python代码应该就能和PHP代码生成相同的签名,成功调用Bittrex API了!
内容的提问来源于stack exchange,提问作者Jimmy Hatchell
相关产品推荐
相关产品推荐

