Электронная очередь на сдачу лабораторных в Telegram
QueueBot для вуза: староста создаёт очередь, бот напоминает и выгружает список в Excel
Telegram-бот электронной очереди на сдачу лабораторных для вуза: студент записывается одной кнопкой, бот сам следит за порядком и напоминает, а список выгружается в Excel. Python, aiogram 3, PostgreSQL.
Задача
Перед сдачей лабораторных или зачётов группа обычно ведёт «список на сдачу» на бумаге или в чате. Кто-то записался и не пришёл, кто-то потерял очередь, преподавателю неясно, кто уже сдал. Староста тратит время на ручные правки и напоминания.
Нужна очередь, которая ведёт себя как система, а не как переписка. Староста создаёт мероприятие, студенты своей группы записываются сами, бот следит за порядком, зовёт следующего и отмечает неявившихся. Преподавателю нужен готовый список в удобном виде.
Решение
QueueBot — Telegram-бот для записи студентов в электронные очереди на сдачу работ и зачётов. Что реализовано:
- регистрация по общему инвайт-коду, затем ФИО и номер группы; уникальность ФИО проверяется внутри группы;
- три роли: студент, староста, администратор; заблокированные пользователи в меню не допускаются;
- несколько учебных групп: студенты видят очереди только своей группы;
- очередь: запись, выход, пропуск хода, повторная постановка в конец, состав очереди, экран «Мой статус»;
- чекин «Я здесь!» в начале мероприятия и пометка не явившихся;
- умные уведомления, когда перед студентом остаётся не более трёх человек;
- пошаговое создание очереди старостой: предмет, дата, время, число преподавателей, подтверждение; отмена командой
/cancel; - ручное управление порядком: поднять, опустить, убрать из очереди; объявления группе текстом или фото;
- выгрузка очереди в Excel;
- рассылки администратора всем или одной группе со счётчиком доставленных и заблокированных;
- скрытая команда
/versionтолько для главного администратора.
Как это устроено
Роли через middleware в aiogram
Middleware (промежуточный слой) в aiogram 3 — код, который выполняется перед каждым обработчиком. Здесь он берёт роль пользователя из базы и подставляет её в запрос, поэтому студент физически не видит меню старосты, а заблокированный пользователь не попадает в меню вообще. Главный администратор задаётся отдельной настройкой и выдаёт права другим командой /admin_add. Есть и защита от частых нажатий: не чаще одного запроса в 0,5 секунды на пользователя.
Диалоги на конечном автомате (FSM)
Регистрация и создание очереди проходят по шагам. Для этого используется FSM (конечный автомат: бот помнит, на каком шаге находится диалог). Состояния хранятся в памяти процесса, поэтому при перезапуске незавершённые диалоги теряются.
Чекин по расписанию: APScheduler
Фоновые задачи запускает APScheduler. Каждую минуту бот проверяет, не начались ли мероприятия (окно плюс-минус две минуты), и рассылает чекин. Раз в пять минут срабатывает тайм-аут чекина: не подтвердившие присутствие помечаются как не явившиеся. Раз в две минуты проверяются умные уведомления по начавшимся мероприятиям.
Умные уведомления о приближении очереди
Когда перед студентом остаётся не более трёх человек, бот присылает уведомление. Оно не повторяется, пока студент остаётся на той же позиции. Следующий в очереди получает отдельное сообщение с кнопками «Готов идти» и «Пропустить».
Выгрузка очереди в Excel
Модуль экспорта формирует файл .xlsx через библиотеку openpyxl. Староста выгружает список кнопкой, преподаватель получает таблицу с порядком записи и статусами.
Данные: SQLAlchemy async и PostgreSQL
База — PostgreSQL 15, доступ через SQLAlchemy 2.0 в асинхронном режиме и драйвер asyncpg. Основные сущности: пользователь, предмет, мероприятие, запись в очереди. Таблицы создаются автоматически при старте. Бот и база запускаются через Docker Compose, часовой пояс контейнеров задан явно, поэтому время в логах, чекине и уведомлениях совпадает с московским. В логах включена ротация файлов.
Результат
- Очередь хранится в базе, а не в переписке, и студенты видят только очереди своей группы.
- Бот сам рассылает чекин, зовёт следующего и помечает не явившихся.
- Староста управляет порядком вручную, если нужно; администратор управляет пользователями и группами и делает рассылки.
- Преподаватель получает выгрузку очереди в Excel.
- Автотестов в репозитории нет, приёмка ручная.
Технологии: что и зачем
- Python 3.11 и aiogram 3 — асинхронный Telegram-бот: меню, роли, конечный автомат диалогов.
- SQLAlchemy 2.0 (async) и asyncpg — работа с базой без блокировки бота.
- PostgreSQL 15 — хранение пользователей, предметов, мероприятий и записей в очередях.
- APScheduler — чекин, тайм-аут неявки и умные уведомления по расписанию.
- openpyxl — выгрузка очереди в файл Excel.
- Docker Compose — запуск бота и базы одной командой.
Статус
Версия 1.0.1 от 30 сентября 2026 года. Репозиторий queue-bot признан единственным актуальным; он вырос из ранних репозиториев ocheredyV2 (версия 2.1.0, февраль 2026) и botocheredy, которые больше не развиваются и переведены в архив. Известные ограничения по README: состояния диалогов и троттлинг хранятся в памяти, бот рассчитан на один экземпляр, схема создаётся при старте без миграций, доступ защищён одним общим инвайт-кодом. Другие детали заказчика не раскрываются.
Вопросы по проекту
Как организовать очередь на защиту работ в группе без бумажного списка?
Как студенты узнают, что их очередь подходит?
Что будет, если студент записался, но не пришёл?
Кто что может делать в боте?
Можно ли получить список очереди для преподавателя в Excel?
Где хранятся данные и что нужно знать при развёртывании?
Ещё по этому направлению
Финансовый ассистент: учёт денег из PDF-выписок в Telegram
собственный продукт: бот и веб-дашборд, выписки четырёх банков, Gemini
Тикет-система для IT-отдела в Telegram
для музейного комплекса в Москве: заявки, учёт техники, база знаний и аналитика
Tech Poly VPN: биллинг VPN-подписок в Telegram
собственный продукт: оплата по СБП, выдача ключей в Marzban, резервный бот во ВКонтакте
Нужно похожее?
Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.