Тренажёр «Телеграм-боты на Python»: задания с проверкой
Телеграм-бот на Python и aiogram: как устроен Bot API, обработчики и фильтры, клавиатуры и кнопки, диалог с состояниями, структура проекта, база данных, ошибки и лимиты, запуск на сервере.
Как тренироваться
Полный тренажёр повторяет темы после сданной домашней работы: выбирает задания по результатам, показывает ошибки и помогает закрепить материал. Для сохранения результатов нужен аккаунт.
Попробуйте задания без регистрации
Где поставить обработчик без условия @dp.message()?
Что происходит с сообщением, которое не подошло ни под один обработчик?
Что можно повторить
- Как устроен бот: Bot API, токен, обновления
Понимать, что бот — это программа, которой Телеграм передаёт сообщения через Bot API; регистрировать бота у BotFather и обращаться с токеном как с паролем; знать, что всё приходит обновлениями с номерами и хранится около суток; выбирать между опросом и вебхуком и не запускать две программы с одним токеном.
- Первый бот: Bot, Dispatcher и async
Готовить проект в своём виртуальном окружении; понимать роли Bot, Dispatcher и обработчика в минимальном боте; писать асинхронные обработчики с await и не блокировать бота обычным ожиданием; знать, что обработчики проверяются сверху вниз, проверять наличие текста и перезапускать бота после правки.
- Обработчики и фильтры
Ловить команды и их аргументы; отбирать сообщения волшебным фильтром F по тексту и виду, сочетая условия через &, | и ~; различать человека (from_user) и чат (chat), понимать режим приватности в группах; ставить частные обработчики выше общих, держать страховку в конце и проверять доступ по номеру.
- Ответы: текст, оформление, фото
Выбирать между answer, reply и send_message и понимать, когда нет входящего сообщения; оформлять ответы в режиме HTML и экранировать всё, что прислал человек; держаться пределов длины и не засыпать чат сообщениями, показывать работу над долгим ответом; отправлять фото по file_id и принимать присланные фото и подписи.
- Клавиатуры и кнопки
Различать обычную клавиатуру (нажатие — текст) и встроенную (нажатие — callback с данными); строить главное меню и кнопку телефона; ловить нажатия встроенных кнопок, отвечать callback.answer() и менять сообщение; держать данные кнопки в 64 байтах латинскими кодами «приставка:номер»; собирать клавиатуры построителем и проверять данные кнопок как ввод человека.
- Диалог с состояниями
Понимать, зачем шаг диалога хранится для каждого человека отдельно; описывать шаги группой состояний, переводить между ними и ловить ответы фильтром состояния; собирать данные, проверять ответы и оставлять человека на шаге при ошибке, очищать состояние в конце и давать выход /cancel; выбирать хранилище: память для учёбы, Redis для рабочего бота, итоги — в базу.
- Проект: роутеры, файлы и секреты
Раскладывать обработчики по роутерам и подключать их в правильном порядке; держать проект по файлам тем без циклических импортов; хранить токен и настройки в .env, читать их через os.getenv с проверкой при запуске и не пускать секреты в репозиторий; вести тестового двойника бота, requirements.txt и README.
- Данные: SQLite в боте
Понимать, почему итоги работы бота хранят в базе, а не в памяти, состоянии или файле; создавать таблицы при запуске и задавать правила в самой базе (UNIQUE вместо проверки в коде); писать запросы только с параметрами, сохранять изменения и обрабатывать занятое время; держать SQL в одном файле, знать, когда нужен aiosqlite, и делать проверенные копии.
- Ошибки и лимиты
Знать приблизительные пределы частоты Телеграма и что бывает при их превышении; делать рассылку с паузой, ожиданием retry_after и учётом заблокировавших, фоном и с итогом; ставить общий обработчик ошибок, который пишет в журнал и отвечает человеку, и различать безобидные ошибки и настоящие; вести журнал с ротацией без секретов и личных данных и оповещать владельца сводкой.
- Бот на сервере
Выбирать VPS с Linux и запускать бота от отдельного пользователя; переносить бота на сервер: код из репозитория, секреты отдельно, пробный запуск и остановка локальной копии; описывать службу systemd с автозапуском и перезапуском, пользоваться status и journalctl; обновлять из коммита с проверкой и откатом, присматривать за ботом и понимать, когда нужен вебхук.