Я пытаюсь написать хороший помощник для кракена.Я хочу, чтобы он был как можно более автоматическим, поэтому необходимо:
- добавить одноразовый номер (
time.time()*1000
) в тело POST - вычислить сигнатуру в теле POST
- поставить подпись в заголовках
Я написал очевидный код, основанный на этот ответ:
class KrakenAuth(AuthBase):
"""a requests-module-compatible auth module for kraken.com"""
def __init__(self, key, secret):
self.api_key = key
self.secret_key = secret
def __call__(self, request):
#print("Auth got a %r" % type(request))
nonce = int(1000*time.time())
request.data = getattr(request, 'data', {})
request.data['nonce'] = nonce
request.prepare()
message = request.path_url + hashlib.sha256(str(nonce) + request.body).digest()
hmac_key = base64.b64decode(self.secret_key)
signature = hmac.new(hmac_key, message, hashlib.sha512).digest()
signature = base64.b64encode(signature)
request.headers.update({
'API-Key': self.api_key,
'API-Sign': signature
})
return request
и их явызов его (из метода-обертки для другого объекта), например:
def _request(self, method, url, **kwargs):
if not self._auth:
self._auth = KrakenAuth(key, secret)
if 'auth' not in kwargs:
kwargs['auth'] = self._auth
return self._session.request(method, URL + url, **kwargs)
... но это не работает.Закомментированный оператор print()
показывает, что он получает объект PreparedRequest
, а не Request
, и, следовательно, вызов request.prepare()
является вызовом PreparedRequest.prepare
, не делает ничего полезного , потому что естьнет request.data
, потому что он уже был преобразован в атрибут body
.