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

如何在用户点击一次后禁用Telegraf.js的Inline Keyboard?

解决Telegraf中Inline Keyboard点击后无法禁用的问题

你之前的问题出在两个关键错误上:

  • bot.hears是用来监听用户发送的普通文本消息的,Inline按钮的点击属于回调事件,必须用bot.action来处理
  • remove_keyboard参数是给底部普通键盘(ReplyKeyboard)用的,对Inline Keyboard完全无效

下面给你两种可行的解决方案:

方案一:点击后直接移除整个Inline Keyboard

当用户点击任意按钮后,编辑发送键盘的那条消息,把Inline Keyboard清空即可:

// 发送Inline Keyboard的代码(保留原有逻辑)
ctx.reply("Do you want to order the product?", {
  parse_mode: "HTML",
  ...Markup.inlineKeyboard([
    Markup.button.callback("Order", "order"),
    Markup.button.callback("Cancel", "cancel"),
  ]),
});

// 处理Order按钮的回调
bot.action('order', async (ctx) => {
  // 给用户发送操作回复
  await ctx.reply('已确认下单');
  // 编辑原消息,移除Inline Keyboard
  await ctx.editMessageReplyMarkup({ inline_keyboard: [] });
});

// 处理Cancel按钮的回调
bot.action('cancel', async (ctx) => {
  await ctx.reply('已取消订单');
  await ctx.editMessageReplyMarkup({ inline_keyboard: [] });
});

方案二:点击后禁用所有按钮(保留键盘但不可点击)

如果想保留键盘的显示状态,但让所有按钮无法再次点击,可以编辑原消息的键盘,给每个按钮加上disable: true参数:

// 发送键盘的代码不变

// 处理Order回调
bot.action('order', async (ctx) => {
  await ctx.reply('已确认下单');
  // 编辑原消息的键盘,禁用所有按钮
  await ctx.editMessageReplyMarkup({
    inline_keyboard: [
      [Markup.button.callback("Order", "order", { disable: true })],
      [Markup.button.callback("Cancel", "cancel", { disable: true })]
    ]
  });
});

// 处理Cancel回调
bot.action('cancel', async (ctx) => {
  await ctx.reply('已取消订单');
  await ctx.editMessageReplyMarkup({
    inline_keyboard: [
      [Markup.button.callback("Order", "order", { disable: true })],
      [Markup.button.callback("Cancel", "cancel", { disable: true })]
    ]
  });
});

注意:两种方案都需要用async/await处理异步操作,确保消息回复和键盘修改的执行顺序正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:37:13