JavaRush /Курсы /Модуль 4: FastAPI /Создание простого бота: ответ на текстовые сообщения

Создание простого бота: ответ на текстовые сообщения

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

Начнем с простого. Все Telegram-боты следуют одному принципу: они ждут события (в нашем случае - сообщения), их и формируют ответ. Представьте, что это официант в ресторане, который принимает заказы и приносит блюда. В мире ботов события называются "update", а официанту помогает шеф-повар — python-telegram-bot.

Когда пользователь отправляет сообщение нашему боту, Telegram API передает информацию к нам в виде событий. Наша задача — отслеживать эти события, обрабатывать их и возвращать ответ.

Структура проекта

Вот минимальная структура нашего проекта:


telegram_bot/
    ├── bot.py        # Основной код бота
    ├── requirements.txt # Зависимости проекта

Ваш первый бот: привет, мир!

Перед тем как писать код, убедитесь, что у вас установлен python-telegram-bot. Если нет, то выполните команду:

pip install python-telegram-bot

Шаг 1: Подключим библиотеку и настроим бота

Создайте файл bot.py и добавьте следующий код:


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

# Создаем экземпляр приложения
TOKEN = "ВАШ_API_КЛЮЧ_БОТА"  # Не забудьте вставить ваш токен
app = ApplicationBuilder().token(TOKEN).build()

ApplicationBuilder — это сердце вашего бота. Здесь мы подключаем API-токен, через который Telegram узнает бота.

Шаг 2: Реализуем команду /start

Теперь добавим обработчик для команды /start. Это первая команда, с которой чаще всего начинается знакомство пользователя с ботом.


async def start(update: Update, context):
    """Функция для обработки команды /start"""
    user = update.effective_user
    await update.message.reply_text(f"Привет, {user.first_name}! Я ваш новый бот. Чем могу помочь?")
    
# Добавляем обработчик команды /start
app.add_handler(CommandHandler("start", start))

Когда пользователь напишет /start, бот отправит ему приветственное сообщение.

Шаг 3: Ответы на текстовые сообщения

Обычные сообщения (не команды!) мы будем обрабатывать с помощью обработчика MessageHandler.


async def echo(update: Update, context):
    """Ответ на любое текстовое сообщение"""
    text = update.message.text
    await update.message.reply_text(f"Вы написали: {text}")
    
# Добавляем обработчик сообщений
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))

В функции echo мы просто возвращаем текст, который ввел пользователь. Это похоже на зеркало: бот повторяет каждое ваше слово. Позже мы сделаем эту функцию умнее.

Шаг 4: Запуск бота

Осталось только запустить бота. Для этого добавьте в конце файла bot.py:


if __name__ == "__main__":
    print("Бот запущен... Нажмите Ctrl+C для остановки.")
    app.run_polling()

Теперь можете запустить скрипт:

python bot.py

Откройте Telegram, найдите своего бота и напишите: /start.

Если бот отвечает вам "Привет, [ваше имя]! Я ваш новый бот", поздравляю — ваш первый бот готов! Попробуйте написать что-нибудь другое, и он повторит ваше сообщение.


Улучшение функционала: команды /help и /about

Теперь добавим еще несколько команд: /help и /about.


async def help_command(update: Update, context):
    """Функция для обработки команды /help"""
    await update.message.reply_text("Я могу повторять ваши сообщения или помочь с чем-то другим. Попробуйте!")

async def about_command(update: Update, context):
    """Функция для обработки команды /about"""
    await update.message.reply_text("Я бот, созданный для обучения. Моё назначение - служить вам!")
    
# Добавляем обработчики
app.add_handler(CommandHandler("help", help_command))
app.add_handler(CommandHandler("about", about_command))

Теперь пользователь сможет написать /help или /about, и бот ответит соответствующими сообщениями.


Типичные ошибки и их исправление

Как и в любом проекте, можно столкнуться с проблемами. Давайте разберем несколько распространенных ошибок.

Ошибка: Invalid token

Если вместо запуска бота вы увидели сообщение Invalid token, проверьте, правильно ли вы скопировали API токен. Убедитесь, что в токене нет лишних символов или пробелов.

Ошибка: Бот не отвечает

Если бот не отвечает на команды, проверьте:

  • Вы зарегистрировали обработчики для всех команд?
  • Используете ли вы правильные фильтры в MessageHandler?
  • Запущен ли ваш бот через app.run_polling()?

Ошибка: "Не могу повторить ваше сообщение"

Если бот не может ответить на текстовые сообщения, возможно, вы пытаетесь обрабатывать команды (например, /start) в обработчике текста. Убедитесь, что в фильтрах вы исключаете команды с помощью ~filters.COMMAND.


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

Этот простой бот уже можно использовать в небольших проектах. Например:

  • Создать справочного бота для выдачи информации по запросам.
  • Разработать чат-бота для тестирования пользовательских интерфейсов.
  • Использовать бота для общения в реальном времени в группах.

Дополнительное задание: сделаем бота более интересным

Попробуйте добавить в бота распознавание ключевых слов. Например:

  1. Если пользователь пишет "Привет", бот отвечает "Здравствуйте!".
  2. Если пользователь спрашивает "Как дела?", бот отвечает "Всё отлично, спасибо что спрашиваете!".

Для этого модифицируйте функцию echo:


async def echo(update: Update, context):
    """Ответ на текстовые сообщения с обработкой ключевых слов"""
    text = update.message.text.lower()
    
    if "привет" in text:
        await update.message.reply_text("Здравствуйте!")
    elif "как дела" in text:
        await update.message.reply_text("Всё отлично, спасибо что спрашиваете!")
    else:
        await update.message.reply_text(f"Вы написали: {text}")

Теперь бот будет немного умнее!


Ваш Telegram-бот готов. В следующей лекции мы научимся подключать нашего бота к FastAPI через вебхуки, чтобы обрабатывать сообщения более эффективно. Пока протестируйте вашего нового бота и подумайте, какие еще "фишки" можно добавить.

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