Telegram机器人callback_query逻辑失效,点击按钮无响应求助
问题排查与修复
核心问题1:初始化时未判断消息类型,直接访问contents.message导致报错
当用户点击内联按钮时,Telegram推送的更新里没有message字段,只有callback_query。但你的代码开头直接执行let chat_id = contents.message.chat.id;,这会因为contents.message是undefined而抛出错误,函数直接终止,根本到不了if(contents.callback_query)的判断分支。
核心问题2:callback分支里调用了不存在的sendText函数
代码里只定义了sendMessage,但你在data == 'box 1'时调用了sendText,这个函数不存在,即使走到分支也会报错。
额外优化:未调用answerCallbackQuery确认按钮点击
点击内联按钮后,Telegram会等待机器人返回确认,不调用的话用户端会一直显示加载状态,需要补上这个步骤。
修复后的完整代码
function doPost(e) { let contents = JSON.parse(e.postData.contents); // 先判断更新类型,避免提前访问不存在的字段报错 if(contents.callback_query){ let id_callback = contents.callback_query.from.id; let data = contents.callback_query.data; // 先确认按钮点击,消除用户端加载状态 answerCallbackQuery(contents.callback_query.id); if(data == 'box 1'){ sendMessage(id_callback,"hello 1"); } else if(data == 'box 2'){ sendMessage(id_callback,"hello 2"); } else if(data == 'all'){ sendMessage(id_callback,"hello 3"); } } else if(contents.message){ // 只有当是message类型时才访问message字段 let chat_id = contents.message.chat.id; var keyBoard = { "inline_keyboard": [ [{ "text": "Box 1", "callback_data": "box 1" }], [{ "text": "Box 2", "callback_data": "box 2" }], [{ "text": "All", "callback_data": "all" }] ] } sendMessage(chat_id,"Please select one of the options given",keyBoard); } } function sendMessage(chat_id,text,keyBoard){ var data = { method: "post", payload: { method: "sendMessage", chat_id: String(chat_id), text: text, parse_mode: "HTML", reply_markup: keyBoard ? JSON.stringify(keyBoard) : undefined } }; UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data); } // 新增:确认按钮点击的函数 function answerCallbackQuery(callbackQueryId) { var data = { method: "post", payload: { method: "answerCallbackQuery", callback_query_id: callbackQueryId } }; UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data); }
修复说明
- 调整判断顺序:先判断
callback_query,再处理message,避免提前访问不存在的message字段导致报错。 - 移除错误函数调用:把
sendText改成sendMessage,确保调用存在的函数。 - 新增
answerCallbackQuery函数:点击按钮后调用该函数,告诉Telegram已接收请求,消除用户端的加载状态。 - 优化
sendMessage函数:当不需要键盘时,reply_markup设为undefined,避免多余的JSON序列化。
内容的提问来源于stack exchange,提问作者millionclones
相关产品推荐
相关产品推荐

