通知与日历
更新于 27.10.2026
如何在没有每分钟询问API的情况下了解计划更改。 2026年10月23日与摊位d1核对;本页的方法也可在生产中使用。
选择什么
| 问题 | 比解决 |
|---|---|
| Google日历,Apple日历,Outlook中的时间表 | 订阅日历提要GET /calendar/schedule.ics |
| 日历中的考试和测试 | GET /session.ics |
| 报告更改的机器人或服务 | 民调结果GET /schedule/changes每隔几分钟 |
| 在家时间表的完整副本 | GET /schedule一两个小时的时间,比较updatedAt |
| 推送到浏览器 | 仅适用于应用程序本身VISH -见下文 |
日历提要
GET /calendar/schedule.ics返回iCalendar格式的计划,其过滤器与GET /schedule: group或groupId, teacher或teacherId, scope, dateFrom, dateTo,而lessonIds和subjectIds (只有这些课程或科目), locale (ru, en, zh)和attachment=1(给作为一个文件)。
- 您不需要钥匙:这是任何访客看到的相同时间表。
- 订阅地址-日历本身重读它,并拿起编辑,取消和删除。 每个活动都有一个常数
UID,所以更改更新事件,而不是添加第二个。 - 时间与时区(
DTSTART;TZID=Europe/Moscow:…). - 一个地址每分钟不超过60个请求。
https://d1.vish-app.ru/api/v1/calendar/schedule.ics?group=ШАД-111
GET /session.ics是相同的会话。:考试,测试和咨询小组或教师。
改变饲料
GET /schedule/changes -最近在一组的时间表中发生了什么变化(groupId)或教师(teacherId),从上面新。
period=recent(默认情况下)-最近的更改;limit-有多少。period=weeks-本周和下周的课程变化。- 记录在案:
lessonId,change(created,announced,updated,deleted),subject,room,startAt,endAt,changedFields,changes(菲尔德,曾经,成为),origin(institute-研究所的修订,source-新大学时间表)及createdAt.
如何投票:每5-15分钟一次,记忆id或createdAt最后处理的记录,并且只处理更新的记录。 答案来自period=weeks被缓存一分钟—更频繁地询问是毫无意义的。
在浏览器中推送
POST /push/subscriptions和POST /push/unsubscribe订阅应用程序的浏览器VISH通知有关组或教师的更改;订阅的公共蒸汽密钥在GET /app-config (push.publicKey). 这些方法是为应用而设计的VISH本身:订阅由其service worker创建。 更改feed对您的网站或机器人更方便。
示例:feed和更改
该示例下载组的日历提要,检查其格式和唯一性UID,然后阅读本周和下周的变化。 该组是VISH_GROUP,与ШАД-111默认情况下。
// The group's calendar feed and its recent changes; no key needed.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'
const GROUP = process.env.VISH_GROUP ?? 'ШАД-111'
const groups = await (await fetch(`${API}/groups?search=${encodeURIComponent(GROUP)}&all=1`)).json()
const group = groups.list.find((item) => item.name === GROUP)
if (!group) throw new Error(`group ${GROUP} not found`)
const feed = await fetch(`${API}/calendar/schedule.ics?group=${encodeURIComponent(GROUP)}`)
const calendar = await feed.text()
if (!feed.ok || !feed.headers.get('content-type')?.startsWith('text/calendar') || !calendar.startsWith('BEGIN:VCALENDAR')) {
throw new Error(`not a calendar: HTTP ${feed.status}`)
}
const uids = [...calendar.matchAll(/^UID:(.+)$/gmu)].map((match) => match[1].trim())
if (new Set(uids).size !== uids.length) throw new Error('duplicate UIDs')
const response = await fetch(`${API}/schedule/changes?groupId=${group.id}&period=weeks`)
if (!response.ok) throw new Error(`changes: HTTP ${response.status}`)
const changes = (await response.json()).list
if (!Array.isArray(changes) || changes.some((item) => !item.lessonId || !item.change || !item.createdAt)) {
throw new Error('unexpected changes answer')
}
console.log(`${GROUP}: ${uids.length} events in the feed, ${changes.length} changes this week and next`)
for (const item of changes.slice(0, 5)) {
console.log(`- ${item.createdAt.slice(0, 16)} ${item.change}: ${item.subject?.ru ?? item.lessonId} (${item.changedFields?.join(', ') ?? ''})`)
}尝试
当前周、调用网格和推送公钥:
试一试请求
只有带锁的方法需要密钥。密钥只保存在本页:不会被存储,只作为本次请求的请求头发送,离开页面后即被清除。 如何获取密钥
验证:2026-10,PWA aa337c45,平台bff65fce._