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

Heroku部署Telegram Bot上传文件与数据库后无响应排查

Heroku部署Telegram Bot无响应修复方案

你的代码存在多个会直接导致部署后启动失败、功能异常的问题,逐个修复即可:

核心错误点

1. 缺失必需的函数定义

代码中注册了两个未实现的处理函数,程序启动时会直接抛出NameError崩溃:

  • 文本消息处理绑定了echo函数,但全代码无对应实现
  • 错误日志处理绑定了error函数,全代码无对应实现
    本地可运行是因为你本地运行的代码版本包含这两个函数,上传到Heroku的版本遗漏了这部分逻辑。

2. 数据库连接逻辑缺陷

  • 数据库连接在全局作用域初始化,Heroku提供的ClearDB服务会主动断开闲置超过60秒的连接,全局长连接在首次闲置后就会失效,后续所有数据库请求都会抛连接错误
  • 数据库凭证、Bot Token硬编码在代码中,不仅存在泄露风险,一旦凭证变更需要重新部署代码

3. 部署配置缺失

如果项目根目录没有Heroku识别的启动配置文件,平台根本无法启动你的程序:

  • 缺少Procfile声明启动命令
  • 缺少requirements.txt声明依赖包,且未指定python-telegram-bot的兼容版本,默认安装最新v20版本和你写的v13接口完全不兼容
  • 编写了/sql命令的处理逻辑,但未将该Handler注册到调度器中,即使Bot启动成功该命令也无法响应

修复后代码

import logging
import os
import mysql.connector
from telegram import Update
from telegram.ext import (
    Updater,
    CommandHandler,
    MessageHandler,
    Filters,
    CallbackContext,
)

PORT = int(os.environ.get('PORT', 5000))
# 所有敏感配置从环境变量读取,禁止硬编码
TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN')
DB_CONFIG = {
    "host": os.environ.get('DB_HOST'),
    "user": os.environ.get('DB_USER'),
    "passwd": os.environ.get('DB_PASS'),
    "database": os.environ.get('DB_NAME'),
    "autocommit": True
}

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)

# 补全缺失的处理函数
def echo(update: Update, context: CallbackContext):
    update.message.reply_text(update.message.text)

def error(update: Update, context: CallbackContext):
    logger.warning('Request failed: Update "%s" trigger error "%s"', update, context.error)

def start(update: Update, context: CallbackContext):
    update.message.reply_text('Hi! This is start')

def help(update: Update, context: CallbackContext):
    update.message.reply_text('Help!')

def sql(update: Update, context: CallbackContext):
    # 每次请求临时建立数据库连接,避免长连接失效
    mydb = mysql.connector.connect(**DB_CONFIG)
    query = mydb.cursor()
    query.execute("SELECT nama_item, jumlah_dalam_kg FROM data_penjualan_harian WHERE nama_item = 'Lemon'")
    sql_result = query.fetchall()
    # 用完及时释放连接
    query.close()
    mydb.close()

    pesan_balasan = ''
    for item_name, weight in sql_result:
        pesan_balasan += f"{item_name} {weight}kg\n"

    update.message.reply_text(pesan_balasan)

def main():
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher

    # 注册所有命令处理器
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help))
    dp.add_handler(CommandHandler("sql", sql))
    dp.add_handler(MessageHandler(Filters.text, echo))
    dp.add_error_handler(error)

    updater.start_webhook(
        listen="0.0.0.0",
        port=PORT,
        url_path=TOKEN,
        webhook_url=f'https://{os.environ.get("HEROKU_APP_DOMAIN")}/{TOKEN}'
    )
    updater.idle()

if __name__ == '__main__':
    main()

部署前必需配置

  • 在项目根目录新建Procfile,写入以下内容(将your_bot_file.py替换为你实际的代码文件名):
    web: python your_bot_file.py
    
  • 在项目根目录新建requirements.txt,写入依赖声明,固定兼容版本避免接口不兼容:
    python-telegram-bot==13.15
    mysql-connector-python==8.0.33
    
  • 在Heroku应用后台的Config Vars页面添加所有需要的环境变量:TELEGRAM_BOT_TOKEN、DB_HOST、DB_USER、DB_PASS、DB_NAME、HEROKU_APP_DOMAIN,对应填入你的Bot Token、ClearDB数据库信息、Heroku应用的默认访问域名
  • 部署后如果仍有异常,直接查看Heroku运行日志定位具体错误,日志会明确打印缺依赖、配置缺失、语法错误等所有启动阶段的问题。

内容的提问来源于stack exchange,提问作者user17982950

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:21:34