Приложение ВИШ — расписание РУТ (МИИТ)

Расписание Российского университета транспорта для студентов и сотрудников всех институтов. Расписание своей группы и любого преподавателя на день и на неделю, свободные аудитории МИИТ прямо сейчас, загруженность аудиторий, групп и преподавателей, уведомления об изменениях в расписании и ИИ-помощник по расписанию.

Институты

Приложение РУТ (МИИТ) охватывает пять институтов: ВИШ — Высшая инженерная школа, АГА — Академия гражданской авиации, АДХ — Академия дорожного хозяйства, ПИШ — Передовая инженерная школа «Академия ВСМ» и ИМТК — Институт международных транспортных коммуникаций. Расписание группы и расписание преподавателя ищутся одинаково в любом из них.

Что умеет приложение ВИШ
Разделы
Руководство

API заметок

Обновлено 27.10.2026

В ВИШ два вида заметок: заметки к занятию, которые преподаватель или сотрудник оставляет для всей группы, и личные заметки, которые человек пишет только для себя. Через API они доступны по-разному. Сверено со стендом d1 23 октября 2026 года; методы этой страницы есть и на production.

Заметки к занятию

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

МетодЧто делаетКто может
GET /schedule/{id}/notesЗаметки одного занятияВсе
POST /schedule/{id}/notesДобавить заметкуПраво schedule:note:create
POST /schedule/{id}/notes/attachmentsЗагрузить файл для заметки (до 10 МБ, по одному)Право schedule:note:create
PATCH /schedule/notes/{noteId}Изменить заметкуПраво schedule:note:update
DELETE /schedule/notes/{noteId}Удалить заметкуПраво schedule:note:delete

У заметки: id, lessonId, content (Markdown как написан), contentL10n (переводы), attachments, author, createdAt, updatedAt. Сколько заметок у занятия, видно и в самом расписании — поле notesCount.

Писать заметки ключом можно: ключ преподавателя с отмеченными правами schedule:note:* действует как сам преподаватель. Файл сначала загружают отдельным запросом, а в заметку передают то, что вернула загрузка. Картинки сохраняются в WebP; PDF, офисные документы и текст — как файлы для скачивания; другое не принимается (415).

Такой запрос публикует настоящую заметку, которую увидит вся группа, — пробуйте на занятии своей группы на d1:

bash
curl -X POST "$VISH_API/schedule/$LESSON_ID/notes" \
  -H "X-Api-Key: $VISH_API_KEY" -H "Content-Type: application/json" \
  -d '{"content": "Homework: exercises 1–5, page 42"}'

Токен «Входа через ВИШ» с разрешением notes:read читает только GET /schedule/{id}/notes.

Личные заметки

Заметка, которую видит только её автор: GET, POST /personal-notes, GET, PATCH, DELETE /personal-notes/{noteId} и загрузка файлов POST /personal-notes/attachments.

Не удалось загрузить список методов APIОткрыть справочник API (откроется в новой вкладке)

Проверить это своим ключом — запрос ничего не меняет и должен получить отказ:

// Personal notes belong to the person in the app: a key is refused with 403 SESSION_REQUIRED.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'
const KEY = process.env.VISH_API_KEY
if (!KEY) throw new Error('set VISH_API_KEY')

const response = await fetch(`${API}/personal-notes`, { headers: { 'X-Api-Key': KEY } })
const body = await response.json()
if (response.status !== 403 || body.error?.code !== 'SESSION_REQUIRED') {
	throw new Error(`expected 403 SESSION_REQUIRED, got ${response.status} ${JSON.stringify(body)}`)
}
console.log('refused as designed:', body.error.code)

Пример: заметки к занятиям группы

Пример находит занятия группы с заметками (notesCount > 0) и читает заметки первого из них. Группа — в VISH_GROUP, по умолчанию ШАД-111.

// Find a group's lessons that carry notes and read the notes of one; no key needed.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'
const GROUP = process.env.VISH_GROUP ?? 'ШАД-111'

const get = async (path) => {
	const response = await fetch(`${API}${path}`)
	if (!response.ok) throw new Error(`${path}: HTTP ${response.status}`)
	return response.json()
}

const lessons = (await get(`/schedule?group=${encodeURIComponent(GROUP)}&all=1`)).list
if (lessons.length === 0) throw new Error(`no lessons for ${GROUP}`)
const withNotes = lessons.filter((lesson) => lesson.notesCount > 0)
const lesson = withNotes[0] ?? lessons[0]

const notes = await get(`/schedule/${lesson.id}/notes`)
if (!Array.isArray(notes.list) || notes.list.some((note) => note.lessonId !== lesson.id)) {
	throw new Error('unexpected notes answer')
}
console.log(`${GROUP}: ${lessons.length} lessons, ${withNotes.length} with notes`)
console.log(`${lesson.date.slice(0, 10)} ${lesson.subject.ru}: ${notes.list.length} notes`)
for (const note of notes.list) console.log('-', note.content.slice(0, 80), `(${note.attachments.length} files)`)

Реакции

GET /schedule/{id}/reactions — реакции на занятие, открыто всем; GET /reactions/config — какие реакции разрешены. Поставить или снять свою реакцию (POST /schedule/{id}/reactions) можно только после входа — ключом тоже, особого права не нужно.

Попробовать

Подставьте id занятия из GET /schedule:

Попробовать запрос

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

Проверено: 2026-10, PWA aa337c45, platform bff65fce.