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

Telegram Bot键盘切换失效问题求助(Node.js实现)

你的Telegram Bot键盘切换失效?问题出在这几个地方!

嘿,我看了你的代码,很快就发现了导致键盘切换没反应的核心问题,还有几个小bug也得一起修复,我来给你捋清楚:

主要问题拆解

  1. 重复注册message事件:你写了两个bot.on('message')回调,这会导致用户发消息时两个逻辑同时跑,互相干扰,第二个回调里的键盘更新自然没法正常生效。
  2. 缺少键盘切换的处理逻辑:当用户点"More house"或"Back to choose style"时,你的代码根本没写对应的处理,那键盘当然不会变啦。
  3. count变量没初始化:第二个回调里的count +=1会直接报错,因为你从来没声明过这个变量。
  4. House歌曲没实际发送:你只发了提示文本,忘了把house歌单里的链接发出去。

修复后的完整代码

// 先把需要的变量初始化好
let count = 0;
// 这里假设你的歌单数组已经提前定义了哈
const electro_collection = ["https://example.com/electro1.mp3", "https://example.com/electro2.mp3"];
const house_collection = ["https://example.com/house1.mp3", "https://example.com/house2.mp3"];

// 把重复的随机函数改成通用版,省得写两遍
const getRandomSongIndex = (collection) => Math.floor(Math.random() * collection.length);

// /start命令的处理,弹出初始的4按钮键盘
bot.onText(/\/start/, (msg) => {
  const welcomeMsg = `Welcome, ${msg.from.first_name}. Pick a style and I'll hook you up with some great music ;)`,
  const mainKeyboard = {
    reply_markup: {
      keyboard: [["Jazz", "House"], ["Techno", "Electro"]],
      resize_keyboard: true // 可选,让键盘更贴合手机屏幕
    }
  };
  bot.sendMessage(msg.chat.id, welcomeMsg, mainKeyboard);
});

// 所有消息都放这里处理,别分开注册啦
bot.on('message', (msg) => {
  const chatId = msg.chat.id;
  const userName = msg.from.first_name;
  const userInput = msg.text?.toLowerCase() || '';

  // 处理Electro风格请求
  if (userInput.includes("electro")) {
    bot.sendMessage(chatId, `Here's your electro track, ${userName}!`);
    bot.sendMessage(chatId, electro_collection[getRandomSongIndex(electro_collection)]);
  }

  // 处理House相关请求(首次选择和"More house")
  else if (userInput.includes("house") || userInput === "more house") {
    count += 1;
    console.log(`Total house requests: ${count}`);
    // 先发歌曲链接
    bot.sendMessage(chatId, `Enjoy this house track, ${userName}!`);
    bot.sendMessage(chatId, house_collection[getRandomSongIndex(house_collection)]);
    // 弹出House专属的2按钮键盘
    const houseKeyboard = {
      reply_markup: {
        keyboard: [["More house"], ["Back to choose style"]],
        resize_keyboard: true
      }
    };
    bot.sendMessage(chatId, "Want more tunes?", houseKeyboard);
  }

  // 处理返回主菜单的请求
  else if (userInput === "back to choose style") {
    const mainKeyboard = {
      reply_markup: {
        keyboard: [["Jazz", "House"], ["Techno", "Electro"]],
        resize_keyboard: true
      }
    };
    bot.sendMessage(chatId, `Welcome back, ${userName}! Pick another style below.`, mainKeyboard);
  }

  // 处理用户输入的其他无关内容
  else {
    bot.sendMessage(chatId, "Oops, I don't get that. Please use the keyboard to pick a music style!");
  }
});

为啥这样改就好使?

  • 统一事件监听:把所有消息处理逻辑合并到一个回调里,避免了多个回调互相冲突的问题。
  • 补上键盘切换逻辑:专门加了对"Back to choose style"和"More house"的处理,点击后会正确切换对应的键盘。
  • 修复变量报错:给count加了初始化,再也不会报未定义的错了。
  • 简化代码:把两个重复的随机函数改成通用版,代码更简洁。
  • 优化用户体验:加了resize_keyboard让键盘在手机上显示更舒服,还给无关输入加了提示。

这样修改后,你的键盘切换功能就能正常工作啦,赶紧试试吧!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:09