Одного разу ми інтегрували вебінари в 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.







