Python Telegram Bot设置webhook无法触发AWS API Gateway故障咨询
部署场景说明
我刚使用 python-telegram-bot 包开发了一款基于 Python 的 Telegram Bot,计划将其与 AWS API Gateway 集成,实现用户每次发送消息时触发并运行 Lambda 函数的效果。
我已参照公开的配置指引完成了 API Gateway 相关配置,但目前向 Bot 发送消息时,Lambda 函数未被触发,也收不到任何回复;不过手动访问 API Gateway 的“Invoke URL”时,确实可以正常触发 Lambda 函数,也就是说即使我已经设置了 webhook,Telegram Bot 依然不会触发该 API。
我使用的 webhook 设置命令为:curl --data "url=<INVOKE_URL>" "https://api.telegram.org/bot<ACCESS_TOKEN>/setWebhook"
我希望找到正确的集成方法,让 Telegram 的消息能正常触发对应 Lambda 里的 Bot 逻辑。这是我的第一个 Python 项目,在 AWS 部署环节遇到了很大阻碍。
现有 Bot 代码
import requests import re import os def start(update, context): chat_id = update.message.chat_id context.bot.send_message(chat_id=chat_id, text="Beep boop dog! Type /bop to receive dog pics.") def get_url(): contents = requests.get('https://random.dog/woof.json').json() url = contents['url'] return url def get_image_url(): allowed_extension = ['jpg','jpeg','png'] file_extension = '' while file_extension not in allowed_extension: url = get_url() file_extension = re.search("([^.]*)$",url).group(1).lower() return url def bop(update, context): url = get_image_url() chat_id = update.message.chat_id context.bot.send_photo(chat_id=chat_id, photo=url) def main(event, context): TOKEN = os.environ['TOKEN'] updater = Updater(token=TOKEN, use_context=True) dp = updater.dispatcher dp.add_handler(CommandHandler('start',start)) dp.add_handler(CommandHandler('bop',bop)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
可落地的排查与修复步骤
- 先直接校验webhook配置状态
调用Telegram的getWebhookInfo接口查看配置结果,命令为:curl "https://api.telegram.org/bot<ACCESS_TOKEN>/getWebhookInfo"
重点核对返回内容:- url字段是否为正确的HTTPS地址,有没有路径错误、http协议写错的情况(Telegram仅支持受信任CA证书的HTTPS端点,不支持自签名证书、纯HTTP地址)
- 是否存在last_error_message字段,常见错误包括证书无效、连接超时、目标地址返回非200状态码,这些问题都会导致Telegram停止向目标地址发请求
- 修正Lambda的运行逻辑
当前代码里的updater.start_polling()和updater.idle()是常驻进程长轮询模式的写法,Lambda是短生命周期的无状态函数,每次执行完成后就会回收资源,根本无法运行长连接轮询逻辑,就算Telegram的请求能传到Lambda,这段逻辑也无法正常处理消息。
适配webhook模式的Lambda逻辑需要做三处调整:- 补充缺失的导入语句:
from telegram.ext import Updater, CommandHandler - 从API Gateway传入的
event参数中解析出Telegram发送的update JSON对象,不要启动轮询进程 - 把解析好的update对象直接传给dispatcher完成消息处理
- 补充缺失的导入语句:
- 核对API Gateway的路由配置
- 确认API Gateway配置了POST方法的路由,Telegram的webhook请求都是通过POST方法发送的,如果仅配置了GET方法的路由,Telegram的请求会直接被405状态码拦截,根本无法到达Lambda
- 确认路由没有额外开启API Key校验、请求参数强校验,否则Telegram发送的无鉴权请求会被直接拦截
- 确认webhook地址没有附带多余的query参数,避免Telegram无法正确识别目标端点
- 规范Lambda的响应格式
Telegram检测到webhook端点返回非200状态码时,会在重试一段时间后判定端点不可用,停止发送后续请求。Lambda处理完消息后,需要返回符合API Gateway规范的200状态码响应,否则Telegram会判定webhook失效。
内容的提问来源于stack exchange,提问作者chu-js
相关产品推荐
相关产品推荐

