Быстрый старт
Пример: урок на доске прямо на странице вашей платформы, за четыре шага.
1. Что вы получаете от нас
- ключ API вида
wbk_xxxxxxxx_…. Он показывается один раз. Храните его только на сервере, в переменной окружения; - пакет минут уроков;
- список ваших доменов, например
https://school.example.ru. Только с этих адресов урок покажется во фрейме, и только им он будет сообщать о событиях.
Адрес API: https://api.rismik.ru/api/partner/v1.
Сервис теперь называется «Рисмик» и живёт на rismik.ru. Старые адреса *.whiteboard.quest-practices.ru продолжают работать (API отвечает и там, сайт перенаправляет на новый), поэтому в уже готовых интеграциях ничего срочно менять не нужно — новые адреса можно подставить при следующем обновлении.2. Сервер: урок и ссылки участников
Урок создаётся один раз. external_id — ваш собственный идентификатор урока, по нему урок потом можно найти.
curl -X POST https://api.rismik.ru/api/partner/v1/lessons \
-H "Authorization: Bearer $WB_API_KEY" -H "Content-Type: application/json" \
-d '{"title": "Дроби, 5 класс", "external_id": "course-7/lesson-3"}'Перед каждым входом в урок сервер выдаёт человеку личную ссылку. Ссылка и есть его пропуск в урок: в ней роль (teacher или student) и имя.
curl -X POST https://api.rismik.ru/api/partner/v1/lessons/$LESSON_ID/links \
-H "Authorization: Bearer $WB_API_KEY" -H "Content-Type: application/json" \
-d '{"user": {"id": "42", "name": "Миша", "role": "student"}}'
# {"url": "https://rismik.ru/embed/eyJ…", "token": "eyJ…", "expires_at": "…"}То же самое через библиотеки.
Node:
import { WhiteboardPartner } from '@whiteboard-studio/partner'
const wb = new WhiteboardPartner({ apiKey: process.env.WB_API_KEY! })
const lesson = (await wb.findLesson('course-7/lesson-3')) ?? (await wb.createLesson({ title: 'Дроби, 5 класс', externalId: 'course-7/lesson-3' }))
const { url } = await wb.createLink(lesson.id, { id: String(user.id), name: user.name, role: user.isTeacher ? 'teacher' : 'student' })Python:
from whiteboard_partner import Client
wb = Client(api_key=os.environ["WB_API_KEY"])
lesson = wb.find_lesson("course-7/lesson-3") or wb.create_lesson("Дроби, 5 класс", external_id="course-7/lesson-3")
link = wb.create_link(lesson["id"], user_id=str(user.id), name=user.name, role="student")3. Страница: фрейм
<div id="lesson"></div>
<script src="https://rismik.ru/sdk/whiteboard.js"></script>
<script>
const lesson = Whiteboard.mount(document.getElementById('lesson'), {
url: LINK_FROM_YOUR_SERVER,
height: '80vh',
onEvent: (event) => {
if (event.type === 'wb:leave') history.back()
if (event.type === 'wb:minutes-exhausted') showBuyMinutes()
},
})
</script>Если подключаете фрейм без SDK, обязательно разрешите ему камеру и микрофон:
<iframe src="LINK" allow="camera; microphone; display-capture; fullscreen" style="width:100%;height:80vh;border:0"></iframe>На React используйте компонент <WhiteboardLesson url={link} onEvent={…} />. Подробнее в frame.md.
4. Вебхуки (по желанию)
Чтобы узнавать о начале и конце урока, о том, кто вошёл, и о балансе:
curl -X PUT https://api.rismik.ru/api/partner/v1/webhook \
-H "Authorization: Bearer $WB_API_KEY" -H "Content-Type: application/json" \
-d '{"url": "https://school.example.ru/hooks/whiteboard"}'
# {"url": "…", "secret": "whsec_…"} — секрет показывается один разПроверка подписи и список событий описаны в webhooks.md.
Как считаются минуты
- Урок идёт, пока в нём не меньше двух человек, на доске или в звонке. Преподаватель, который готовит доску один, минуты не тратит.
- Минуты списываются с пакета поминутно.
- Без минут новый урок не начнётся. Участник увидит «у платформы закончились минуты», а ваша страница получит событие
wb:minutes-exhausted. - Урок, который уже идёт, не прервётся. Баланс уйдёт в минус, и минус спишется со следующего пакета.
- За час до конца пакета придёт вебхук
balance.low, при нуле —balance.exhausted.
Проверить у себя
В папке packages/embed/demo лежит готовый пример «онлайн-школы» на Node без зависимостей. Как его запустить, написано в README.