JavaRush /Курсы /Модуль 4: FastAPI /Обработка команд в боте (например, /start, /help)

Обработка команд в боте (например, /start, /help)

Модуль 4: FastAPI
18 уровень , 6 лекция
Открыта

Сейчас мы займемся важнейшей частью функциональности любого Telegram-бота — обработкой команд.

Команды — это своеобразный язык общения пользователя с ботом.

Наверняка вы видели что-то вроде /start, /help, а может даже /give_me_cookies, и именно это будет темой нашей лекции.

Команды в Telegram — это начальная точка многих сценариев взаимодействия с ботом. Например:

  • /start запускает работу с ботом и представляет его пользователю.
  • /help показывает, какую функциональность бот предоставляет и как ею пользоваться.
  • Пользовательские команды, такие как /weather или /order, могут запускать специфические действия.

Команды позволяют организовать общение пользователя с ботом более структурировано и интуитивно.


Пошаговая разработка обработчика команд

  1. Настройка обработчиков для команд

    Для начала, давайте добавим обработчики команд в нашего Telegram-бота. Библиотека python-telegram-bot предоставляет удобный интерфейс для этого — CommandHandler.

    Вот как это делается:

    
    from telegram import Update
    from telegram.ext import ApplicationBuilder, CommandHandler
    
    # Функция, которая обрабатывает команду /start
    async def start_command(update: Update, context):
        await update.message.reply_text("Привет! Я ваш Telegram-бот. Чем могу помочь?")
    
    # Функция, которая обрабатывает команду /help
    async def help_command(update: Update, context):
        await update.message.reply_text("Вот список доступных команд:\n/start - Запустить бота\n/help - Справка")
    
    # Создание экземпляра приложения
    app = ApplicationBuilder().token("YOUR_API_TOKEN").build()
    
    # Добавляем обработчики команд
    app.add_handler(CommandHandler("start", start_command))
    app.add_handler(CommandHandler("help", help_command))
    
    if __name__ == "__main__":
        print("Бот запущен...")
        app.run_polling()
    

    Выше мы создали две команды /start и /help. Обработчики команд ассоциированы с функциями start_command и help_command. Когда пользователь вводит /start, функция start_command отправляет приветственное сообщение.

    Примечание:

    Замените "YOUR_API_TOKEN" на свой API токен, который вы получили от BotFather.

  2. Расширяем функциональность команд

    Теперь давайте добавим немного "вкуса" в наши команды, чтобы они выглядели более профессионально.

    Например, предоставим пользователю больше информации о возможностях бота.

    Обновленная версия команды /help:

    
    async def help_command(update: Update, context):
        help_text = """
        Вот, что я умею:
        /start - Запустить бота
        /help - Вывести справку
        /weather <город> - Узнать текущую погоду
        /about - Узнать больше обо мне
        """
        await update.message.reply_text(help_text)
    

    Мы добавили подсказку о будущей функции /weather. Конечно, пока эта команда "мёртвая", но она пробуждает интерес.

    Мы будем работать над этим в следующих лекциях.

  3. Использование аргументов в командах

    Иногда команды требуют аргументы для выполнения. Например, чтобы вывести погоду в конкретном городе, нужно указать название города. python-telegram-bot позволяет обрабатывать аргументы через атрибут context.args.

    Пример команды /weather:

    
    async def weather_command(update: Update, context):
        if not context.args:
            await update.message.reply_text("Пожалуйста, укажите город после команды. Например: /weather Москва")
            return
    
        city = " ".join(context.args)  # Объединяем слова, если пользователь ввел "Санкт Петербург"
        await update.message.reply_text(f"Вы запросили погоду для города: {city}. (Отправлено в отдел прогнозов!)")
    

    Теперь ваш бот может обрабатывать команды с параметрами:

    /weather Москва
  4. Улучшение кода: обработка неизвестных команд

    Что случится, если пользователь введет команду, о которой бот ничего не знает?

    Правильно, бот должен красиво ответить, что он немного смущен, но готов учиться. Мы добавим "уловитель" для неизвестных команд.

    Реализация:

    
    from telegram.ext import MessageHandler, filters
    
    async def unknown_command(update: Update, context):
        await update.message.reply_text("Извините, я не знаю такой команды. Попробуйте /help.")
    
    app.add_handler(MessageHandler(filters.COMMAND, unknown_command))
    

    Теперь, когда пользователь введет что-то вроде /random_command, бот мягко направит его к справочной информации.

  5. Организация более сложных сценариев

    Если вы хотите, чтобы ваш бот был умнее, команды могут стать частью более сложных сценариев.

    Например, команда /start может инициировать регистрацию пользователя через несколько шагов.

    Пример: введение пользователя через несколько этапов

    
    async def start_command(update: Update, context):
        await update.message.reply_text("Привет! Давайте начнем. Как вас зовут?")
    
    async def handle_name(update: Update, context):
        user_name = update.message.text
        await update.message.reply_text(f"Приятно познакомиться, {user_name}! Чем я могу помочь?")
        # После этого можно сбросить состояние или продолжить разговор
    

    Для реализации сценариев с состояниями можно использовать ConversationHandler из python-telegram-bot. Пока мы не углубляемся в эту тему, но будьте уверены, она будет рассмотрена позже.


Обработка ошибок при работе с командами

Типичные ошибки:

  1. Необработанные команды: если бот не знает, что делать с командой, он может выдавать странные ошибки. Решается добавлением "уловителя" для неизвестных команд.
  2. Пустые аргументы: если команда ожидает аргументы, но они не предоставлены, бот должен обрабатывать это корректно (добавлять проверку через if not context.args).
  3. Неправильное использование API токена: убедитесь, что ваш токен надежно хранится (например, в переменных окружения).

Практическое применение

Обработка команд — это основа любого бота. На собеседованиях и в реальной жизни специалисты часто сталкиваются с задачами по разработке Telegram-ботов для автоматизации процессов. Эти знания позволят вам реализовать простые, но полезные сценарии, например:

  • Справочные боты для корпоративного использования.
  • Автоматизация процессов: заказ услуг, управление задачами, уведомления.

Полный код бота с обработкой команд

Напоследок соберем всё, что мы написали, в одном файле:


from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters

async def start_command(update: Update, context):
    await update.message.reply_text("Привет! Я ваш Telegram-бот. Чем могу помочь?")

async def help_command(update: Update, context):
    help_text = """
    Вот, что я умею:
    /start - Запустить бота
    /help - Вывести справку
    /weather <город> - Узнать текущую погоду
    """
    await update.message.reply_text(help_text)

async def weather_command(update: Update, context):
    if not context.args:
        await update.message.reply_text("Пожалуйста, укажите город после команды. Например: /weather Москва")
        return

    city = " ".join(context.args)
    await update.message.reply_text(f"Вы запросили погоду для города: {city}. (Отправлено в отдел прогнозов!)")

async def unknown_command(update: Update, context):
    await update.message.reply_text("Извините, я не знаю такой команды. Попробуйте /help.")

app = ApplicationBuilder().token("YOUR_API_TOKEN").build()

app.add_handler(CommandHandler("start", start_command))
app.add_handler(CommandHandler("help", help_command))
app.add_handler(CommandHandler("weather", weather_command))
app.add_handler(MessageHandler(filters.COMMAND, unknown_command))

if __name__ == "__main__":
    print("Бот запущен...")
    app.run_polling()

Теперь ваш бот готов обрабатывать команды и выглядит как настоящий профессионал. 😊

1
Задача
Модуль 4: FastAPI, 18 уровень, 6 лекция
Недоступна
Добавление справочной информации
Добавление справочной информации
1
Задача
Модуль 4: FastAPI, 18 уровень, 6 лекция
Недоступна
Реализация команды с аргументами
Реализация команды с аргументами
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ