Перейти к содержимому
Digital Business BY · БЕЛАРУСЬ
НБ РБUSD2.9462EUR3.2801RUB0.0366PLN0.7465CNY0.4429Конвертер →
IT и стартапы

Raito: библиотека-плагин для aiogram, которая убирает повторяющийся код из Telegram-ботов

Разработчик вынес в открытую библиотеку всё, что приходилось копировать из проекта в проект: hot-reload, роли, пагинацию, FSM-сцены и троттлинг.

Казакевич Алексей
6 мин
Raito: библиотека-плагин для aiogram, которая убирает повторяющийся код из Telegram-ботов
Содержание · 3
  1. 01Что конкретно добавляет Raito
  2. 02Пагинация, FSM-сцены и диалоги
  3. 03Как подключить

Разработчик под ником Aidenable опубликовал на GitHub библиотеку Raito — плагин поверх aiogram3, который решает типовые задачи при разработке Telegram-ботов. Вместо того чтобы копировать одни и те же блоки кода между проектами, достаточно подключить одну зависимость.

Проект уже доступен с документацией на русском языке. Исходный код открыт: github.com/Aidenable/Raito.

Что конкретно добавляет Raito

Автор собрал в библиотеке функциональность, которой намеренно нет в aiogram — тот отвечает только за обёртку над Telegram Bot API. Raito берёт на себя всё остальное.

Hot-reload — пожалуй, самое востребованное улучшение. Раньше любое изменение кода требовало полного перезапуска бота. Теперь достаточно передать production=False при инициализации, и watchdog сам перезагрузит изменившиеся файлы.

Кастомные роутеры с приоритетами и динамической загрузкой. Можно задать priority=9999 для хэндлеров со сложной фильтрацией или отключить автозагрузку роутера при старте (autoload=False) и включать его вручную командой .rt load <name> прямо из чата с ботом.

Автоматическая регистрация команд в слэш-меню. Достаточно пометить хэндлер декоратором @rt.description("Описание") — Raito сам соберёт список и передаст его в Telegram. Поддерживается i18n через lazy_gettext.

RBAC-роли из коробки. Система поддерживает встроенные роли OWNER, ADMINISTRATOR, MODERATOR, DEVELOPER, а также кастомные. Фильтрация в хэндлере выглядит лаконично:

python @router.message(filters.Command("ban"), OWNER | ADMINISTRATOR | MODERATOR) async def ban(): ...

По умолчанию роли хранятся в памяти и сбрасываются при перезапуске. Для персистентности Raito предлагает JSONStorage, SQLiteStorage и PostgreSQLStorage — все три реализуют абстрактный класс aiogram.BaseStorage, поэтому их можно использовать и как основное хранилище FSM в самом aiogram.

Билдеры клавиатур в двух режимах. Статичный режим описывает разметку через вложенные списки строк — читается как таблица. Динамичный режим принимает параметры раскладки (1, 2 — одна кнопка в первом ряду, две во втором) и строит клавиатуру через стандартный InlineKeyboardBuilder.

Пагинация, FSM-сцены и диалоги

Serverless-пагинация — одна из нетривиальных задач в боте. Большинство библиотек требуют внешнего хранилища. Raito обходится без него: состояние страницы кодируется прямо в callback_data по схеме rt_p:<mode>:<name>:<page>:<total>:<limit>, укладываясь в лимит Telegram в 64 символа.

Доступно пять режимов: INLINE (текст + inline-кнопки), TEXT (только текст с навигацией), PHOTO (медиа с подписью), LIST (текст в виде отформатированного списка) и RICH (новый формат rich-сообщений, требует aiogram ≥ 3.30.0).

FSM-сцены расширяют стандартный механизм aiogram: добавляется валидация данных через SceneData (Pydantic-модель) и явная навигация — scene.next(), scene.retry(), scene.finish(), scene.goto(). Это делает сложные анкеты и мастера настройки читаемыми и поддерживаемыми.

**Диалоги (wait_for)** — упрощённая альтернатива FSM для прототипов и ботов с низким DAU. Весь диалог описывается внутри одного хэндлера:

python await message.answer("Enter username:") user = await raito.wait_for(state, F.text.regexp(r"@[\w]+"))

Автор честно предупреждает об ограничении: wait_for держит asyncio.Future и несовместим с SimpleEventIsolation. Для высоконагруженных ботов нужно использовать сцены.

Троттлинг настраивается как глобально для всего бота, так и на уровне отдельного хэндлера через @rt.limiter(rate_limit=5.0, mode="user"). Три режима: user (кулдаун на пользователя во всех чатах), chat (общий для чата) и bot (единый глобальный).

Как подключить

Инициализация занимает две строки поверх стандартного запуска бота:

python raito = Raito(dispatcher, "src/handlers") await raito.setup()

Первый аргумент — диспетчер aiogram для dependency injection и регистрации роутеров. Второй — путь к папке с хэндлерами. Raito сканирует её автоматически, поэтому single-file архитектура не поддерживается: каждый роутер должен лежать в отдельном файле.

Для разработчиков, которые хотят получить доступ к .rt-командам (перезагрузка роутеров, управление ролями, список команд), достаточно передать свой Telegram ID: Raito(developers=[12345678]). Флаг enable_dangerous_commands=True дополнительно разблокирует eval и bash прямо из чата — удобно для отладки, но очевидно не для продакшена.

Lifespan-хуки реализованы в стиле FastAPI: всё до yield выполняется при старте, всё после — при остановке бота. Это удобно для регистрации команд, подключения к базе данных и graceful shutdown.

Для белорусских разработчиков, которые активно пишут Telegram-ботов для внутренних инструментов, автоматизации или как MVP-продукты, Raito может сократить время на бойлерплейт и сосредоточить усилия на бизнес-логике. Библиотека молодая, но уже покрывает большинство типовых задач, с которыми сталкивается любой бот-разработчик.

ПоделитьсяVK

Свежие новости

Все новости
Концептуальная иллюстрация: Amazon SageMaker AI поддерживает разделение GPU для инференса в реальном времени
IT и стартапы

Amazon SageMaker AI поддерживает разделение GPU для инференса в реальном времени

Amazon SageMaker AI добавил поддержку разделения GPU на реальных эндпоинтах: технология NVIDIA MIG делит один ускоритель на до семи изолированных разделов, каждый со своей памятью и вычислительными ресурсами.

Редакция
1 мин
Концептуальная иллюстрация: Payments Apps API 2027-01: новый сигнал trusted vault origin для обработки карт без CVV
IT и стартапы

Shopify Payments Apps API 2027-01 получил сигнал trusted_vault_origin

В релиз-кандидате Payments Apps API версии 2027-01 появилось поле payment_method.data.trusted_vault_origin. Оно позволяет платёжным приложениям не отклонять транзакцию при отсутствии CVV, если карта поступила из хранилища, которому доверяет Shopify. Поле опциональное и требует отдельного включения со стороны Shopify.

Редакция
2 мин
Концептуальная иллюстрация: AWS Step Functions теперь можно подключать как инструменты для ИИ-агентов
IT и стартапы

AWS Step Functions теперь можно подключать как инструменты для ИИ-агентов

AWS Step Functions добавила поддержку использования рабочих процессов в роли инструментов для ИИ-агентов через Amazon Bedrock AgentCore Gateway. Агент самостоятельно решает, когда запустить процесс и какие данные передать, а Step Functions выполняет каждый шаг в заданном порядке.

Редакция
1 мин
Концептуальная иллюстрация: Shopify Flow теперь управляется через AI Toolkit
IT и стартапы

Shopify Flow теперь управляется через AI Toolkit

Shopify добавила в AI Toolkit поддержку управления рабочими процессами Flow. Агент может разбирать .flow-файлы, получать задачи и пути окружения, а также строить автоматизации — но только для собственного магазина и при наличии одобренного скоупа.

Редакция
1 мин
Концептуальная иллюстрация: Shopify Tax: управляемый режим вводит новые ограничения Admin API
IT и стартапы

Shopify Tax: управляемый режим вводит новые ограничения Admin API

Shopify Tax managed mode теперь влияет на поведение Admin API: часть запросов на запись проходит валидацию на соответствие требованиям управляемого режима. Затронуты приложения, работающие с рынками, товарами, черновыми заказами и оформлением заказа.

Редакция
2 мин
Концептуальная иллюстрация: GitHub Copilot Fusion научился выбирать между локальными и облачными моделями
IT и стартапы

GitHub Copilot Fusion научился выбирать между локальными и облачными моделями

GitHub выпустил экспериментальную функцию интеллектуальной маршрутизации для локальных моделей в Copilot Fusion. Теперь инструмент может автоматически выбирать между моделями на устройстве и облачными — без ручного переключения при каждом запросе.

Редакция
2 мин