You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.6调用Bittrex API遇INVALID_SIGNATURE错误求助

解决Bittrex API Python版本的INVALID_SIGNATURE问题

嘿,我一眼就看到你Python代码里的几个关键问题,正是这些导致了签名无效!咱们一步步来修正:

问题分析

你的PHP代码是正确的,但Python版本有两个核心错误:

  1. 错误的HMAC参数:你在hmac.new()里直接写了b'apisecret'和b'url',这是把字符串字面量当成了密钥和待签名的URL,而不是你定义的apisecret和url变量!这肯定会生成错误的签名。

  2. 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}&currency={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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:49:38