Google Script开发Telegram Bot:Inline按钮点击检测失效求助
解决Google Script开发Telegram Bot无法检测Inline按钮点击的问题
你的核心问题是处理callback_query时未按Telegram API要求回复回调请求,导致平台无法确认回调已处理,同时代码存在冗余定义问题。以下是具体修复方案:
问题分析
- 未回复Callback Query:Telegram要求收到
callback_query后,必须调用answerCallbackQuery接口确认,否则会持续重试请求,且用户端按钮会处于加载状态,无法触发后续逻辑。你的代码仅调用了sendMessage,缺少这一关键步骤。 - 代码冗余:在
contents.message分支中重复解析e.postData.contents和定义chat_id,虽不影响功能,但降低了代码可读性。
修复步骤
1. 实现answerCallbackQuery函数
添加用于回复Telegram回调请求的函数:
function answerCallbackQuery(callbackQueryId, text = '') { const BOT_TOKEN = '你的BotToken'; // 替换为实际的Telegram Bot Token const url = `https://api.telegram.org/bot${BOT_TOKEN}/answerCallbackQuery`; const payload = { callback_query_id: callbackQueryId, text: text, show_alert: false // 设为true会弹出提示框 }; UrlFetchApp.fetch(url, { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) }); }
2. 修改doPost函数
修复回调处理逻辑,添加回复回调步骤,并清理冗余代码:
var KEYBOARD_MAIN = { "inline_keyboard": [ [{ "text": "button 1", 'callback_data': 'btn1' }], [{ "text": "button 2", 'callback_data': 'btn2' }] ] }; function doPost(e) { var contents = JSON.parse(e.postData.contents); if (contents.callback_query) { const callbackQueryId = contents.callback_query.id; const data = contents.callback_query.data; const chat_id = contents.callback_query.from.id; // 先回复Telegram的回调请求,必须步骤 answerCallbackQuery(callbackQueryId); // 根据callback_data处理逻辑 if (data == 'btn1') { sendMessage(chat_id, 'btn1 clicked'); } else if (data == 'btn2') { sendMessage(chat_id, 'btn2 clicked'); } } else if (contents.message) { const chat_id = contents.message.chat.id; const text = contents.message.text; const messageId = contents.message.message_id; if (text == "/start") { deleteMessage(chat_id, messageId); sendMessageKeyboard(chat_id, "enter your command", KEYBOARD_MAIN); } else if (!isNaN(parseFloat(text)) && isFinite(text)) { for (var i = 0; i < logins.length; i++) { if (chat_id == logins[i]) { sBot.getRange("C" + (i + 2)).setValue(text); replaceKeyBoard(chat_id, sBot.getRange("D" + (i + 2)).getValue()); } } } } };
3. 确保辅助函数正确实现
sendMessage和sendMessageKeyboard需正确调用Telegram API,示例如下:
function sendMessage(chatId, text) { const BOT_TOKEN = '你的BotToken'; const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`; const payload = { chat_id: chatId, text: text }; UrlFetchApp.fetch(url, { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) }); } function sendMessageKeyboard(chatId, text, keyboard) { const BOT_TOKEN = '你的BotToken'; const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`; const payload = { chat_id: chatId, text: text, reply_markup: JSON.stringify(keyboard) }; UrlFetchApp.fetch(url, { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) }); }
验证步骤
- 替换代码中的
你的BotToken为实际的Telegram Bot Token。 - 重新部署Google Script Web App,权限设置为“任何人,甚至匿名用户”。
- 更新Telegram Bot的Webhook地址为最新部署地址。
完成以上操作后,点击Inline按钮即可正确触发对应逻辑。
内容的提问来源于stack exchange,提问作者Spart Persian0098
相关产品推荐
相关产品推荐

