Парсер расписания ВГЛТУ - веб-приложение для получения расписания занятий студентов и преподавателей Воронежского государственного лесотехнического университета в удобном формате.
Проект создан для решения проблемы неудобного API университета, который отдает данные в виде HTML-таблиц. Plapser парсит эти данные и предоставляет их в JSON и ICS форматах, а также через удобный веб-интерфейс.
- 📅 Парсинг расписания студентов и преподавателей
- 🔍 Поиск преподавателей - узнайте где и когда преподаватель ведет занятия
- 👥 Поиск расписания групп - полное расписание для студенческих групп
- 📱 Экспорт в календарь - получение расписания в формате ICS для импорта в календарные приложения
- 🌓 Темная тема - переключение между светлой и темной темами интерфейса
- ⚡ Недельное расписание - получение расписания на всю неделю одним запросом
json- данные в формате JSON (один день)json-week- данные в формате JSON (неделя)ics- файл календаря iCalendar (один день)ics-week- файл календаря iCalendar (неделя)
- Node.js (версия 14 или выше)
- npm или yarn
- VPS или любой сервер с доступом в интернет
(sudo) apt install curl git make -y
(sudo) curl -L https://bit.ly/n-install | bash -s -- -ygit clone https://github.com/Ximerixx/plapser.git
cd plapsernpm installnode server.jsСервер запустится на порту 3000.
Если нужно изменить порт, отредактируйте server.js:
const port = 3000; // Измените на нужный портlocation / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}В репозитории есть готовый файл сервиса для systemd. Настройте его под свои нужды и активируйте:
sudo cp plapser.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable plapser
sudo systemctl start plapserURL: /gui
Интерактивный интерфейс для генерации ссылок на расписание с параметрами:
- Выбор группы или преподавателя
- Режим преподавателя/студента
- Выбор формата вывода (JSON, JSON-неделя, ICS, ICS-неделя)
- Выбор подгруппы (для студентов)
- Выбор даты или "на завтра"
- Копирование готовой ссылки
URL: /searchStudent
Поиск и просмотр расписания для студенческих групп:
- Поиск по группе с автодополнением
- Фильтр по подгруппе
- Выбор даты или "на завтра"
- Опция "Расписание на неделю" - получить расписание сразу на всю неделю
- Отображение всех занятий с временем, аудиторией, преподавателем
URL: /searchTeacher
Поиск расположения и расписания преподавателя:
- Поиск преподавателя с автодополнением
- Выбор даты
- Опция "Получить данные на неделю" - эффективное получение расписания на всю неделю одним запросом
- Отображение всех занятий с временем, аудиторией, группой
Особенности:
- При включении недельного режима показывается расписание на всю неделю
- При выключении - только на выбранный день
- Данные кэшируются для быстрой работы
GET /gen
Параметры:
group(обязательный) - название группы (например: ИС2-244-ОБ)type(обязательный) - формат вывода:json,json-week,ics,ics-weekdate(опционально) - дата в формате YYYY-MM-DDtomorrow(опционально) -trueдля получения расписания на завтраsubgroup(опционально) - номер подгруппы (1 или 2)
Примеры:
# JSON расписание на сегодня
/gen?group=ИС2-244-ОБ&type=json
# JSON расписание на неделю
/gen?group=ИС2-244-ОБ&type=json-week&date=2025-09-27
# ICS календарь на завтра для 1-й подгруппы
/gen?group=ИС2-244-ОБ&type=ics&tomorrow=true&subgroup=1
# ICS календарь на неделю
/gen?group=ИС2-244-ОБ&type=ics-week&date=2025-09-27GET /gen_teach
Параметры:
teacher(обязательный) - ФИО преподавателяtype(обязательный) - формат вывода:json,json-week,ics,ics-weekdate(опционально) - дата в формате YYYY-MM-DDtomorrow(опционально) -trueдля получения расписания на завтра
Примеры:
# JSON расписание преподавателя на сегодня
/gen_teach?teacher=Иванов%20И.И.&type=json
# JSON расписание на неделю
/gen_teach?teacher=Иванов%20И.И.&type=json-week&date=2025-09-27
# ICS календарь на завтра
/gen_teach?teacher=Иванов%20И.И.&type=ics&tomorrow=trueGET /searchTeach
Параметры:
teacher(обязательный) - ФИО преподавателя
Возвращает: JSON с расписанием на сегодня
GET /api/groups - получить список всех групп
GET /api/teachers - получить список всех преподавателей
Кэширование: Списки кэшируются на 1 час для оптимизации производительности.
{
"2025-09-27": {
"date": "27 сентября 2025",
"dayOfWeek": "суббота",
"lessons": [
{
"time": "13:40-15:10",
"type": "лаб",
"name": "Прикладные задачи программирования",
"subgroup": "1",
"groups": ["ИС2-244-ОБ"],
"classroom": "104Комп/7к",
"teacher": "Иванов И.И."
}
]
}
}{
"2025-09-27": { ... },
"2025-09-28": { ... },
"2025-09-29": { ... },
...
}- Парсинг расписания по группам
- Фильтрация по подгруппам (1, 2 или все)
- Определение типа занятия (лек., пр., лаб.)
- Извлечение информации о преподавателе
- Обработка случаев "Нет пар"
- Парсинг расписания по ФИО преподавателя
- Извлечение информации о группах
- Определение аудиторий
- Обработка случаев отсутствия занятий
Все веб-интерфейсы поддерживают переключение между светлой и темной темами:
- Кнопка переключения в правом верхнем углу (🌙/☀️)
- Сохранение предпочтений в localStorage
- Синхронизация между страницами
- Плавные переходы между темами
- Node.js - runtime окружение
- Express.js - веб-фреймворк
- Axios - HTTP клиент для запросов к API университета
- Cheerio - парсинг HTML (jQuery-подобный синтаксис)
- ical-generator - генерация ICS файлов календаря
- CORS - поддержка кросс-доменных запросов
- Vanilla JavaScript (ES6+)
- CSS3 с CSS переменными для тем
- Responsive дизайн
- Извлечение данных из HTML-таблиц КИС ВГЛТУ
- Регулярные выражения для валидации
- Обработка различных форматов данных
plapser/
├── server.js # Основной сервер Express
├── parser/
│ ├── parseStudent.js # Парсер расписания студентов
│ └── parseTeacher.js # Парсер расписания преподавателей
├── public/
│ ├── gui.html # Главная страница - генератор ссылок
│ ├── searchStudent.html # Поиск расписания групп
│ ├── searchTeacher.html # Поиск преподавателей
│ ├── gen.js # JavaScript для генератора
│ └── stylesheet.css # Общие стили с поддержкой тем
├── package.json # Зависимости проекта
└── README.md # Документация
const port = 3000; // Порт сервера
const TIMEZONE = "Europe/Moscow"; // Часовой пояс
const CACHE_TTL = 3600000; // TTL кэша (1 час)По умолчанию настроен CORS для https://durka.su. Измените при необходимости:
app.use(cors({
origin: 'https://your-domain.com',
methods: ['GET', 'POST', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization']
}));- API университета (kis.vgltu.ru) может быть медленным
- Формат названий групп:
XX#-###-XX(например: ИС2-244-ОБ) - При указании флага
tomorrowпараметрdateигнорируется - Списки групп и преподавателей кэшируются на 1 час
Проект открыт для улучшений. Если нашли баг или хотите добавить функционал:
- Fork репозитория
- Создайте ветку для вашей фичи
- Сделайте commit изменений
- Создайте Pull Request
WTFPL (Do What The Fuck You Want To Public License)
Вы можете делать с этим кодом что угодно.
Проект создан студентом ВГЛТУ для студентов ВГЛТУ.
Мотивация: API университета отдает HTML-таблицы вместо нормальных данных, что неудобно для использования в мобильных приложениях и календарях. Этот проект решает эту проблему.
- Официальный сайт ВГЛТУ: https://vgltu.ru
- КИС ВГЛТУ: https://kis.vgltu.ru
Q: Почему расписание может быть неактуальным?
A: Данные берутся напрямую из КИС ВГЛТУ. Если там не обновлено, то и у нас не будет.
Q: Можно ли использовать для других университетов?
A: Нет, парсер заточен под структуру HTML КИС ВГЛТУ. Для других вузов нужна адаптация.
Q: Как часто обновляются списки групп и преподавателей?
A: Автоматически каждый час (TTL кэша).
Q: Поддерживается ли мобильная версия?
A: Да, весь интерфейс адаптивный и работает на мобильных устройствах.
Q: Можно ли экспортировать расписание в Google Calendar?
A: Да, используйте формат ics или ics-week и импортируйте файл в любой календарь.
Сделано с ❤️ и немного мата для ВГЛТУ