1

クラーケン用の素敵な認証ヘルパーを書こうとしています。できるだけ自動にしたいので、次のことが必要です。

  1. ノンス ( time.time()*1000) を POST 本文に追加します
  2. POST 本文の署名を計算する
  3. ヘッダーに署名を入れる

この答えに基づいて明らかなコードを書きました:

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.databody

4

1 に答える 1