为什么请求在运行函数时返回错误?

时间:2017-12-06 17:03:24

标签: python python-3.x python-requests

Bittrex Api上有一个名为 getbalance 的端点,它以货币作为字符串并返回该货币的当前余额。在函数中执行请求时,

balance = get_balance('BTC')    

请求返回:

  

{'message':'INVALID_SIGNATURE',
  '结果':没有,
  '成功':错误}

功能:

def get_balance(currency):
    endpoint = '/account/getbalance'
    params = {
        'currency' : currency
    }
    return call_endpoint(endpoint, False, params)

call_endpoint:

def call_endpoint(endpoint, isPublic, params = None):
    base_url = 'https://bittrex.com/api/v1.1'
    url = (base_url + endpoint + 
       '?apikey=' + API_KEY + 
       '&nonce=' + str(time.time())).encode('utf-8')
    signature = hmac.new(SECRET_KEY, url, hashlib.sha512).hexdigest()
    headers = {'apisign' : signature}
    r = requests.get(url, headers = headers, params=params)
    return r

但是,如果我要在函数之外请求它:

url = ('https://bittrex.com/api/v1.1/account/getbalance' + 
    '?apikey=' + API_KEY +
    '&nonce=' + str(time.time()) +
    '&currency=BTC').encode('utf-8')
signature = hmac.new(SECRET_KEY, url, hashlib.sha512).hexdigest()
headers = {'apisign' : signature}
r = requests.get(url, headers = headers)

它有效。

  

{'message':'',
  '结果':{'可用':
  ...,
  '成功':真实}

这两种方法具有相同的代码,因此是否存在导致此错误的python函数或请求库?

1 个答案:

答案 0 :(得分:1)

这两种做法不会做同样的事情。

您的call_endpoint函数会在没有currency参数的网址输入上计算标题的签名,然后在requests参数中添加currency

您的其他代码段会计算包含currency参数的网址上的签名。