rasp

0
README.md

SSTU Schedule to ICS Converter

Веб-сервис для конвертации расписания СГТУ (https://rasp.sstu.ru) в формат iCalendar (ICS) для интеграции с Google Calendar и другими календарными приложениями.

Описание

Приложение позволяет подписаться на расписание преподавателей, групп и аудиторий СГТУ в любом календарном приложении, поддерживающем формат ICS. Сервис автоматически парсит HTML-страницы с сайта rasp.sstu.ru, преобразует их в формат iCalendar и кэширует данные в SQLite для обеспечения доступности даже при недоступности основного сайта.

Возможности

  • ✅ Автоматическое преобразование расписания в формат ICS
  • ✅ Поддержка расписания преподавателей, групп и аудиторий
  • ✅ Кэширование данных в SQLite (TTL: 1 час)
  • ✅ Автоматический fallback на кэшированные данные при недоступности сайта
  • ✅ Правильная настройка часового пояса (Europe/Saratov, UTC+4)

Технологии

  • FastAPI - современный асинхронный веб-фреймворк
  • BeautifulSoup4 + lxml - парсинг HTML
  • icalendar - генерация ICS файлов (RFC 5545)
  • httpx - асинхронный HTTP-клиент
  • SQLAlchemy + SQLite - ORM и кэширование
  • pytz - обработка часовых поясов
  • Docker - контейнеризация

Установка и запуск

Вариант 1: Запуск с Docker (рекомендуется)

Запустите сервис на доступном из интернета сервере или опубликуйте порт 8000 с вашего домашнего компьютера, через домашний роутер.

  1. Убедитесь, что установлены Docker и Docker Compose:

  2. Запустите контейнер:

  3. Сервис будет доступен по адресу:

    http://your-server:8000

Вариант 2: Запуск с Docker из исходного кода

  1. Убедитесь, что установлены Docker и Docker Compose:

  2. Клонируйте репозиторий и перейдите в директорию проекта:

  3. Запустите контейнер:

  4. Сервис будет доступен по адресу: http://localhost:8000

  5. Для запуска в фоновом режиме:

  6. Для остановки:

  7. Для автоматического обновления контейнера и перезапуска при изменении файлов исходного кода (для разработки):

Вариант 3: Локальный запуск (для разработки)

  1. Убедитесь, что установлен Python 3.11 или выше:

  2. Создайте виртуальное окружение:

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

  4. Запустите сервер:

  5. Сервис будет доступен по адресу: http://localhost:8000

Использование

API Endpoints

Получение расписания в формате ICS

Параметры:

  • type
    - тип расписания:
    teacher
    (преподаватель),
    group
    (группа),
    room
    (аудитория)
  • id
    - идентификатор из URL на сайте rasp.sstu.ru

Примеры:

Проверка сервиса

Пример:

Интеграция с Google Calendar

  1. Запустите сервис на доступном из интернета сервере или используйте локальный адрес
  2. Получите URL расписания в формате ICS (например:
    http://your-server:8000/schedule/teacher/12345.ics
    )
  3. Откройте Google Calendar
  4. Нажмите на "+" рядом с "Другие календари"
  5. Выберите "Добавить по URL"
  6. Вставьте URL и нажмите "Добавить календарь"

Google Calendar будет автоматически обновлять расписание периодически.

Интеграция с другими календарями

Apple Calendar (macOS/iOS):

  1. Откройте Calendar
  2. File → New Calendar Subscription
  3. Вставьте URL и нажмите Subscribe

Microsoft Outlook:

  1. Откройте Outlook
  2. Add Calendar → From internet
  3. Вставьте URL и нажмите OK

Thunderbird:

  1. Откройте Calendar
  2. New Calendar → On the Network
  3. Выберите iCalendar (ICS) и вставьте URL

Как найти ID для расписания

  1. Перейдите на сайт https://rasp.sstu.ru
  2. Найдите нужное расписание (преподавателя, группы или аудитории)
  3. Скопируйте ID из URL:
    • Для преподавателя:
      https://rasp.sstu.ru/rasp/teacher/12345
      → ID:
      12345
    • Для группы:
      https://rasp.sstu.ru/rasp/group/12345
      → ID:
      12345
    • Для аудитории:
      https://rasp.sstu.ru/rasp/room/101
      → ID:
      101

Структура проекта

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

Основные параметры настраиваются в

app/config.py
:

  • SARATOV_TZ
    - часовой пояс (Europe/Saratov, UTC+4)
  • DATABASE_URL
    - путь к базе данных SQLite
  • RASP_BASE_URL
    - базовый URL сайта расписания
  • CACHE_TTL
    - время жизни кэша (по умолчанию: 3600 секунд / 1 час)
  • HTTP_TIMEOUT
    - таймаут HTTP запросов (по умолчанию: 10 секунд)
  • ALLOWED_TYPES
    - разрешённые типы расписания

Кэширование и fallback

Сервис использует умную стратегию кэширования:

  1. При первом запросе данные загружаются с rasp.sstu.ru и сохраняются в кэш
  2. Последующие запросы в течение 1 часа обслуживаются из кэша (быстро)
  3. Если кэш устарел, сервис пытается загрузить свежие данные
  4. Если сайт недоступен, используются устаревшие данные из кэша с соответствующим заголовком
  5. База данных персистентна и сохраняется при перезапуске контейнера

Разработка

Просмотр логов

Просмотр базы данных

Тестирование

Troubleshooting

Ошибка 404: Invalid schedule type

Проверьте, что используется правильный тип:

teacher
,
group
или
room

Ошибка 503: Service Unavailable

  • Сайт rasp.sstu.ru недоступен
  • В кэше нет данных
  • Подождите и попробуйте снова

Неправильное время в календаре

Убедитесь, что часовой пояс настроен правильно (Europe/Saratov)

База данных не сохраняется при перезапуске Docker

Проверьте, что volume правильно примонтирован в docker-compose.yml

Лицензия

Этот проект создан для образовательных целей.

От автора

Проект реализован для студентов и преподавателей СГТУ.