Как правильно написать код для телеграм-бота на Node.js, чтобы он функционировал без ошибок?

Я хочу, чтобы при нажатии на клавиатуре рядом с полем ввода текста бот отправлял inline_keyboard, но у меня не получается. Когда я пытаюсь написать код и нажимаю /menu, бот отправляет сообщение 'Bot menu' несколько раз, и количество сообщений увеличивается на единицу. Можете помочь решить эту проблему? 

Я начинаю разрабатывать бота и сомневаюсь, возможно ли подключить клавиатуру и inline_keyboard в данной ситуации. 

<pre><code class="javascript">bot.onText(/\/menu/, (msg) =&gt; {
   bot.sendMessage(msg.chat.id, "Bot menu", mainKeyboard);
});

const mainKeyboard = {
  reply_markup: { 
   keyboard: [
   [{text:'⭐️ chapter1', callback_data:'section1'}],
   [{text:'⭐️ chapter2', callback_data:'section2'}],
   [{text:'⭐️ chapter3', callback_data:'section3'}],
     ]
   }
}

bot.on('message', (msg) =&gt; {
   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');
   }
})</code></pre>
  • 27 декабря 2024 г. 19:53
Ответы на вопрос 1
Ваш код имеет несколько ошибок, которые могут вызывать проблемы с повторным отправлением сообщений. Давайте разберем их и улучшим ваш код, чтобы бот работал корректно.

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 клавиатуру с правильным функционалом.
Похожие вопросы