Профессиональная разработка Telegram-ботов на Aiogram 3

Курс поможет перейти от интуитивного написания кода к осознанной разработке Telegram-ботов на фреймворке Aiogram 3. Опираясь на современные практики (включая материалы [mastergroosha.github.io](https://mastergroosha.github.io/aiogram-3-guide/) и [habr.com](https://habr.com/ru/articles/821661/)), вы глубоко изучите работу диспетчера, роутеров, мидлварей, интеграцию с API и масштабируемый деплой на сервер.

1. Архитектура и базовые концепции Aiogram 3

Архитектура и базовые концепции Aiogram 3

Переход от интуитивного написания кода с помощью ИИ-ассистентов (vibecoding) к осознанной инженерии начинается с понимания фундамента. Фреймворк Aiogram версии 3.x был полностью переписан по сравнению со второй версией. Он стал строго типизированным, полностью асинхронным и модульным. Чтобы бот не превратился в неподдерживаемый монолит при добавлении новых функций, необходимо разобраться, как именно данные проходят путь от серверов Telegram до вашей функции обработки.

В основе архитектуры Aiogram 3 лежат четыре главных компонента: бот, диспетчер, роутеры и мидлвари.

Разделение обязанностей: Bot и Dispatcher

В простых скриптах разработчики часто путают сущности, отправляющие сообщения, и сущности, принимающие их. В Aiogram эти роли строго разделены между двумя главными классами.

Bot — это ваши «руки». Этот объект отвечает исключительно за отправку запросов к Telegram Bot API. Когда вам нужно отправить сообщение, отредактировать кнопку или забанить пользователя, вы вызываете методы объекта Bot. Он ничего не знает о логике вашего приложения, его задача — просто передать данные на сервер Telegram и получить ответ.

Dispatcher (диспетчер) — это ваш «мозг». Это корневой узел, который принимает входящие события (Updates) от Telegram и решает, какой участок вашего кода должен на них отреагировать. Диспетчер не умеет сам отправлять сообщения, он занимается исключительно маршрутизацией.

> Диспетчер можно сравнить с главным менеджером ресторана. Когда поступает новый заказ (сообщение от пользователя), менеджер (Dispatcher) не идет готовить его сам. Он смотрит на тип заказа и передает его в нужный цех (Router), где конкретный повар (Handler) выполнит работу.

Базовая инициализация выглядит так:

Маршрутизация: Routers и Handlers

Когда проект растет, хранить все функции в одном файле становится невозможно. Для решения этой проблемы в Aiogram 3 была введена концепция роутеров.

Router (роутер) — это мини-диспетчер. Он позволяет группировать логику по смыслу и разносить её по разным файлам. Сам по себе Dispatcher является корневым роутером, к которому подключаются все остальные дочерние роутеры.

Handler (хэндлер) — это конечная асинхронная функция, которая выполняет полезную работу. Хэндлеры всегда привязываются к роутерам (или напрямую к диспетчеру) с помощью декораторов.

!Схема прохождения апдейта в Aiogram 3

Процесс поиска нужного хэндлера происходит строго последовательно:

  • Telegram присылает событие (например, текстовое сообщение).
  • Диспетчер принимает его и начинает опрашивать подключенные роутеры в том порядке, в котором они были зарегистрированы.
  • Роутер проверяет свои хэндлеры сверху вниз.
  • Как только находится хэндлер, чьи фильтры совпадают с событием (например, фильтр «текст равен '/start'»), поиск останавливается. Хэндлер выполняется, и остальные роутеры это событие уже не увидят.
  • Пример выноса логики в отдельный роутер:

    Чтобы этот код заработал, роутер нужно подключить к диспетчеру в главном файле с помощью метода dp.include_router(user_router).

    Невидимый щит: Middlewares

    Один из самых мощных, но редко понимаемых новичками инструментов — это Middleware (промежуточное ПО). Это код, который выполняется до или после того, как событие дойдет до хэндлера.

    Представьте, что вашему боту пишут 100 человек одновременно. В каждом хэндлере вам нужно проверить, не забанен ли пользователь, и получить данные о нем из базы данных. Если писать эти проверки внутри каждого хэндлера, код быстро превратится в нечитаемое дублирование.

    Мидлвари решают три глобальные задачи:

  • Перехват и блокировка: например, защита от спама (Throttling). Если пользователь пишет чаще 1 раза в секунду, мидлварь просто отбрасывает событие, и оно даже не доходит до хэндлера, экономя ресурсы сервера.
  • Обогащение данных: мидлварь может сходить в базу данных, достать профиль пользователя и передать его в хэндлер в готовом виде.
  • Логирование и обработка ошибок: запись всех действий пользователей в файл или систему мониторинга.
  • Аналогия из жизни: мидлварь — это служба безопасности в аэропорту. Прежде чем вы попадете в самолет (хэндлер), служба безопасности проверяет ваш билет (база данных) и багаж (антиспам). Если что-то не так, вас разворачивают, и пилот (хэндлер) о вас даже не узнает.

    Профессиональная структура проекта

    Понимание архитектуры фреймворка диктует то, как должны располагаться файлы на жестком диске. Разработка через ИИ часто приводит к созданию одного гигантского файла bot.py на 2000 строк. В production-разработке (когда продукт выпускается для реальных пользователей) применяется модульная структура.

    Сравним подходы к организации кода:

    | Характеристика | Любительский подход | Профессиональный подход | | :--- | :--- | :--- | | Хранение кода | Один файл main.py | Разделение на пакеты: handlers, keyboards, filters | | Настройки | Токены захардкожены в тексте | Использование переменных окружения (.env) и библиотек вроде pydantic-settings | | База данных | Прямые SQL-запросы в хэндлерах | Использование ORM (например, SQLAlchemy) и вынос логики БД в слой сервисов | | Тексты ответов | Вшиты прямо в логику | Вынесены в отдельные файлы локализации или словари |

    Стандартная структура масштабируемого бота выглядит следующим образом:

  • Папка bot/handlers/ — здесь лежат роутеры с логикой обработки сообщений, разбитые по смыслу (например, admin.py, user.py, payments.py).
  • Папка bot/keyboards/ — функции, генерирующие обычные и Inline-клавиатуры.
  • Папка bot/middlewares/ — классы для работы с базой данных и антиспамом.
  • Папка bot/filters/ — кастомные фильтры (например, проверка, является ли пользователь администратором).
  • Файл bot/main.py — точка сборки. Здесь инициализируются бот, диспетчер, база данных, подключаются роутеры и запускается приложение.
  • Такое разделение позволяет команде разработчиков работать над ботом одновременно, не мешая друг другу, а также легко находить и исправлять ошибки при росте нагрузок.

    Осознанное использование связки Bot-Dispatcher, грамотная маршрутизация через Routers и вынос общих проверок в Middlewares — это фундамент, на котором строятся отказоустойчивые Telegram-боты, способные выдерживать тысячи запросов в секунду.