Google Apps Script Telegram机器人内联键盘回调监听失效排查
解决Telegram机器人内联按钮回调失效问题
问题分析
你当前的doPost函数仅处理Telegram的普通消息更新(比如/start命令),完全未处理内联按钮触发的回调查询(callback_query),这就是按钮点击后无响应的核心原因。
完整解决方案
1. 升级doPost函数,兼容两种更新类型
修改后的doPost需要先判断Telegram推送的更新类型,分别处理普通消息和回调请求:
function doPost(e) { var contents = JSON.parse(e.postData.contents); // 处理普通消息(比如/start命令) if (contents.message) { var chat_id = contents.message.from.id; var fname = contents.message.from.first_name; var text = `${fname}, 此机器人仅用于通知,请通过我们网站上的表单提交申请。`; sendMessage(chat_id, text); } // 处理内联按钮回调查询 else if (contents.callback_query) { var callbackData = contents.callback_query.data; var chatId = contents.callback_query.message.chat.id; var messageId = contents.callback_query.message.message_id; // 匹配delete_message回调指令 if (callbackData === "delete_message") { // 删除原通知消息 deleteMessage(chatId, messageId); // 发送交易完成提示 sendMessage(chatId, "交易已完成"); // 回调查询,避免按钮一直转圈 answerCallbackQuery(contents.callback_query.id); } } // 返回空响应,符合Telegram Webhook要求 return ContentService.createTextOutput(JSON.stringify({"status":"ok"})).setMimeType(ContentService.MimeType.JSON); }
2. 添加辅助函数
新增两个函数处理Telegram API的删除消息和回调响应请求:
删除消息函数
function deleteMessage(chatId, messageId) { var telegramUrl = "https://api.telegram.org/bot<你的机器人Token>"; var url = `${telegramUrl}/deleteMessage?chat_id=${chatId}&message_id=${messageId}`; UrlFetchApp.fetch(url); }
响应回调查询函数
function answerCallbackQuery(callbackQueryId) { var telegramUrl = "https://api.telegram.org/bot<你的机器人Token>"; var url = `${telegramUrl}/answerCallbackQuery?callback_query_id=${callbackQueryId}`; UrlFetchApp.fetch(url); }
3. 确保通知消息的内联键盘格式正确
发送带按钮的通知时,要保证内联键盘的JSON格式规范(无需额外单引号包裹):
// 示例:表单提交时发送带按钮的交易通知 function sendTransactionNotification(chatId, transactionInfo) { var telegramUrl = "https://api.telegram.org/bot<你的机器人Token>"; var text = `新交易申请:\n${transactionInfo}`; var inlineKeyboard = { "inline_keyboard": [[{"text":"标记完成","callback_data":"delete_message"}]] }; var payload = { "chat_id": chatId, "text": text, "reply_markup": inlineKeyboard }; var options = { "method": "post", "contentType": "application/json", "payload": JSON.stringify(payload) }; UrlFetchApp.fetch(telegramUrl + "/sendMessage", options); }
注意事项
- 替换所有代码中的
<你的机器人Token>为实际的Telegram机器人Token - 确保Google Apps Script的Web App已部署为任何人,甚至匿名可访问(否则Telegram无法推送回调请求)
- 重新调用
setWebhook函数,确保最新代码生效
内容的提问来源于stack exchange,提问作者jparodist
相关产品推荐
相关产品推荐

