Python Telegram回声机器人Heroku部署:Webhook无法正常工作问题排查
解决Heroku上Telegram机器人Webhook失效的问题
嘿,我之前在Heroku上部署python-telegram-bot的Webhook机器人时,也踩过几乎一样的坑!让我给你捋捋问题根源和解决办法:
问题根源拆解
你猜的没错,核心问题和Heroku的端口限制、Telegram Webhook的推送机制都有关系:
- Heroku不允许绑定1024以下的端口,而且它会给每个dyno分配动态端口(通过环境变量
PORT获取),不能硬编码端口号; - Telegram Webhook是主动推送更新到你的HTTPS端点,不是你去轮询,而Heroku的dyno是通过反向代理对外提供服务的,直接监听端口的方式不适用;
- python-telegram-bot的长轮询和Webhook启动逻辑完全不同,不能混用。
具体解决步骤
1. 调整机器人代码适配Heroku
把你的代码改成Webhook模式,重点是获取动态端口、设置正确的Webhook URL,并且用run_webhook()替代长轮询的start_polling():
import os from telegram import Update from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes # 回声功能实现 async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text(update.message.text) # 启动命令 async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text("我是回声机器人,发消息给我试试!") def main(): # 从环境变量读取敏感信息,绝对不要硬编码! BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") HEROKU_APP_NAME = os.getenv("HEROKU_APP_NAME") # 获取Heroku分配的动态端口,默认值8443是Telegram Webhook的常用端口 PORT = int(os.getenv("PORT", 8443)) # 初始化应用 application = ApplicationBuilder().token(BOT_TOKEN).build() # 添加处理器 application.add_handler(CommandHandler("start", start)) application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo)) # 配置Webhook:用Heroku的默认域名+"/webhook"路径作为推送端点 WEBHOOK_URL = f"https://{HEROKU_APP_NAME}.herokuapp.com/webhook" application.run_webhook( listen="0.0.0.0", # 必须监听0.0.0.0才能被Heroku反向代理访问 port=PORT, webhook_url=WEBHOOK_URL ) if __name__ == "__main__": main()
2. 配置Heroku环境变量
在Heroku的应用设置页面,添加两个环境变量:
TELEGRAM_BOT_TOKEN:你的机器人token(从@BotFather处获取)HEROKU_APP_NAME:你的Heroku应用名称(比如你的app域名是my-echo-bot.herokuapp.com,那名称就是my-echo-bot)
3. 设置Procfile
在项目根目录创建一个无后缀名的Procfile,告诉Heroku怎么启动你的应用:
web: python your_bot_filename.py
把your_bot_filename.py替换成你的机器人代码文件名(比如echo_bot.py)。
避坑提醒
- 绝对不要同时启用长轮询和Webhook,这会导致冲突,一定要完全移除
start_polling()相关代码; - Heroku的免费版dyno会在30分钟无请求后休眠,第一次Webhook推送可能失败,但Telegram会自动重试,你也可以手动访问你的Heroku域名唤醒dyno;
- 如果还是有问题,用Heroku命令行查看实时日志排查错误:
heroku logs --tail; - 不用自己配置SSL证书,Heroku的默认域名已经自带HTTPS,完全符合Telegram Webhook的要求。
内容的提问来源于stack exchange,提问作者amchugh89
相关产品推荐
相关产品推荐

