Сейчас мы займемся важнейшей частью функциональности любого Telegram-бота — обработкой команд.
Команды — это своеобразный язык общения пользователя с ботом.
Наверняка вы видели что-то вроде /start, /help, а может даже /give_me_cookies, и именно это будет темой нашей лекции.
Команды в Telegram — это начальная точка многих сценариев взаимодействия с ботом. Например:
/startзапускает работу с ботом и представляет его пользователю./helpпоказывает, какую функциональность бот предоставляет и как ею пользоваться.- Пользовательские команды, такие как
/weatherили/order, могут запускать специфические действия.
Команды позволяют организовать общение пользователя с ботом более структурировано и интуитивно.
Пошаговая разработка обработчика команд
- Настройка обработчиков для команд
Для начала, давайте добавим обработчики команд в нашего 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. - Расширяем функциональность команд
Теперь давайте добавим немного "вкуса" в наши команды, чтобы они выглядели более профессионально.
Например, предоставим пользователю больше информации о возможностях бота.
Обновленная версия команды
/help:async def help_command(update: Update, context): help_text = """ Вот, что я умею: /start - Запустить бота /help - Вывести справку /weather <город> - Узнать текущую погоду /about - Узнать больше обо мне """ await update.message.reply_text(help_text)Мы добавили подсказку о будущей функции
/weather. Конечно, пока эта команда "мёртвая", но она пробуждает интерес.Мы будем работать над этим в следующих лекциях.
- Использование аргументов в командах
Иногда команды требуют аргументы для выполнения. Например, чтобы вывести погоду в конкретном городе, нужно указать название города.
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 Москва - Улучшение кода: обработка неизвестных команд
Что случится, если пользователь введет команду, о которой бот ничего не знает?
Правильно, бот должен красиво ответить, что он немного смущен, но готов учиться. Мы добавим "уловитель" для неизвестных команд.
Реализация:
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, бот мягко направит его к справочной информации. - Организация более сложных сценариев
Если вы хотите, чтобы ваш бот был умнее, команды могут стать частью более сложных сценариев.
Например, команда
/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. Пока мы не углубляемся в эту тему, но будьте уверены, она будет рассмотрена позже.
Обработка ошибок при работе с командами
Типичные ошибки:
- Необработанные команды: если бот не знает, что делать с командой, он может выдавать странные ошибки. Решается добавлением "уловителя" для неизвестных команд.
- Пустые аргументы: если команда ожидает аргументы, но они не предоставлены, бот должен обрабатывать это корректно (добавлять проверку через
if not context.args). - Неправильное использование 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()
Теперь ваш бот готов обрабатывать команды и выглядит как настоящий профессионал. 😊
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ