You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

修复说明

  1. 调整判断顺序:先判断callback_query,再处理message,避免提前访问不存在的message字段导致报错。
  2. 移除错误函数调用:把sendText改成sendMessage,确保调用存在的函数。
  3. 新增answerCallbackQuery函数:点击按钮后调用该函数,告诉Telegram已接收请求,消除用户端的加载状态。
  4. 优化sendMessage函数:当不需要键盘时,reply_markup设为undefined,避免多余的JSON序列化。

内容的提问来源于stack exchange,提问作者millionclones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:38:23