類似の問題を扱う質問:SO 1,SO 2、SO 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しかし、私はいずれかの後でバイトを持っていない?どのように私はこれを修正するのですか?私は深く混乱しているので、これに関する助けを感謝します。
は何のpython 3バージョンがありません場合は、あなたがポートにサードパーティのコードを自分で持っている(またはのpython 2.7に切り替えて)見えるこのガイドでは、なぜあなたを説明しなければなりませんこれらのエラーとその解決方法を入手してください。 https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data –
乾杯!私はそれを考えなかった! – nlsdfnbch