部署在Heroku的Telegram Bot被匿名GET请求ping无法休眠如何解决
Heroku部署Telegram Bot被匿名GET请求阻止休眠的解决方案
排查源头定时请求
首先优先排查是否配置了第三方存活检测服务:
- 大部分每30分钟一次的固定GET请求都来自自动存活检测工具,如果你之前为了避免Bot休眠配置过这类服务,直接关闭即可解决问题
- 检查代码仓库的CI/CD配置、Heroku应用的附加组件,确认没有配置自动ping的定时任务
应用层快速拦截无效请求
如果是未知来源的扫描请求,可以直接在应用入口拦截所有非Telegram Webhook所需的请求,尽可能降低资源占用:
方案1:全局拦截GET请求
如果你用Flask、Django这类Web框架提供Webhook服务,直接在顶层路由匹配所有GET路径,返回无内容的204响应,避免后续多余逻辑执行:
# Flask示例代码 from flask import Flask, Response app = Flask(__name__) # 匹配所有路径的GET请求,直接返回204 @app.route('/', methods=['GET'], defaults={'path': ''}) @app.route('/<path:path>', methods=['GET']) def block_all_get(path): return Response(status=204) # 保留原有Telegram Webhook的POST路由 @app.route('/你的webhook路径', methods=['POST']) def webhook_handler(): # 原有业务逻辑 pass
方案2:新增Telegram IP白名单校验
Telegram官方公开了所有Webhook请求的来源IP段,你可以在应用入口新增IP校验逻辑,仅放行来自官方IP段的POST请求,其他所有来源的请求直接返回204,从根源拦截无效扫描请求。
调整进程类型彻底规避HTTP请求
如果你使用轮询模式(而非Webhook模式)运行Telegram Bot,直接修改Heroku的Procfile文件,把进程类型从web改为worker:
worker: python 你的启动文件.py
worker进程不会开放公共HTTP端口,不会收到任何外部HTTP请求,完全避免被无效GET请求唤醒,符合免费层30分钟无任务自动休眠的规则。修改完成后需要到Heroku应用的资源面板,关闭原有的web进程,启用新的worker进程才会生效。
内容的提问来源于stack exchange,提问作者casiso
相关产品推荐
相关产品推荐

