- Создайте продукт
- Создайте уроки
- Настройте, когда открываются уроки
- Добавьте картинки
- Добавьте материалы
- Добавьте видео
- Сгруппируйте уроки в модули
- Включите продукт
- Опубликуйте приложение и веб-платформу
Перед началом
Понадобится:- API-токен — см. Авторизация.
- ID бота — из Список ботов. Приложение и веб-платформа принадлежат боту.
- Ваши файлы:
- картинки (обложки, картинки уведомлений) — JPG, PNG или WebP, до 20 МБ;
- материалы уроков — до 50 МБ: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, CSV, MP3, MP4, WAV, OGG, ZIP, RAR, JPG, JPEG, PNG, WebP;
- видео — файлы MP4 для загрузки или ссылки на видео YouTube, Vimeo или Bunny.
1. Создайте продукт
data.id как PRODUCT_ID. platform должен быть miniApp — это продукт приложения (тот же продукт работает и на веб-платформе). Названия продуктов уникальны в пределах бота: на повторяющееся название вернётся 422 name. Новый продукт выключен, вы включите его на шаге 8.
Необязательные настройки продукта:
- Описание — Обновить продукт с
description. - Обложка — Загрузить обложку продукта, multipart
file: JPG, PNG или WebP до 20 МБ. - Сообщение-приглашение — сообщение, которое подписчик получает в боте, когда получает доступ к продукту. Задаётся через Обновить приглашение в продукт:
invite_textиinvite_button(обязательные),invite_web_button(необязательный), стили кнопокprimary,successилиdanger. В сообщении есть кнопка, которая открывает приложение; веб-кнопка добавляется, только пока веб-платформа опубликована. Картинка для него — Загрузить картинку приглашения.
2. Создайте уроки
Уроки создаются через Создать урок. Каждый новый урок добавляется в конец продукта.data.id как LESSON_ID.
name— до 255 символов, показывается в списке уроков.text— содержимое урока в HTML: абзацы, жирный, курсив, ссылки, списки. До 4000 символов текста без учёта тегов.access_time— когда открывается урок, см. шаг 3. Если не передать, урок открывается сразу.settings— уведомление, которое отправляется при открытии урока, см. Уведомление об открытии урока.
lesson_ids в новом порядке), Дублировать урок, Выключить урок, Удалить урок.
3. Настройте, когда открываются уроки
У каждого подписчика своё расписание. Оно начинается, когда подписчик получает доступ к продукту. Когда для него открывается каждый урок, решаетaccess_time.type:
По порядку: after_previous
immediately первому уроку и after_previous остальным, чтобы курс шёл по одному уроку.
Через время: duration
delay_type — seconds, minutes, hours или days. Для «одного урока в день» дайте уроку N задержку N − 1 дней.
В дату: date
В заданное время суток: time
delay_time: сегодня, если это время ещё не прошло, иначе завтра. Используется только время суток; передавайте его со смещением (без него оно читается как UTC). delay_number для этого типа обязателен — передайте 0.
Вручную: never
Урок сам не открывается. Откройте его подписчику через Открыть уроки продукта:
access_time — например, чтобы выдать одному подписчику все уроки сразу.
Изменение расписания
Когда вы меняетеaccess_time или включаете и выключаете урок, расписание пересчитывается для подписчиков, у которых уже есть доступ. В идущий курс можно добавлять уроки и менять их порядок.
Когда подписчик проходит все уроки, продукт для него завершается.
Уведомление об открытии урока
Бот может отправлять сообщение, когда урок открывается подписчику. Передайтеsettings при создании или обновлении урока:
lesson_open_text— Telegram HTML;{{lesson_name}}и{{product_name}}заменяются названиями урока и продукта. Если пусто, используется стандартный текст на языке бота.lesson_open_buttonоткрывает приложение.lesson_open_web_buttonдобавляется, только пока веб-платформа опубликована.lesson_open_button_style,lesson_open_web_button_style—primary,successилиdanger.- Картинка для сообщения — картинка уведомления урока, см. шаг 4.
4. Добавьте картинки
Обе загружаются как multipart с однимfile: JPG, PNG или WebP до 20 МБ.
5. Добавьте материалы
Материалы — это файлы или ссылки, которые показываются под уроком. Добавляйте их через Добавить материал урока, по одному за запрос. Файл — multipartfile с необязательным отображаемым name (без него показывается имя файла):
name и url (http или https), без файла:
name, а для ссылок и url), Изменить порядок (media_ids в новом порядке) и Удалить.
6. Добавьте видео
У урока может быть не больше одного видео. Новое видео заменяет текущее.- Загрузить файл
- Ссылка на YouTube, Vimeo или Bunny
Файл загружается напрямую на видеохостинг по tus — протоколу загрузки с докачкой, а не через Zenedu API.1. Запросите загрузку через Создать загрузку видео. Загрузка должна завершиться до Ответ — Видео переходит из
file_size — точный размер файла в байтах:expires_at.2. Создайте tus-загрузку. Отправляйте все заголовки из upload.headers в каждом запросе:201 с заголовком Location. Это может быть путь (/tusupload/…) — тогда он относительно хоста из endpoint. Значения Upload-Metadata закодированы в base64 (filetype video/mp4, title).3. Отправьте файл:204 означает, что файл загружен. Любая tus-библиотека работает так же: передайте ей endpoint, заголовки и файл.4. Сообщите, что загрузка завершена, через Завершить загрузку видео:uploading в processing.5. Дождитесь обработки. Видео само проходит uploading → processing → ready, обычно за несколько минут. Проверяйте через Получить видео урока. ready — видео обработано и воспроизводится; failed — хостинг не смог обработать файл, загрузите его снова.7. Сгруппируйте уроки в модули
Модули — необязательные заголовки, которые группируют уроки в приложении и на веб-платформе. Создайте модуль через Создать модуль продукта:- Обновить модуль продукта —
nameиlesson_ids. Переданныеlesson_idsзаменяют уроки модуля. - Изменить порядок модулей продукта —
section_idsв новом порядке. - Удалить модуль продукта.
8. Включите продукт
9. Опубликуйте приложение и веб-платформу
Продукты и уроки показываются на двух платформах:
На обеих платформах одни и те же продукты и уроки, и добавлять в них продукты не нужно: в разделе Контент каждой платформы есть все включённые продукты приложения, к которым у подписчика есть доступ. Продукты для бота показываются там, только если в настройках платформы включён
show_bot_products.
Каждая платформа настраивается и публикуется отдельно: можно запустить только приложение, только веб-платформу или обе.
Черновик и опубликованная версия
У каждой платформы есть черновик и опубликованная версия. Изменения настроек, меню, профиля, логотипа и онбординга попадают в черновик, и подписчики видят их только после публикации. Продукты, уроки и их содержимое в черновик не входят — у подписчиков они меняются сразу.- Сначала вызовите Получить приложение или Получить веб-платформу: вызов подготавливает платформу, если она ещё не настроена, и возвращает
is_published,has_changes(черновик отличается от опубликованной версии),app_urlи настройки. - Измените черновик.
- Опубликуйте: Опубликовать приложение или Опубликовать веб-платформу.
DELETE …/publish). Черновик остаётся; подписчики, которые открывают неопубликованную платформу, видят её выключенной.
Настройки
Обновить настройки приложения и веб-платформы принимают одни и те же поля, которые задаются для каждой платформы отдельно:brand_name,open_button_name,appearance(system,light,dark),brand_color(#RRGGBB),disable_branding;show_bot_products— показывать в Контенте и продукты для бота;support_type(botилиlink) иsupport_text— пункт «Поддержка»;phone_login_enabled— только для веб-платформы: вход по номеру телефона.
Меню и профиль
У каждой платформы свои пункты меню и профиля: Контент, Магазин, Подписки, Поддержка и другие. Можно добавлять свои ссылки и пункт Магазин (создать пункт меню, создать пункт профиля, то же самое под/web), менять порядок, обновлять, переносить между меню и профилем и удалять ссылки. Подписчик без продуктов сначала попадает в Магазин, если в нём есть тарифы, иначе — в Контент.
Онбординг
Экраны онбординга показываются при первом открытии только приложения — см. Создать экран онбординга. У веб-платформы онбординга нет.Веб-адрес
У веб-платформы есть адрес на поддомене Zenedu. Изменить его можно через Обновить адрес:web_handle— 3–32 символа: строчные латинские буквы, цифры и дефисы, но не в начале и не в конце. Должен быть уникальным; некоторые имена зарезервированы.custom_domain_enabled— открывать веб-платформу на своём домене. Нужна платная подписка Pro, иначе запрос завершится ошибкой. Сам домен подключает поддержка: напишите в @zenedusupportbot.
app_url в Получить веб-платформу.
Что нужно помнить
- Уроки создаются выключенными. Передавайте
"active": trueили включайте их — иначе подписчики увидят пустой продукт. - Расписание начинается с получения доступа.
durationиtimeотсчитываются от момента получения доступа, а не от предыдущего урока. Чтобы уроки шли один за другим, используйтеafter_previous. - Видео готово не сразу. Загруженное видео сначала в
uploading, потом вprocessing, и воспроизводится, когда перейдёт вready.