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

Google Script开发Telegram Bot:Inline按钮点击检测失效求助

解决Google Script开发Telegram Bot无法检测Inline按钮点击的问题

你的核心问题是处理callback_query时未按Telegram API要求回复回调请求,导致平台无法确认回调已处理,同时代码存在冗余定义问题。以下是具体修复方案:

问题分析

  1. 未回复Callback Query:Telegram要求收到callback_query后,必须调用answerCallbackQuery接口确认,否则会持续重试请求,且用户端按钮会处于加载状态,无法触发后续逻辑。你的代码仅调用了sendMessage,缺少这一关键步骤。
  2. 代码冗余:在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)
  });
}

验证步骤

  1. 替换代码中的你的BotToken为实际的Telegram Bot Token。
  2. 重新部署Google Script Web App,权限设置为“任何人,甚至匿名用户”。
  3. 更新Telegram Bot的Webhook地址为最新部署地址。

完成以上操作后,点击Inline按钮即可正确触发对应逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:05:08