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

Telegraf(JavaScript):如何在Telegram键盘或内联键盘中调用函数?

在Telegram内联按钮中触发自定义函数的正确方式

你遇到的问题很典型——Telegram Bot API的callback_data确实只接受字符串,没法直接把函数作为参数传进去。而且你之前写test()的时候,代码会立即执行这个函数,并把它的返回值(这里是undefined)传给callback_data,这显然不是你想要的点击按钮才触发的效果。

要实现点击按钮时调用自定义函数,正确的做法是通过callback_data传递一个唯一的字符串标识,然后用Telegraf的bot.action()方法监听这个标识,在回调逻辑里执行你的函数。

修改后的完整代码:

bot.command("report", (ctx) => {
  ctx.reply("Are you sure? using this will have a refresh timeout of 2 minutes.", {
    reply_markup: {
      // 注意:带callback_data的是内联按钮,必须用inline_keyboard而非普通keyboard
      inline_keyboard: [
        [{ text: "Yes", callback_data: "confirm_yes" }, { text: "No", callback_data: "confirm_no" }],
        [{ text: "Next", callback_data: "next" }],
        [{ text: "Open in browser", url: "telegraf.js.org" }]
      ]
    }
  });
});

// 定义你的自定义函数
const test = () => { 
  console.log("test");
};

// 监听"Yes"按钮的回调标识,触发时调用test函数
bot.action("confirm_yes", (ctx) => {
  test();
  // 可选:给用户反馈,避免按钮长时间处于加载状态
  ctx.answerCbQuery("Confirmed!");
  ctx.editMessageText("You chose Yes, executing operation...");
});

// 可额外监听"No"按钮的动作
bot.action("confirm_no", (ctx) => {
  ctx.answerCbQuery("Cancelled");
  ctx.editMessageText("Operation cancelled.");
});

关键细节说明:

  • 内联按钮的正确配置:普通keyboard是发送消息的按钮,带callback_data的按钮必须用inline_keyboard才能生效,这是很多新手容易踩的坑。
  • 语义化的回调标识:用confirm_yes这类字符串代替直接传函数,既符合API要求,也能让代码逻辑更清晰。
  • bot.action() vs bot.hear():hear监听用户主动发送的消息文本,而action只响应内联按钮的点击,不会被用户手动输入"Yes"触发,更安全准确。
  • 必须的回调反馈:ctx.answerCbQuery()是告诉Telegram服务器已处理回调,否则用户会看到按钮一直处于加载状态,影响体验。

这样调整后,用户点击"Yes"按钮时,就会触发test()函数,同时给用户明确的操作反馈啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:22:33