Google Cloud Functions部署Telegram机器人报NoneType无chat属性错误
问题根因
报错由两个共同原因触发:
- 你的Cloud Functions部署配置未锁定python-telegram-bot依赖版本,冷启动构建时会自动拉取最新发布的库版本。2022年之后发布的python-telegram-bot v20为全异步重构版本,和你使用的v13同步API存在大量不兼容逻辑,Update对象的反序列化行为也有调整,无修改自动升级后直接出现解析异常。
- 原有代码未做边界校验:Telegram Webhook会向接口推送所有类型的更新事件,包括频道帖子、消息编辑事件、入群通知、按钮回调、多媒体消息等,这类事件的
update.message字段本身就为None,旧版本库可能存在隐式兼容,新版本未做自动过滤,直接取属性就会触发AttributeError。
修复步骤
- 锁定依赖版本,避免后续无感知升级。在函数部署根目录创建
requirements.txt文件,指定兼容旧代码的稳定版本,内容如下:
python-telegram-bot==13.15 functions-framework==3.* flask==2.0.3
该版本组合和你运行了一年的旧逻辑完全兼容,不会出现接口调用不匹配的问题。
- 给业务代码增加空值校验,过滤非预期的更新事件,避免非用户普通文本消息触发报错。修正后的代码如下:
# main.py import telegram import re def ItapoxBot(request): bot = telegram.Bot(token="9999999999:ABCDEFGHIJKLMNOPQRSTUVWXYZ") if request.method == "POST": update = telegram.Update.de_json(request.get_json(force=True), bot) # 跳过无有效普通消息的更新 if update is None or update.message is None or update.message.chat is None: return "ok" chat_id = update.message.chat.id # 跳过无文本内容的多媒体/系统类消息 if update.message.text is None: return "ok" resposta = criar_resposta(update.message.text) if resposta is not None: bot.sendMessage(chat_id=chat_id, text=resposta, parse_mode='HTML') return "ok"
- 重新部署Cloud Functions,部署时确认构建流程读取本地的
requirements.txt安装依赖,不要使用平台默认的最新版依赖拉取规则。
注意事项
- 不要在未做代码适配的情况下升级到python-telegram-bot v20及以上版本,该版本全量改为异步调用逻辑,原有同步写法完全无法运行。
- 如果后续需要减少无效请求,可以调用Telegram Bot API的
setWebhook接口,指定只接收普通消息类型的更新,从源头减少无效推送。
内容的提问来源于stack exchange,提问作者Itapox
相关产品推荐
相关产品推荐

