Начнем с простого. Все 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.
Практическое применение
Этот простой бот уже можно использовать в небольших проектах. Например:
- Создать справочного бота для выдачи информации по запросам.
- Разработать чат-бота для тестирования пользовательских интерфейсов.
- Использовать бота для общения в реальном времени в группах.
Дополнительное задание: сделаем бота более интересным
Попробуйте добавить в бота распознавание ключевых слов. Например:
- Если пользователь пишет "Привет", бот отвечает "Здравствуйте!".
- Если пользователь спрашивает "Как дела?", бот отвечает "Всё отлично, спасибо что спрашиваете!".
Для этого модифицируйте функцию 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 через вебхуки, чтобы обрабатывать сообщения более эффективно. Пока протестируйте вашего нового бота и подумайте, какие еще "фишки" можно добавить.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ