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()vsbot.hear():hear监听用户主动发送的消息文本,而action只响应内联按钮的点击,不会被用户手动输入"Yes"触发,更安全准确。- 必须的回调反馈:
ctx.answerCbQuery()是告诉Telegram服务器已处理回调,否则用户会看到按钮一直处于加载状态,影响体验。
这样调整后,用户点击"Yes"按钮时,就会触发test()函数,同时给用户明确的操作反馈啦。
内容的提问来源于stack exchange,提问作者ayami asakura
相关产品推荐
相关产品推荐

