如何在用户点击一次后禁用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
相关产品推荐
相关产品推荐

