Python:散列前必须对Unicode对象进行编码

时间:2018-08-09 02:18:48

标签: python


我正在与加密货币进行交换,这需要对API秘密密钥进行编码才能访问私有API调用。我已经复制并粘贴了他们的Python代码以开始执行调用,但是每次发出请求时都会收到此错误。

TypeError: Unicode-objects must be encoded before hashing

我知道这意味着什么;我是电脑程序编制员。我没有从交易所收到的代码中找到问题的根源,因为我没有使用hmac,hashlib或base64。在下面的代码中,我用“ exchange”一词替换了交换名称的所有实例。没有显示API密钥。

exchangeconfig = Exchange('key', 'secret')

base = 'https://exchange.com/'
def post_request(key, secret, path, data):
    hmac_obj = hmac.new(secret, path + chr(0) + data, hashlib.sha512)
    hmac_sign = base64.b64encode(hmac_obj.digest())
    header = {
        'Content-Type': 'application/json',
        'User-Agent': 'exchangev2 based client',
        'Rest-Key': key,
        'Rest-Sign': hmac_sign,
    }
    proxy = ProxyHandler({'http': '127.0.0.1:8888'})
    opener = build_opener(proxy)
    install_opener(opener)
    request = Request(base + path, data, header)
    response = urlopen(request, data)
    return json.load(response)
def gen_tonce():
    return str(int(time.time() * 1e6))
class Exchange:
    def __init__(self, key, secret):
        self.key = key
        self.secret = base64.b64decode(secret)
    def request(self, path, params={}):
        params = dict(params)
        params['tonce'] = gen_tonce()
        # data = urllib.urlencode(params)
        data = json.dumps(params)
        result = post_request(self.key, self.secret, path, data)
        if result['result'] == 'success':
            return result['data']
        else:
            raise Exception(result['result'])

exchangeconfig.request("api/3/account")

请帮助我解决这个问题。 顺便说一句:特别是这行似乎有问题:

hmac_obj = hmac.new(secret, path + chr(0) + data, hashlib.sha512)

谢谢。

更新:修复了该错误。现在到这个:

TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.

1 个答案:

答案 0 :(得分:0)

这些哈希库处理字节对象,因此您应该首先将字符串编码为字节(假设解码端使用UTF-8):

hmac_obj = hmac.new(secret, path.encode('utf-8') + b'\0' + data.encode('utf-8'), hashlib.sha512)