Edu Schedule
Telegram-бот с расписанием вуза: данные из API университета, кеширование и нечёткий поиск группы. 1 100+ активных пользователей за семестр.
Стек
- Python
- aiogram
- SQLite
- nginx
Задача
На момент разработки расписание публиковалось студентам в PDF. Чтобы посмотреть пары, нужно было найти нужный документ, отыскать в нём свою группу, сопоставить чётность недели и разобрать таблицу с телефона. Бот сокращал этот путь до нажатия одной кнопки, а данные брал напрямую из API вуза.
Решение
Бот забирает расписание из API вуза, проверяет и кеширует данные и отдаёт занятия на любой день, учитывая чётность недели и сетку звонков конкретной группы. Группа выбирается нечётким поиском по названию: при ошибочном вводе бот показывает похожие варианты, и пользователь выбирает нужный.
Архитектура
API вуза
Актуальное расписание из официального API
Проверка
Проверка корректности и полноты
Форматирование
Приведение к единому формату
Кеш
Кеш: быстрые ответы и меньше запросов к API
Ответ бота
Ответ с актуальным расписанием
Обновление каждые 10 минут
Расписание всегда актуально
Ключевые технические решения
- Кеш между ботом и API вуза: одинаковые запросы не уходят наружу повторно. Ответ приходит быстрее, а нагрузка на источник ниже.
- Поиск группы по расстоянию Левенштейна: при неточном вводе бот показывает ближайшие названия, из которых пользователь выбирает нужное.
Получение данных
Бот автоматически получает актуальное расписание из API университета. Данные проверяются на корректность и полноту, приводятся к единому формату и кешируются: нагрузка на API ниже, ответы быстрее.
Выбор группы
При первом запуске бот просит ввести название группы. Если студент ошибся или ввёл неточно, бот показывает ближайшие варианты, сравнивая названия по расстоянию Левенштейна, и нужный можно выбрать сразу из них. Группу можно в любой момент сменить через меню или вводом нового названия.

Меню и ближайшие дни
После выбора группы открывается меню, где основные действия доступны в одно нажатие. Кнопки «Сегодня», «Завтра» и «Послезавтра» собирают занятия выбранного дня в одно сообщение. Если занятие проходит онлайн в Zoom, бот добавляет данные конференции и кнопку «Войти», чтобы подключиться одним нажатием без ручного ввода.

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

Календарь
В календаре можно листать месяцы и выбрать конкретную дату. Бот сразу покажет расписание на этот день. Кнопка «Убрать» удаляет сообщение с календарём, чтобы он не копился в переписке.

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

Информация о дисциплинах
Отдельный раздел со списком всех дисциплин студента. Каждое название кликабельно: по нажатию открывается карточка с ФИО преподавателя, его почтой, кабинетами и данными для входа в Zoom.

Рассылки
Через бота рассылались важные сообщения студентам: можно было быстро предупредить об изменениях в расписании, объявлениях и других новостях. Бот работал не только как справочник расписания, но и как канал оперативной связи. Через рассылку также отправлялись итоговые сообщения: например, в конце семестра бот присылал статистику использования и список самых активных групп.

Результаты
- За семестр студенты открыли через бота расписание 36 000+ раз при 1 100+ активных пользователях.
- Кеширование сократило повторные обращения к API вуза и ускорило ответы бота.
Метрики
- открытий расписания за семестр
- 36 000+
- активных пользователей
- 1 100+