Skip to content

Ximerixx/plapser

Repository files navigation

plapser

Парсер расписания ВГЛТУ - веб-приложение для получения расписания занятий студентов и преподавателей Воронежского государственного лесотехнического университета в удобном формате.

Проект создан для решения проблемы неудобного API университета, который отдает данные в виде HTML-таблиц. Plapser парсит эти данные и предоставляет их в JSON и ICS форматах, а также через удобный веб-интерфейс.


🚀 Возможности

Основные функции

  • 📅 Парсинг расписания студентов и преподавателей
  • 🔍 Поиск преподавателей - узнайте где и когда преподаватель ведет занятия
  • 👥 Поиск расписания групп - полное расписание для студенческих групп
  • 📱 Экспорт в календарь - получение расписания в формате ICS для импорта в календарные приложения
  • 🌓 Темная тема - переключение между светлой и темной темами интерфейса
  • Недельное расписание - получение расписания на всю неделю одним запросом

Форматы вывода

  • json - данные в формате JSON (один день)
  • json-week - данные в формате JSON (неделя)
  • ics - файл календаря iCalendar (один день)
  • ics-week - файл календаря iCalendar (неделя)

📦 Установка

Требования

  • Node.js (версия 14 или выше)
  • npm или yarn
  • VPS или любой сервер с доступом в интернет

Быстрая установка

1. Установка Node.js (опционально, если используете n)

(sudo) apt install curl git make -y
(sudo) curl -L https://bit.ly/n-install | bash -s -- -y

2. Клонирование репозитория

git clone https://github.com/Ximerixx/plapser.git
cd plapser

3. Установка зависимостей

npm install

4. Запуск сервера

node server.js

Сервер запустится на порту 3000.

Настройка порта

Если нужно изменить порт, отредактируйте server.js:

const port = 3000; // Измените на нужный порт

Настройка через reverse proxy (NGINX)

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 сервис (Debian/Ubuntu)

В репозитории есть готовый файл сервиса для systemd. Настройте его под свои нужды и активируйте:

sudo cp plapser.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable plapser
sudo systemctl start plapser

🎨 Веб-интерфейс

Главная страница - Генератор ссылок

URL: /gui

Интерактивный интерфейс для генерации ссылок на расписание с параметрами:

  • Выбор группы или преподавателя
  • Режим преподавателя/студента
  • Выбор формата вывода (JSON, JSON-неделя, ICS, ICS-неделя)
  • Выбор подгруппы (для студентов)
  • Выбор даты или "на завтра"
  • Копирование готовой ссылки

Поиск расписания группы

URL: /searchStudent

Поиск и просмотр расписания для студенческих групп:

  • Поиск по группе с автодополнением
  • Фильтр по подгруппе
  • Выбор даты или "на завтра"
  • Опция "Расписание на неделю" - получить расписание сразу на всю неделю
  • Отображение всех занятий с временем, аудиторией, преподавателем

Поиск преподавателя

URL: /searchTeacher

Поиск расположения и расписания преподавателя:

  • Поиск преподавателя с автодополнением
  • Выбор даты
  • Опция "Получить данные на неделю" - эффективное получение расписания на всю неделю одним запросом
  • Отображение всех занятий с временем, аудиторией, группой

Особенности:

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

🔌 API Endpoints

Генерация расписания для студентов

GET /gen

Параметры:

  • group (обязательный) - название группы (например: ИС2-244-ОБ)
  • type (обязательный) - формат вывода: json, json-week, ics, ics-week
  • date (опционально) - дата в формате YYYY-MM-DD
  • tomorrow (опционально) - 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-27

Генерация расписания для преподавателей

GET /gen_teach

Параметры:

  • teacher (обязательный) - ФИО преподавателя
  • type (обязательный) - формат вывода: json, json-week, ics, ics-week
  • date (опционально) - дата в формате YYYY-MM-DD
  • tomorrow (опционально) - 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=true

Поиск преподавателя (упрощенный API)

GET /searchTeach

Параметры:

  • teacher (обязательный) - ФИО преподавателя

Возвращает: JSON с расписанием на сегодня

Получение списков

GET /api/groups - получить список всех групп
GET /api/teachers - получить список всех преподавателей

Кэширование: Списки кэшируются на 1 час для оптимизации производительности.


📋 Формат данных

JSON ответ (один день)

{
  "2025-09-27": {
    "date": "27 сентября 2025",
    "dayOfWeek": "суббота",
    "lessons": [
      {
        "time": "13:40-15:10",
        "type": "лаб",
        "name": "Прикладные задачи программирования",
        "subgroup": "1",
        "groups": ["ИС2-244-ОБ"],
        "classroom": "104Комп/7к",
        "teacher": "Иванов И.И."
      }
    ]
  }
}

JSON ответ (неделя)

{
  "2025-09-27": { ... },
  "2025-09-28": { ... },
  "2025-09-29": { ... },
  ...
}

🎯 Особенности парсинга

Для студентов (parseStudent.js)

  • Парсинг расписания по группам
  • Фильтрация по подгруппам (1, 2 или все)
  • Определение типа занятия (лек., пр., лаб.)
  • Извлечение информации о преподавателе
  • Обработка случаев "Нет пар"

Для преподавателей (parseTeacher.js)

  • Парсинг расписания по ФИО преподавателя
  • Извлечение информации о группах
  • Определение аудиторий
  • Обработка случаев отсутствия занятий

🎨 Темная тема

Все веб-интерфейсы поддерживают переключение между светлой и темной темами:

  • Кнопка переключения в правом верхнем углу (🌙/☀️)
  • Сохранение предпочтений в localStorage
  • Синхронизация между страницами
  • Плавные переходы между темами

🛠️ Технологии

Backend

  • Node.js - runtime окружение
  • Express.js - веб-фреймворк
  • Axios - HTTP клиент для запросов к API университета
  • Cheerio - парсинг HTML (jQuery-подобный синтаксис)
  • ical-generator - генерация ICS файлов календаря
  • CORS - поддержка кросс-доменных запросов

Frontend

  • 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            # Документация

⚙️ Конфигурация

Переменные в server.js

const port = 3000;                    // Порт сервера
const TIMEZONE = "Europe/Moscow";     // Часовой пояс
const CACHE_TTL = 3600000;           // TTL кэша (1 час)

CORS настройки

По умолчанию настроен 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 час

🤝 Вклад в проект

Проект открыт для улучшений. Если нашли баг или хотите добавить функционал:

  1. Fork репозитория
  2. Создайте ветку для вашей фичи
  3. Сделайте commit изменений
  4. Создайте Pull Request

📄 Лицензия

WTFPL (Do What The Fuck You Want To Public License)

Вы можете делать с этим кодом что угодно.


👨‍💻 Автор

Проект создан студентом ВГЛТУ для студентов ВГЛТУ.

Мотивация: API университета отдает HTML-таблицы вместо нормальных данных, что неудобно для использования в мобильных приложениях и календарях. Этот проект решает эту проблему.


🔗 Полезные ссылки


💡 FAQ

Q: Почему расписание может быть неактуальным?
A: Данные берутся напрямую из КИС ВГЛТУ. Если там не обновлено, то и у нас не будет.

Q: Можно ли использовать для других университетов?
A: Нет, парсер заточен под структуру HTML КИС ВГЛТУ. Для других вузов нужна адаптация.

Q: Как часто обновляются списки групп и преподавателей?
A: Автоматически каждый час (TTL кэша).

Q: Поддерживается ли мобильная версия?
A: Да, весь интерфейс адаптивный и работает на мобильных устройствах.

Q: Можно ли экспортировать расписание в Google Calendar?
A: Да, используйте формат ics или ics-week и импортируйте файл в любой календарь.


Сделано с ❤️ и немного мата для ВГЛТУ

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published