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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:12