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
Процесс поиска нужного хэндлера происходит строго последовательно:
Пример выноса логики в отдельный роутер:
Чтобы этот код заработал, роутер нужно подключить к диспетчеру в главном файле с помощью метода dp.include_router(user_router).
Невидимый щит: Middlewares
Один из самых мощных, но редко понимаемых новичками инструментов — это Middleware (промежуточное ПО). Это код, который выполняется до или после того, как событие дойдет до хэндлера.
Представьте, что вашему боту пишут 100 человек одновременно. В каждом хэндлере вам нужно проверить, не забанен ли пользователь, и получить данные о нем из базы данных. Если писать эти проверки внутри каждого хэндлера, код быстро превратится в нечитаемое дублирование.
Мидлвари решают три глобальные задачи:
Аналогия из жизни: мидлварь — это служба безопасности в аэропорту. Прежде чем вы попадете в самолет (хэндлер), служба безопасности проверяет ваш билет (база данных) и багаж (антиспам). Если что-то не так, вас разворачивают, и пилот (хэндлер) о вас даже не узнает.
Профессиональная структура проекта
Понимание архитектуры фреймворка диктует то, как должны располагаться файлы на жестком диске. Разработка через ИИ часто приводит к созданию одного гигантского файла 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-боты, способные выдерживать тысячи запросов в секунду.