Ваш код имеет несколько ошибок, которые могут вызывать проблемы с повторным отправлением сообщений. Давайте разберем их и улучшим ваш код, чтобы бот работал корректно.
1. **Проблема с отправкой сообщений**: Вероятная причина, по которой бот отправляет одно и то же сообщение несколько раз, заключается в том, что обработчик события `on('message')` срабатывает каждый раз, когда ваш бот получает любое сообщение. Если вы отправляете команду `/menu`, это также считается сообщением, и обработчик `on('message')` срабатывает снова.
2. **Клавиатура**: Вы используете `reply_markup` для создания обычной клавиатуры, но в вашем случае вы хотите использовать `inline_keyboard` для обработки нажатий на кнопки.
Давайте внедрим вышеописанные исправления. Вот обновленный код:
```javascript
const TelegramBot = require('node-telegram-bot-api');
// Здесь вставьте ваш токен
const token = 'YOUR_TELEGRAM_BOT_TOKEN';
const bot = new TelegramBot(token, { polling: true });
const mainKeyboard = {
reply_markup: {
keyboard: [
[{ text: '⭐️ chapter1' }],
[{ text: '⭐️ chapter2' }],
[{ text: '⭐️ chapter3' }]
],
one_time_keyboard: true
}
};
bot.onText(/\/menu/, (msg) => {
bot.sendMessage(msg.chat.id, "Bot menu", mainKeyboard);
});
bot.on('message', (msg) => {
const chatId = msg.chat.id;
const text = msg.text;
if (text === '⭐️ chapter1') {
const section1Keyboard = {
reply_markup: {
inline_keyboard: [
[{ text: 'subsection 1.1', callback_data: 'subsection1_1' }],
[{ text: 'subsection 1.2', callback_data: 'subsection1_2' }],
[{ text: 'Назад', callback_data: 'back' }]
]
}
};
bot.sendMessage(chatId, 'you have chosen chapter 1', section1Keyboard);
} else if (text === '⭐️ chapter2') {
bot.sendMessage(chatId, 'you have chosen chapter 2');
} else if (text === '⭐️ chapter3') {
bot.sendMessage(chatId, 'you have chosen chapter 3');
}
});
// Обработчик для обработки нажатий на кнопки inline
bot.on('callback_query', (callbackQuery) => {
const message = callbackQuery.message;
const chatId = message.chat.id;
const callbackData = callbackQuery.data;
if (callbackData === 'subsection1_1') {
bot.sendMessage(chatId, 'You selected subsection 1.1');
} else if (callbackData === 'subsection1_2') {
bot.sendMessage(chatId, 'You selected subsection 1.2');
} else if (callbackData === 'back') {
bot.sendMessage(chatId, 'Back to main menu', mainKeyboard);
}
});
```
### Основные изменения:
1. **Inline keyboards**: Теперь у вас есть отдельный обработчик для **inline клавиатур** `bot.on('callback_query', ...)`, который обрабатывает нажатия на кнопки и выполняет соответствующие действия.
2. **Изменение структуры клавиатуры**: Я изменил параметр конструкции `reply_markup` для основной клавиатуры, добавив `one_time_keyboard: true`, чтобы она исчезала после нажатия на кнопку, если это необходимо.
3. **Устранение дублирования сообщений**: Теперь обработка команд осуществляется в отдельных обработчиках, что предотвращает повторное срабатывание и дублирование сообщений.
Теперь ваш бот должен корректно обрабатывать команды и показывать inline клавиатуру с правильным функционалом.