使用PyTelegramBotAPI+Flask配置Webhook时遇Error 429请求过多问题
解决PyTelegramBotAPI配置Webhook时的Error 429问题
核心问题分析
你的代码存在几个直接触发请求超限的点:
- Flask Debug模式的重复执行:开启
debug=True时,Flask会启动主进程+重载进程两个实例,全局作用域的bot.set_webhook()会被执行两次,短时间内向Telegram API发送重复的Webhook设置请求,触发429限流规则。 - Webhook设置时机错误:
bot.set_webhook()放在全局代码块中,每次Flask启动(包括自动重载)都会执行,进一步增加不必要的API请求频次。
具体修复方案
1. 调整Webhook设置时机,仅在主进程执行
将bot.set_webhook()移到if __name__=="__main__":代码块内,确保只执行一次:
app = Flask(__name__) API_KEY="*api key*" bot = telebot.TeleBot(API_KEY, parse_mode=None) SECRET = "1234" @app.route(f"/{SECRET}", methods=['POST']) def handle_webhook(): update = telebot.types.Update.de_json( request.stream.read().decode("utf-8")) main(update) return "ok" def main(update): bot.process_new_updates([update]) # 你的机器人逻辑代码 if __name__=="__main__": # 仅在主进程初始化时设置Webhook bot.set_webhook(f"*ngrok URL*/{SECRET}") app.run(debug=True)
2. 禁用Flask Debug模式(测试阶段可选)
如果不需要自动重载功能,直接关闭debug模式,避免多进程重复执行:
if __name__=="__main__": bot.set_webhook(f"*ngrok URL*/{SECRET}") app.run(debug=False)
3. 优化Webhook设置逻辑(可选)
先检查当前Webhook地址是否与目标一致,仅在不一致时调用设置接口,减少无效API请求:
if __name__=="__main__": current_webhook = bot.get_webhook_info().url target_webhook = f"*ngrok URL*/{SECRET}" if current_webhook != target_webhook: bot.set_webhook(target_webhook) app.run(debug=True)
额外排查点
- 每次重启ngrok后,务必同步更新代码中的ngrok URL,避免Telegram向无效地址发送请求后反复重试,间接导致你的请求量被放大。
- 可以临时注释
main函数内的机器人逻辑代码,仅保留bot.process_new_updates调用,测试是否还会触发429报错,排除逻辑代码隐性循环的可能性。
内容的提问来源于stack exchange,提问作者tanihu1
相关产品推荐
相关产品推荐

