You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Telegraf框架下Telegram Bot内联按钮Callback Query处理问题求助

修正Telegram Bot内联按钮回调逻辑的方案

我看了你的代码,目前有几个关键问题导致回调处理不正常,下面是修正后的完整代码,以及对应的问题说明:

bot.hears('Contact', async (ctx) => {
  try {
    await ctx.replyWithHTML('<b>选择你要联系的对象:</b>', Markup.inlineKeyboard(
      [
        [Markup.button.callback('联系kyky', 'kyky')],
        [Markup.button.callback('联系mymy', 'mymy')]
      ]
    ))
  } catch (e) {
    console.error(e)
  }
})

bot.on('callback_query', async (ctx) => {
  // 首先必须回应Telegram的回调请求,否则按钮会一直处于加载状态
  await ctx.answerCallbackQuery();
  
  const chatId = ctx.from.id;
  const callbackData = ctx.callbackQuery.data;

  if (callbackData === 'kyky') {
    // 发送消息给触发回调的用户,告知联系方式
    await ctx.telegram.sendMessage(chatId, '你可以联系 @kyky');
  } else if (callbackData === 'mymy') {
    await ctx.telegram.sendMessage(chatId, '你可以联系 @mymy');
  }
})

主要修改点说明:

  • 添加answerCallbackQuery调用:这是Telegram API的硬性要求,处理回调查询时必须调用这个方法告知服务器“请求已处理”,否则用户端的按钮会一直显示加载动画,严重影响体验。
  • 修正sendMessage的参数:原代码直接把@kyky作为第一个参数是错误的,sendMessage的第一个参数必须是目标聊天ID(这里就是触发回调的用户IDchatId),第二个参数才是要发送的文本内容。
  • 改用ctx对象处理操作:在callback_query回调里用ctx对象获取用户信息、发送消息,这是Telegraf框架(你当前使用的应该是这个)的标准用法,更贴合框架设计逻辑,能避免上下文混乱问题。
  • 统一用async/await处理异步操作:确保所有异步API调用都等待完成,避免出现未处理的Promise或操作顺序混乱的情况。
  • 优化条件判断逻辑:把两个独立if改成if-else if,减少不必要的判断分支,逻辑更清晰。

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

火山引擎 最新活动