You need to enable JavaScript to run this app. Python Telegram Bot设置webhook无法触发AWS API Gateway故障咨询
优惠活动
大模型
产品
解决方案
定价
更多

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逻辑需要做三处调整:
    1. 补充缺失的导入语句:from telegram.ext import Updater, CommandHandler
    2. 从API Gateway传入的event参数中解析出Telegram发送的update JSON对象,不要启动轮询进程
    3. 把解析好的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 13:06:04