Однажды мы интегрировали вебинары в LMS с 2000 студентов: преподаватель вручную создавал встречи, забывал включить запись, а посещаемость приходилось сверять по скриншотам. После автоматизации через API административные затраты сократились на 8 часов в неделю. Такой подход не только экономит время, но и исключает ошибки человеческого фактора — студенты получают ссылки вовремя, записи доступны сразу после вебинара, а журнал посещаемости заполняется автоматически.
Как выбрать видеоплатформу для LMS?
| Платформа | API | Self-hosted | Запись | Посещаемость | Особенности |
|---|---|---|---|---|---|
| Zoom | REST API, Webhooks | Нет | Облачная | Через webhook | Стандарт, широкий API, хорошая запись |
| BigBlueButton | REST API (checksum) | Да | Да | Детальные логи | Специально для образования, whiteboard, breakout rooms |
| Jitsi Meet | REST API (Jibri) | Да | Да | Через webhook | Бесплатный, полный контроль |
| Daily.co | REST API + SDK | Нет | Нет | Встроенный | Встраиваемый видеозвонок прямо в LMS |
| Whereby | REST API | Нет | Нет | Нет | Простая встройка, iframe |
BigBlueButton — рекомендуется для образовательных LMS: встроенный whiteboard, polls, breakout rooms, запись с разбивкой по участникам. Self-hosted. Zoom — если клиенты уже им пользуются и не хотят менять привычки. Daily.co — если нужно встроить видео прямо в интерфейс LMS без перехода на внешний сайт.
Как автоматизировать создание вебинаров?
Интеграция с Zoom API — один из самых прямых путей. Ниже — пример класса на JavaScript, который создаёт встречу с автоматической записью и настройками ожидания.
class ZoomIntegration { constructor(accountId, clientId, clientSecret) { this.tokenUrl = 'https://zoom.us/oauth/token'; this.apiUrl = 'https://api.zoom.us/v2'; this.credentials = { accountId, clientId, clientSecret }; } async getAccessToken() { const response = await fetch(this.tokenUrl, { method: 'POST', headers: { 'Authorization': `Basic ${Buffer.from(`${this.credentials.clientId}:${this.credentials.clientSecret}`).toString('base64')}`, 'Content-Type': 'application/x-www-form-urlencoded', }, body: `grant_type=account_credentials&account_id=${this.credentials.accountId}`, }); const data = await response.json(); return data.access_token; } async createMeeting({ topic, startTime, durationMin, agenda, hostEmail }) { const token = await this.getAccessToken(); const response = await fetch(`${this.apiUrl}/users/${hostEmail}/meetings`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ topic, type: 2, start_time: startTime.toISOString(), duration: durationMin, agenda, settings: { host_video: true, participant_video: false, waiting_room: true, auto_recording: 'cloud', mute_upon_entry: true, approval_type: 0, }, }), }); return response.json(); } } Для BigBlueButton подход другой — используется checksum-подпись запросов. Пример на PHP:
class BigBlueButtonService { private string $url; private string $secret; public function createMeeting(string $meetingId, string $name, array $options = []): array { $params = array_merge([ 'meetingID' => $meetingId, 'name' => $name, 'record' => 'true', 'autoStartRecording' => 'false', 'allowStartStopRecording' => 'true', 'webcamsOnlyForModerator' => 'false', 'lockSettingsDisableMic' => 'false', ], $options); $queryString = http_build_query($params); $checksum = sha1('create' . $queryString . $this->secret); $params['checksum'] = $checksum; $response = Http::get("{$this->url}/api/create", $params); return $response->json(); } public function getJoinUrl(string $meetingId, string $fullName, string $role, string $userId): string { $password = $role === 'moderator' ? $this->moderatorPw : $this->attendeePw; $params = "meetingID={$meetingId}&fullName=" . urlencode($fullName) . "&password={$password}&userID={$userId}"; $checksum = sha1('join' . $params . $this->secret); return "{$this->url}/api/join?{$params}&checksum={$checksum}"; } } Что даёт трекинг посещаемости через webhooks?
Автоматический трекинг через webhooks решает проблему подделки посещаемости. Zoom Webhooks отправляют события meeting.participant_joined и meeting.participant_left. BigBlueButton предоставляет детальные логи через Recording API. Мы сохраняем время входа и выхода каждого студента, вычисляем длительность присутствия и формируем отчёт.
app.post('/webhooks/zoom', async (req, res) => { const { event, payload } = req.body; if (event === 'meeting.participant_joined') { await db.webinarAttendance.upsert({ webinarId: payload.object.id, userId: await findUserByEmail(payload.object.participant.email), joinedAt: new Date(payload.object.participant.join_time), }); } if (event === 'meeting.participant_left') { await db.webinarAttendance.update({ webinarId: payload.object.id, userId: await findUserByEmail(payload.object.participant.email), }, { leftAt: new Date(payload.object.participant.leave_time), durationMin: payload.object.participant.duration, }); } res.status(200).json({ status: 'ok' }); }); Записи вебинаров
После окончания вебинара Zoom/BBB генерирует запись. Процесс:
- Webhook
recording.completed→ получаем ссылку на скачивание - Скачиваем и загружаем в S3 (Zoom хранит записи ограниченное время)
- Создаём видеоурок в LMS со ссылкой на запись
- Уведомляем студентов, пропустивших вебинар
async function processWebinarRecording(meetingId, downloadUrl, token) { const s3Key = `recordings/${meetingId}.mp4`; const response = await fetch(downloadUrl, { headers: { Authorization: `Bearer ${token}` } }); await s3.upload({ Bucket: process.env.S3_BUCKET, Key: s3Key, Body: response.body }).promise(); const videoUrl = `https://${process.env.CDN_DOMAIN}/${s3Key}`; await db.webinars.update({ meetingId }, { recordingUrl: videoUrl }); await notifyAbsentStudents(meetingId, videoUrl); } Встроенный видеозвонок через Daily.co
Если нужно встроить видео прямо в LMS без перехода на внешнюю страницу:
import DailyIframe from '@daily-co/daily-js'; function WebinarRoom({ roomUrl, token }) { const callFrame = useRef(null); useEffect(() => { callFrame.current = DailyIframe.createFrame({ url: roomUrl, token, iframeStyle: { width: '100%', height: '600px' }, }); callFrame.current.on('participant-counts-updated', ({ present }) => { trackAttendance(present); }); callFrame.current.join(); return () => callFrame.current.destroy(); }, [roomUrl]); return <div id="daily-container" />; } Сценарии использования: сравнение платформ
| Сценарий | Рекомендуемая платформа | Причина |
|---|---|---|
| Курс с 50+ студентами, нужны whiteboard и polls | BigBlueButton | Специализирована для образования, self-hosted, детальная статистика |
| Корпоративное обучение, уже используется Zoom | Zoom | Миграция не требуется, стандартный API |
| Встраивание видео прямо в интерфейс | Daily.co | Лёгкий SDK, не требует перехода на внешний сайт |
Типичные ошибки при интеграции
Развернуть список
- Не настроены webhooks — встреча создана, но события не приходят.
- Отсутствует обработка повторных попыток при ошибках API (rate limit).
- Не учтена смена часового пояса при планировании встреч.
- Запись не загружается, если не обработан webhook
recording.completed. - Пароли для модератора и участника перепутаны в BigBlueButton.
Что входит в работу
- Интеграция API выбранной платформы (Zoom/BBB/Jitsi).
- Автоматическое создание вебинаров по расписанию.
- Отправка ссылок студентам (email/уведомления).
- Запись вебинаров и загрузка в S3/CDN.
- Трекинг посещаемости с отчётами.
- Документация API и инструкция для администраторов.
- 1 месяц технической поддержки.
Процесс работы
- Анализ требований: выбор платформы, настройка API, согласование схемы потоков данных.
- Проектирование: проектирование webhook-хендлеров, схемы хранения записей и посещаемости.
- Реализация: интеграция через API, кодирование, написание тестов.
- Тестирование: проверка создания встреч, webhook-ов, записи, посещаемости.
- Деплой и обучение: развёртывание на сервере, инструкция для администраторов.
Сроки ориентировочно
Интеграция с Zoom API: создание встреч, отправка ссылок студентам, базовая посещаемость — 4–5 дней. Запись вебинаров с загрузкой в S3 и уведомлениями — 2–3 дня. Self-hosted BigBlueButton с полной интеграцией и встройкой в LMS — 7–10 дней. Daily.co embedded-видео — 3–4 дня.
Опыт и гарантии
Мы выполнили более 30 интеграций с Zoom, BigBlueButton и Jitsi для LMS на Laravel, Node.js и Python. Наши инженеры сертифицированы по Zoom API. Гарантируем совместимость с любой современной LMS и предоставляем 1 месяц поддержки после деплоя.
Для точной оценки сроков и стоимости свяжитесь с нами — подберём оптимальную платформу под ваши задачи.
См. официальную документацию: Zoom REST API, BigBlueButton API.







