Расписание живёт в приложении ИТМО, а вся моя жизнь — в календаре: работа, секции, встречи, поездки. Каждую неделю я сверял одно с другим и почти каждый раз находил расхождение. В итоге сделал сервис, который превращает расписание в подписку: одна ссылка, и пары появляются в календаре сами. Сервис неофициальный: у ИТМО такой подписки нет, поэтому её сделал я.

Как было

Проще всего объяснить на примере. Однажды я приехал на пару на Кронверкский, а она оказалась перенесена на Ломоносова. Уведомление об этом, разумеется, не дошло: в приложении оно было написано мелким шрифтом где‑то в глубине экрана, а в моём календаре на это время стояла совсем другая пара. В тот день я пропустил занятие и решил, что так больше не хочу.

Проблема не в том, что расписание неудобное. Оно нормальное. Проблема в том, что оно живёт отдельно от всего остального: у расписания свой экран, у жизни свой календарь, и синхронизировать их приходится головой.

Что предлагают готовые решения

Я сделал то, что делает любой, кто уже написал в чаты и перерыл всё, что смог, в поиске: спросил у ИИ, как вытащить расписание ИТМО в календарь. Нашлось три варианта, и у каждого звёздочка.

  • Расширение для браузера. Работает, пока открыт браузер, и синхронизирует не всё. Что именно оно делает с вашими данными, придётся выяснять самому.

  • Чужой сервис на ddns. Полуживой: живёт на домашнем сервере у незнакомого человека, отвечает через раз, и никто не расскажет, что там внутри и что будет с расписанием завтра.

  • Репозиторий с GitHub. Можно развернуть самому. Только если у проекта последний коммит два года назад, а с тех пор набралась пачка CVE, патчить их, обновлять зависимости и следить за сервером теперь ваша работа.

Захотелось сделать по красоте: чтобы ничего не отваливалось. А раз проблема не только моя — решил поделиться.

Что я сделал

Сервис — rasp.ifmagic.ru. Он забирает ваше расписание из my.itmo.ru и отдаёт его в календарь двумя способами: подпиской (ICS) и read‑only CalDAV. Подключили ИТМО один раз, получили одну ссылку: она же подписка, она же вход в кабинет. Отдельного аккаунта нет, платить не нужно: я делал сервис для себя и не продаю его.

Как это выглядит у пользователя

  1. Открываете сайт и подключаете ИТМО. Два пути:

    • номер ИСУ и пароль — привычный вход, плюс код, если ИТМО его запросит;

    • свои токены сессии — если не хотите вводить учётку на стороннем сайте: токены берутся из браузера, где вы уже вошли в my.itmo, и пароль сервис не видит.

  2. Получаете ссылку и добавляете её в календарь: /ics — подписка, /dav — CalDAV.

  3. Дальше всё само.

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

Чем это отличается от приложения ИТМО

Честно: приложение ИТМО закрывает большинство задач. Если вам в нём удобно — сервис вам не нужен, это нормально.

Он для тех, кому расписание нужно в своём календаре: рядом с работой, семьёй, напоминаниями и умными часами. Ничего устанавливать не надо, и неважно, какой у вас календарь: Apple, Google, Яндекс, Thunderbird, DAVx⁵, Outlook, Nextcloud, OneCalendar или renCal. Для большинства из них на сайте есть пошаговые инструкции, а для остальных подойдёт общий порядок: подписка по ICS‑ссылке или read‑only CalDAV.

Ещё отличие — настройки. Расписание обновляется от 30 минут до 6 часов, по умолчанию 3 часа. Напоминания: выключить, за N минут до пары или умный режим, который ставит напоминание перед первой парой дня и после длинного перерыва.

Как это устроено

Адаптер: неофициальный вход в ITMO.ID через PKCE, чтение my.itmo.ru, рендер в ICS и read‑only CalDAV. Только чтение, записи в ИТМО нет.

  • RFC 5545. У каждого события SEQUENCE и DTSTAMP: изменение — новая ревизия, отмена — STATUS:CANCELLED на 48 часов, потом надгробие. Пары не воскресают и не дублируются.

  • CalDAV. Один объект на пару (RFC 4791), sync‑collection с надгробиями (RFC 6578), PROPFIND с Depth, calendar‑query с time‑range. Клиент докачивает только изменившееся.

  • Кэш и sendfile(2). Лента и коллекция рендерятся один раз и лежат файлами: отдача идёт ядром, без копирования в userspace; клиенту отвечают ETag, 304 и Range. На стенде — 10 300 запросов в секунду на попадании, рост примерно 10×.

  • Дедупликация. Аккаунт один на ИСУ, задачи клеймятся через FOR UPDATE SKIP LOCKED, интервал — самый частый из ссылок: один поход в ИТМО вместо N.

  • Устойчивость. my.itmo лежит — лента отдаёт последнюю версию. Усечённый ответ не затирает расписание (freeze), паника воркера не роняет сервис, метрики — в Prometheus‑формате.

  • Стек. Go 1.27, stdlib‑first, distroless‑образ, одна PostgreSQL.

Про доступы и данные

Пароль от ИТМО не хранится: он нужен один раз при подключении, дальше работают токены, и они зашифрованы. Если вводить пароль не хочется вообще — подключайтесь токенами: сервис не увидит ни логина, ни пароля, вы передаёте свою текущую сессию.

Сервис видит только расписание. Оценки, персональные данные и всё остальное из кабинета ИТМО ему недоступны.

И персональные данные мы не запрашиваем: ни почты, ни телефона, ни ФИО. Только номер ИСУ, чтобы подключить расписание. ФИО в расписании — не наш сбор: имена преподавателей публичны, а само расписание студент и так видит в кабинете. Мы просто переносим пары в календарь.

А ещё у проекта есть репозиторий: там лежат наши аудиты — по безопасности и по производительности. Self‑assessment с находками, исправлениями и принятыми рисками, а не обещания. У остальных вариантов из списка выше единственный способ узнать, что внутри, — посмотреть руками.

Чего сервис не умеет

  • он неофициальный: не связан с ИТМО и не выдаёт себя за его сервис;

  • он не пишет в ИСУ и не меняет расписание, только читает;

  • это хобби‑проект без SLA: если расписание не обновилось — напишите, починю, но круглосуточной поддержки не обещаю;

  • напоминания в Google Календаре работают, но настраиваются глобально: Google не читает напоминания из самих событий, зато даёт включить одно на всю подписку в настройках календаря.

Оказалось, я не первый

Пока разбирался, наткнулся на любопытное. В 2022 году у ИТМО был внутренний конкурс проектов ITMO.FUTURE 3.0. Среди инициатив, под которые искали исполнителей, была ровно эта: «Синхронизация расписания с внешним календарём».

Её поддержали не как идею на будущее: инициатива заняла второе место по баллам, получила 12 голосов «за» при нуле «против», и решением экспертного совета от 14 апреля 2022 года на неё назначили исполнителя. В комментариях к оценкам прямо написано: «my.itmo уже работает в направлении данного проекта, есть технические сложности с реализацией», а исполнитель должен был работать в составе профильной команды.

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

С тех пор прошло больше четырёх лет. Официальной подписки на расписание для календарей у ИТМО до сих пор нет.

Не хочу злорадствовать и не думаю, что там ничего не делали: между «инициативу поддержали» и «работает у конкретного студента» лежит длинный путь. Но дело точно не в студенческой самодеятельности: официальный проект был, исполнителя назначили, поддержку дали. А пока планы идут своим ходом, расписание нужно каждый день.

Что дальше

Планы без дат: уведомления о заменах, отдельные календари для пар и сессии, понятнее страница помощи.

А как было у вас? Расписание висело на стенде у деканата — или уже было электронным? Расскажите, как вы узнавали про переносы — и случалось ли искать нужную аудиторию по всему корпусу.

А для студентов первого неклассического сервис здесь: rasp.ifmagic.ru. Если что‑то не сойдётся при подключении — напишите в комментариях, помогу.


Дисклеймер. Сервис неофициальный и не связан с Университетом ИТМО. «ИТМО» и «my.itmo.ru» упоминаются только для описания совместимости; товарные знаки принадлежат правообладателям.

Комментарии (2)


  1. stackshortlist
    16.10.2026 15:07

    Подписка через ссылку кажется самым правильным форматом, потому что календарь сам подтягивает переносы и не нужно ничего импортировать заново. Единственный нюанс, который встречал в похожих сервисах: некоторые календари обновляют подписки довольно редко, иногда раз в сутки, и срочный перенос пары может не успеть подтянуться. Как вы решаете эту проблему, или пользователям приходится мириться с задержкой?


    1. pod7686 Автор
      16.10.2026 15:07

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

      На стороне сервиса: по умолчанию расписание обновляется раз в 3 часа, но в кабинете частоту можно поставить на 30 минут (это минимум). То есть данные у нас не старше получаса.

      На стороне клиента: частоту опроса задаёт календарь. Мы отдаём подсказку REFRESH-INTERVAL на час, но клиент вправе её игнорировать. В Apple Календаре (macOS и iOS) можно открыть свойства подписки и выбрать автообновление вплоть до «каждые 5 минут» или вручную. Тогда перенос прилетает за считаные минуты.

      Единственное место, где повлиять нельзя, это Google Календарь: внешние ICS-подписки он опрашивает по своему расписанию (обычно раз в несколько часов, иногда реже) и пользовательской настройки частоты там нет. Это ограничение платформы, а не сервиса.

      Итого: если нужна максимальная оперативность, берите Apple Календарь (или CalDAV-клиент вроде DAVx⁵) и ставьте обновление раз в 5-15 минут, сервер при этом настроен на 30 минут. Худший случай тогда около получаса, обычно быстрее.