如何获知Telegram内嵌按钮打开的Web App已关闭并通知Bot刷新?
解决Telegram Web App关闭后机器人刷新私聊消息的问题
方法1:正确使用answerWebAppQuery接口(解决404问题)
你遇到404的核心原因大概率是请求URL格式错误,正确的URL必须包含bot前缀,格式为:https://api.telegram.org/bot<你的机器人令牌>/answerWebAppQuery
操作步骤:
- 获取
query_id:从Telegram Web App的初始化数据中解析:const initDataParams = new URLSearchParams(Telegram.WebApp.initData); const queryId = initDataParams.get('query_id'); - 发起合法POST请求:必须用POST方法,且请求头设置
Content-Type: application/json,参数需包含query_id和合法的result(Telegram要求必须返回一个InlineQueryResult对象,哪怕只是占位内容):if (queryId) { fetch(`https://api.telegram.org/bot${你的BotToken}/answerWebAppQuery`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query_id: queryId, result: { type: 'article', id: 'temp-id', title: '操作完成', input_message_content: { message_text: '数据已同步' } } }) }) .then(res => { if (res.ok) Telegram.WebApp.close(); }) .catch(err => console.error('请求失败:', err)); } - 机器人端触发刷新:调用接口成功后,你的机器人会收到
chosen_inline_result类型的更新,在机器人代码中监听该更新,然后调用editMessageText或其他接口刷新用户的私聊消息。
方法2:Web App通过后端中转直接更新消息(更安全)
直接在Web App前端调用Bot API会暴露令牌,存在安全风险,推荐通过自有后端中转:
- Web App完成操作后,向你的后端API发送请求,携带用户
chat_id、需要更新的message_id以及新消息内容。 - 后端收到请求后,调用Telegram Bot API的
editMessageText接口更新私聊消息:# 示例:Python后端代码 import requests def update_telegram_message(bot_token, chat_id, message_id, new_text): url = f"https://api.telegram.org/bot{bot_token}/editMessageText" payload = { "chat_id": chat_id, "message_id": message_id, "text": new_text } requests.post(url, json=payload) - 更新完成后,Web App调用
Telegram.WebApp.close()关闭自身。
方法3:利用Web App关闭事件(备选,可靠性较低)
可以监听Web App的beforeunload事件,但关闭时浏览器可能中断网络请求,仅作为备选方案:
window.addEventListener('beforeunload', () => { // 向后端发送通知,触发机器人刷新消息 fetch('你的后端通知接口', { method: 'POST', body: JSON.stringify({ chat_id: Telegram.WebApp.initDataUnsafe.user.id }) }); });
注意:
beforeunload事件中的请求无法保证100%发送成功,优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Gerhardvr
相关产品推荐
相关产品推荐

