You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.6使用HMAC时出现TypeError:无法拼接字符串与字节

解决Disqus SSO HMAC签名的TypeError问题

这个错误的核心原因是Python3中严格区分bytes和str类型,你在拼接message(bytes类型,来自base64编码)、空格字符串(' ')和timestamp(int转str后还是字符串)时,试图把bytes和str直接拼接,导致类型不兼容报错。

错误代码分析

问题出在这一行:

sig = hmac.HMAC(str(DISQUS_SECRET_KEY).encode('utf-8'), message + ' ' + timestamp, hashlib.sha1).hexdigest()
  • message是base64.b64encode()返回的bytes对象
  • ' '是str类型的空格
  • timestamp是int,即便转成str后依然是str类型
    Python3不允许bytes和str直接拼接,所以抛出TypeError: can't concat str to bytes。

修复方案

要确保所有参与拼接的内容都是bytes类型,步骤如下:

  1. 将int类型的timestamp转为字符串后,再编码成bytes
  2. 使用bytes类型的空格(b' ')进行拼接
  3. 保持HMAC计算的参数都是bytes类型

修复后的完整代码:

import simplejson
import base64
import time
import hmac
import hashlib

# 假设user和DISQUS_SECRET_KEY已定义
data = simplejson.dumps({
    'id': user['id'],
    'username': user['username'],
    'email': user['email'],
})
# encode the data to base64
message = base64.b64encode(data.encode('utf-8'))
# generate a timestamp for signing the message
timestamp = int(time.time())
# 把timestamp转为bytes类型
timestamp_bytes = str(timestamp).encode('utf-8')
# generate our hmac signature
sig = hmac.new(
    str(DISQUS_SECRET_KEY).encode('utf-8'),
    message + b' ' + timestamp_bytes,
    hashlib.sha1
).hexdigest()

关键说明

  • 原Python2示例可以直接拼接是因为Python2中str和bytes是同一类型,Python3做了严格区分,必须统一为bytes才能进行HMAC计算
  • message保持Base64编码后的bytes类型,符合Disqus要求
  • timestamp仅转为bytes参与拼接,没有进行Base64编码,满足官方文档要求

内容的提问来源于stack exchange,提问作者Hamed Minaee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:02:36