2016-06-11 6 views
3

類似の問題を扱う質問:SO 1,SO 2SO 3ハッシュエラーの前にUnicodeオブジェクトをエンコードする必要があります。

ほとんどの文字列をutf-8にエンコードして回答してみましたが、hmacはまだユニコード文字をエンコードするように指示しています。最大の問題は、問題の変数を特定することさえできないことです。印刷出力は、stringsまたはbytesのいずれかであることを示します。前者の場合は.encode()を添付しますが、それは助けにはなりません。

私はGDAX APIをクエリしようとしており、またusing the code as given on their API pageです。 Python2.7のために書かれているので、私はエンコーディングに問題があると思っていましたが、これは私には分かりません。

マイコード:

class CoinbaseExchangeAuth(AuthBase): 
    def __init__(self, api_key, secret_key, passphrase): 
     self.api_key = api_key.encode() 
     self.secret_key = secret_key.encode() 
     self.passphrase = passphrase.encode() 

    def __call__(self, request): 
     timestamp = str(time.time()) 
     message = timestamp + request.method + request.path_url + (request.body or '') 
     hmac_key = base64.b64decode(self.secret_key) 
    #print(hmac_key, type(hmac_key)) 
    #print(message, type(message)) 
    signature = hmac.new(hmac_key, message, hashlib.sha256) 

    signature_b64 = signature.digest().encode('base64').rstrip('\n') 


    request.headers.update({ 
     'CB-ACCESS-SIGN': signature_b64, 
     'CB-ACCESS-TIMESTAMP': timestamp, 
     'CB-ACCESS-KEY': self.api_key, 
     'CB-ACCESS-PASSPHRASE': self.passphrase, 
     'Content-Type': 'application/json' 
    }) 
    return request 

エラー:私は私は私のhmac.new()コールにフィードオブジェクトをチェック入力すると

File "F:\git\knowhere\Private\bitex-crawler\gdax_client\gdaxex\api.py", line 47, in __call__ 
signature = hmac.new(hmac_key, message, hashlib.sha256) 
File "C:\Users\nls\Anaconda3\lib\hmac.py", line 144, in new 
return HMAC(key, msg, digestmod) 
File "C:\Users\nls\Anaconda3\lib\hmac.py", line 84, in __init__ 
self.update(msg) 
File "C:\Users\nls\Anaconda3\lib\hmac.py", line 93, in update 
self.inner.update(msg) 
TypeError: Unicode-objects must be encoded before hashing 

、それは私がstrオブジェクトとbytesオブジェクトを持っていると言われます。

signature = hmac.new(hmac_key, message.encode(), hashlib.sha256) 

この行にエラーが発生しました:すなわち

signature_b64 = signature.digest().encode('base64').rstrip('\n') 

File "F:/git/knowhere/Private/bitex-crawler/gdax_client/client.py", 
[..] 
File "F:\git\knowhere\Private\bitex-crawler\gdax_client\gdaxex\api.py", line 123, in _query 
r = api_query(url, json=req, auth=auth) 
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\api.py", line 67, in get 
return request('get', url, params=params, **kwargs) 
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\api.py", line 53, in request 
return session.request(method=method, url=url, **kwargs) 
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\sessions.py", line 454, in request 
prep = self.prepare_request(req) 
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\sessions.py", line 388, in prepare_request 
hooks=merge_hooks(request.hooks, self.hooks), 
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\models.py", line 297, in prepare 
self.prepare_auth(auth, url) 
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\models.py", line 490, in prepare_auth 
r = auth(self) 
File "F:\git\knowhere\Private\bitex-crawler\gdax_client\gdaxex\api.py", line 49, in __call__ 
signature_b64 = signature.digest().encode('base64').rstrip('\n') 
AttributeError: 'bytes' object has no attribute 'encode' 

print(type(hmac_key)) # <bytes> 
print(type(message)) # <str> 

当然のことながら、私はあまりにもその吸盤をエンコードする必要があると思いました

..私はunencodedユニコードobを持つことはできませんjectsしかし、私はいずれかの後でバイトを持っていない?どのように私はこれを修正するのですか?私は深く混乱しているので、これに関する助けを感謝します。

+1

は何のpython 3バージョンがありません場合は、あなたがポートにサードパーティのコードを自分で持っている(またはのpython 2.7に切り替えて)見えるこのガイドでは、なぜあなたを説明しなければなりませんこれらのエラーとその解決方法を入手してください。 https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data –

+0

乾杯!私はそれを考えなかった! – nlsdfnbch

答えて

3

"Parameter msg can be of any type supported by hashlib."

したがって、メッセージはbytesである必要があります。あなたにバイトオブジェクトを与えるメッセージに.encode()を使用してください。

注:これは、Python 3にのみ必要です!

ダイジェストをbase64にエンコードするには、base64 libraryを使用します。あなたのpython 3でのpython-2専用ライブラリを使用しているよう

import base64 
signature_b64 = base64.b64encode(signature.digest()) 
+0

あなたはすでにそれを試してみませんでした。編集中.... –

+0

すべていいよ!私はコードブラインドで、 'base64'でエンコーディングしてもうまくいきます。私は過去2日間で6回のコンバージョンを書いてきましたが、時にはそれはすべてインポートブラーのビットです。 – nlsdfnbch

関連する問題