Зараз ми зайнемося найважливішою частиною функціональності будь‑якого 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()
Тепер ваш бот готовий обробляти команди і виглядає як справжній професіонал. 😊
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ