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
相关产品推荐
相关产品推荐

