Python 3.6 Bittrex API INVALID_SIGNATURE - PullRequest
0 голосов
/ 10 мая 2018

По профессии я не разработчик, поэтому, пожалуйста, будьте осторожны со мной.

Я работал над API-интерфейсом Bittrex, чтобы научить себя Python и API. Мне удалось заставить его работать в PHP с большим количеством поисков переполнения стека, прежде чем перейти на Python 3.6. Теперь я снова застрял на части, которая требует хеширования и подписей.

Мой функциональный код PHP:

<?php

$apikey='...';
$apisecret='...';
$nonce=time();
$uri='https://bittrex.com/api/v1.1/account/getbalance? 
$apikey='.$apikey.'&nonce='.$nonce.'&currency=BTC';
$sign=hash_hmac('sha512',$uri,$apisecret);
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('apisign:'.$sign));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$execResult = curl_exec($ch);
$data=curl_exec($ch);

echo $data      

?>

Python эквивалент:

import urllib.request
import json
import collections
import time
import hashlib
import hmac
nonce = str('{:10.0f}'.format(time.time()))
apikey = '...'
apisecret = '...'
BaseCurrency = 'BTC'
url = 'https://bittrex.com/api/v1.1/account/getbalance? 
apikey='+apikey+'&nonce='+nonce+'&currency='+BaseCurrency
sign = hmac.new(b'apisecret', b'url', hashlib.sha512).hexdigest()
request = urllib.request.Request(url, headers={"apisign" : sign})
balance = json.load(urllib.request.urlopen(request))

print(balance)

Возвращает {'success': False, 'message': 'INVALID_SIGNATURE', 'result': None}.

Я потратил пару дней на это и не смог пройти мимо. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Я знаю, что это довольно старо, но я немного боролся перед обработкой соединения, вот мой код:

api_secret='...'
api_key='...'
url='https://bittrex.com/api/v1.1/account/getbalances?apikey='+api_key+'&nonce='+str(time.time())
sign=hmac.new(bytes(api_secret,encoding='utf-8'),bytes(url,encoding='utf-8'),hashlib.sha512).hexdigest()


req = urllib.request.Request(url, headers={"apisign" : sign})
account=urllib.request.urlopen(req).read()
account_j=json.loads(account)

print(account_j)

Мне пришлось прочитать () один раз открытый запрос, чтобы правильно обрабатывать json.

0 голосов
/ 06 декабря 2018

Вы должны использовать

apikey = b'...'
apisecret = b'...'

вместо

apikey = '...'
apisecret = '...'

и

sign = hmac.new(apisecret, url, hashlib.sha512).hexdigest()

вместо

sign = hmac.new(b'apisecret', b'url', hashlib.sha512).hexdigest()
...