🎓

Электронная очередь на сдачу лабораторных в Telegram

QueueBot для вуза: староста создаёт очередь, бот напоминает и выгружает список в Excel

Telegram-бот электронной очереди на сдачу лабораторных для вуза: студент записывается одной кнопкой, бот сам следит за порядком и напоминает, а список выгружается в Excel. Python, aiogram 3, PostgreSQL.

ЗавершёнNDA
3 роли
студент, староста, администратор: права подставляются из базы в каждый запрос
≤ 3 человек
перед студентом: с этого момента бот присылает уведомление о приближении очереди
15 мин
по умолчанию на чекин после начала мероприятия, потом не явившиеся помечаются

Задача

Перед сдачей лабораторных или зачётов группа обычно ведёт «список на сдачу» на бумаге или в чате. Кто-то записался и не пришёл, кто-то потерял очередь, преподавателю неясно, кто уже сдал. Староста тратит время на ручные правки и напоминания.

Нужна очередь, которая ведёт себя как система, а не как переписка. Староста создаёт мероприятие, студенты своей группы записываются сами, бот следит за порядком, зовёт следующего и отмечает неявившихся. Преподавателю нужен готовый список в удобном виде.

Решение

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: состояния диалогов и троттлинг хранятся в памяти, бот рассчитан на один экземпляр, схема создаётся при старте без миграций, доступ защищён одним общим инвайт-кодом. Другие детали заказчика не раскрываются.

Вопросы по проекту

Как организовать очередь на защиту работ в группе без бумажного списка?
Староста создаёт мероприятие в боте: предмет, дату, время начала и конца, число преподавателей. Студенты своей группы записываются одной кнопкой. Порядок хранится в базе данных, а не в переписке чата, и бот сам следит за ним.
Как студенты узнают, что их очередь подходит?
Когда перед студентом остаётся не более трёх человек, бот присылает уведомление и не повторяет его на той же позиции. Следующему в очереди приходит сообщение с кнопками «Готов идти» и «Пропустить». Студент может пропустить ход или встать в конец заново.
Что будет, если студент записался, но не пришёл?
В начале мероприятия бот рассылает чекин с кнопкой «Я здесь!». Кто не нажал её за 15 минут (значение по умолчанию настраивается), помечается как не явившийся. Староста при необходимости вручную поднимает, опускает или убирает записи в очереди.
Кто что может делать в боте?
Ролей три. Студент записывается в очередь своей группы, выходит из неё и смотрит свой статус. Староста создаёт и закрывает очереди, экспортирует список в Excel и делает объявления группе. Администратор блокирует пользователей, меняет группы и роли и рассылает сообщения всем или выбранной группе.
Можно ли получить список очереди для преподавателя в Excel?
Да. Староста выгружает очередь мероприятия в файл .xlsx, и преподаватель видит, кто сдал, а кто ждёт.
Где хранятся данные и что нужно знать при развёртывании?
Данные лежат в PostgreSQL, бот и база запускаются в Docker Compose. Схема создаётся автоматически при старте. Незавершённые диалоги хранятся в памяти и теряются при перезапуске, поэтому бот рассчитан на один экземпляр.

Нужно похожее?

Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.