クラーケン用の素敵な認証ヘルパーを書こうとしています。できるだけ自動にしたいので、次のことが必要です。
- ノンス (
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