Render部署Telegram Bot失败,报409冲突错误求助
问题现象
在Render平台部署Telegram Bot,构建成功后初期运行正常,但数分钟后部署失败,持续抛出以下错误:
telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 409. Description: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
用户编写的核心代码如下(省略非关键部分):
import pandas as pd from datetime import datetime, date import src.visualization.visualize as vz import src.auxiliary.auxiliary as aux import src.data.wrangling as w import src.data.database as db import os import telebot API = os.getenv("API_KEY") bot = telebot.TeleBot(API) @bot.message_handler(commands=["IBOVESPA", "SP500", "NASDAQ"]) def responder(mensagem): # 省略通用计算代码 if condition: bot.send_photo( mensagem.chat.id, photo = photo ) else: # 省略通用代码 bot.send_message( mensagem.chat.id, aux.create_answer(assets) ) bot.send_photo( mensagem.chat.id, photo = photo ) def verificar(mensagem): return True def calculating_msg(mensagem, date): bot.send_message( mensagem.chat.id, "通用回复内容" ) @bot.message_handler(func=verificar) def responder(mensagem): text= ( "对任意消息的标准回复" ) bot.reply_to(mensagem, text) bot.polling()
补充信息
- 已尝试撤销旧API密钥并使用新生成的密钥,问题未解决
- 本地运行仅收到Matplotlib线程警告,功能正常:
\src\visualization\visualize.py:34: UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail.
fig = plt.figure(figsize=(15, 8))
WARNING: QApplication was not created in the main() thread.
核心原因
错误409的本质是同一个Bot的API密钥被多个实例同时调用getUpdates接口,Render平台可能存在以下触发场景:
- Render的部署/重启机制启动了多个进程
- 默认的
bot.polling()参数设置导致重复连接请求
解决步骤
1. 调整bot.polling()参数,避免冲突
修改代码末尾的bot.polling(),添加参数确保单实例独占连接:
bot.polling(none_stop=True, timeout=60, long_polling_timeout=60, allowed_updates=None)
none_stop=True:网络中断后自动重试,避免进程意外退出- 合理设置超时参数,减少频繁请求触发Telegram的冲突检测
allowed_updates=None:只监听Bot需要的更新类型,降低请求频率
2. 配置Render平台,确保仅运行单实例
- 在Render服务的启动命令中,明确只启动一个Bot进程:
python bot.py
- 禁用Render默认的HTTP健康检查(Telegram Bot是长连接服务,HTTP检查不适用),避免因检查失败重复启动进程
- 若必须保留健康检查,可添加简单的HTTP端点,但需确保不干扰Bot主进程的运行
3. 修复Matplotlib线程警告(可选,避免潜在崩溃)
虽然警告不影响当前功能,但长期运行可能导致进程异常,建议修改可视化代码:
在src/visualization/visualize.py的开头添加非交互式后端设置:
import matplotlib matplotlib.use('Agg') # 必须在导入plt前设置 import matplotlib.pyplot as plt
确保所有图形生成操作在主线程完成,或使用线程锁控制图形创建流程
内容的提问来源于stack exchange,提问作者Rafael

