如何检测Telegram机器人Web应用被用户关闭?
检测Telegram Web应用被自带关闭按钮关闭的可行方案
目前Telegram官方并未提供直接监听自带关闭按钮触发事件的原生接口,但可以通过以下两种稳定方案实现你的需求:
1. 后端心跳超时检测
- 前端实现:Web应用启动后,每隔5-10秒通过异步请求(比如
fetch或navigator.sendBeacon)向机器人后端发送心跳,请求携带从Telegram WebApp的initData中提取的唯一用户标识(如user.id)。 - 后端处理:后端维护一个存储用户最后活跃时间的缓存或数据库表,同时启动定时任务(比如每分钟执行一次),扫描所有用户的最后活跃时间。若某用户的最后活跃时间超过设定阈值(建议设为20-30秒,大于心跳间隔),则判定Web应用已被关闭,执行对应的数据库操作。
- 优势:不受前端环境限制,即使前端因网络波动无法发送关闭信号,后端也能通过超时判断用户状态,可靠性最高。
2. 前端视口变化事件间接判断
- 前端实现:监听Telegram WebApp提供的
viewportChanged事件,该事件会在Web应用的视口尺寸变化时触发。当检测到视口高度或宽度骤降至接近0(比如小于10px)时,立即调用navigator.sendBeacon()向后端发送关闭通知(携带用户标识)。 - 注意事项:需排除正常的视口调整场景(比如移动端横屏切换),可以通过判断尺寸变化的幅度和速度来过滤误触发;使用
navigator.sendBeacon()而非普通AJAX,因为它能在页面卸载阶段异步发送请求,避免因页面关闭导致请求中断。
关键说明
- 前端的
unload、beforeunload、pagehide等事件在Telegram的WebView环境中会被限制,无法可靠触发; web_app_close事件仅在你主动调用Telegram.WebApp.close()时触发,无法捕获Telegram自带关闭按钮的操作;- 心跳超时方案是生产环境中最推荐的方式,视口变化方案可作为补充,但需做好误触发的过滤。
内容的提问来源于stack exchange,提问作者kmf
相关产品推荐
相关产品推荐

