Skip to main content
У цьому посібнику збирається повноцінний курс, який проходить усередині вашого Telegram-бота: уроки з відео та зображеннями, матеріали для друку, квізи, запитання та завдання. Курс чекає на підписника на кожному кроці й іде далі лише після того, як він натисне кнопку, відповість на запитання або здасть завдання. Порядок дій:
  1. Створіть продукт
  2. Завантажте файли в Telegram і зареєструйте їх
  3. Створіть кроки
  4. Налаштуйте, коли надсилається кожен крок
  5. Увімкніть продукт

Перед початком

Знадобиться:
  • API-токен — див. Авторизація.
  • ID бота — зі Список ботів.
  • Токен бота з @BotFather — лише для завантаження файлів зі скрипта. API його ніколи не повертає (лише token_hint).
  • Ви запустили бота — Telegram-акаунт, прив’язаний до вашого користувача Zenedu (власника API-токена), має хоча б раз натиснути Start у боті. Ендпоінти файлів перевіряють файл, надсилаючи його в цей чат, і інакше повертають 409.
  • Для файлів понад 50 МБ — або api_id і api_hash з my.telegram.org, щоб завантажувати їх зі скрипта, або людина, яка один раз надішле кожен такий файл боту. Див. Завантажте файли.
Приклади — це команди для терміналу. Спочатку задайте змінні; далі в кроках сказано, які з отриманих ID зберегти в нові змінні (PRODUCT_ID, OFFER_ID, …):
Надсилайте зі скриптів звичайний User-Agent. Запити зі стандартним user agent Python urllib блокуються Cloudflare з 403 (error 1010) ще до API. curl і більшість HTTP-бібліотек працюють як є.

1. Створіть продукт

Збережіть data.id як PRODUCT_ID. platform має бути bot — кроки є лише в продуктів для бота. Новий продукт вимкнений, ви ввімкнете його на кроці 5, коли контент буде готовий.

2. Завантажте файли

Вкладення кроків зберігаються на серверах Telegram. API не приймає завантаження файлів — він приймає Telegram file_id файлу, завантаженого цим ботом. Файли прикріплюються до кроків у два етапи: завантажте файл у Telegram, потім зареєструйте його через Зареєструвати або запросити файл, щоб отримати ID для telegram_file_ids. Завантажити файл у Telegram можна трьома способами. Обирайте за розміром файлу й тим, що у вас є:
50 МБ — це ліміт лише завантаження через Bot API. До кроку можна прикріпити файли до 2 ГБ. Не стискайте й не перекодовуйте медіа, щоб вкластися в 50 МБ: для великих файлів використовуйте MTProto або надішліть файл боту. Якщо у вас немає ні api_id і api_hash, ні людини, яка надішле файл, запросіть щось одне з цього.
Щоб відео відтворювалися як відео, вони мають бути в MPEG4 (.mp4, наприклад відео H.264 зі звуком AAC). Інші формати Telegram може зберегти як document, і реєстрація такого файлу як video завершиться помилкою type_mismatch.
Надішліть файл через Bot API у свій чат із ботом, візьміть його file_id і видаліть повідомлення:
Для зображень використовуйте sendPhoto, для PDF та інших файлів — sendDocument. Для відео передавайте width, height, duration і supports_streaming, інакше Telegram може зберегти файл як document, і реєстрація його як video завершиться помилкою type_mismatch.У документів підписники бачать ім’я завантаженого файлу. Використовуйте зрозуміле ім’я: -F "document=@sheet.pdf;filename=Coloring page.pdf".
Не знаєте свій CHAT_ID? Один раз викличте Зареєструвати або запросити файл з порожнім тілом — у відповіді буде chat_id. Бот заразом попросить надіслати файл, це повідомлення можна проігнорувати.
Зареєструйте кожен file_id:
Збережіть data.id кожного файлу, наприклад як VIDEO_FILE_ID і IMAGE_FILE_ID. API перевіряє файл: надсилає його у ваш чат і одразу видаляє повідомлення, тому в чаті може щось промайнути. Зареєстровані файли залишаються в Список Telegram-файлів, доки ви їх не прикріпите. Файли прив’язані до користувача: ви бачите й прикріплюєте лише свої. Непотрібний файл видаляється через Видалити Telegram-файл.

3. Створіть кроки

Кроки створюються через Створити крок продукту. Кожен новий крок додається в кінець продукту. Усі типи кроків: Урок із відео та зображенням:
У відповіді — створений крок. Збережіть його data.id (тут як LESSON_STEP_ID): ID кроків знадобляться для кнопок і sending_time.
Завжди передавайте sending_time. Якщо його не передати, крок отримає never і ніколи не буде надісланий автоматично — у курсі він пропускається. Усі варіанти — на кроці 4.

Текст

text — це HTML, такий самий, як видає редактор в особистому кабінеті. <p> і <br> перетворюються на переноси рядків. Теги форматування передаються в Telegram: <b>/<strong>, <i>/<em>, <u>, <s>, <a href="…">, <code>, <pre>, <blockquote>, <tg-spoiler>. Інші теги видаляються, а їхній текст залишається — наприклад, списки (<ul>, <li>) перетворюються на звичайні рядки. Обмеження довжини:
  • 4096 символів — звичайне повідомлення.
  • 1024 символи — коли в кроку є вкладення і settings.attach_file дорівнює true (текст надсилається як підпис до медіа). З attach_file: false (за замовчуванням) текст іде окремим повідомленням після медіа, і діє ліміт 4096.
  • 300 символів — poll і quiz (запитання).

Вкладення

telegram_file_ids приймає ID з кроку 2. Кілька вкладень надсилаються разом альбомом. Переданий набір замінює вкладення кроку; щоб прибрати один файл, використовуйте Видалити вкладення кроку.

Запитання

subtype — одне з text, number, email, phone, name. Відповідь перевіряється за ним; за неправильного формату підписник отримує question_error_message і може спробувати ще раз. Якщо його не задати, використовується стандартне повідомлення мовою бота. save_profile: true зберігає відповідь name, email або phone у профіль підписника.

Опитування та квізи

  • 2–12 варіантів, кожен до 100 символів.
  • У quiz має бути рівно один is_correct: true, інакше 422 options.
  • quiz_explanation (до 200 символів) показується після відповіді.
  • У poll немає правильної відповіді.

Завдання

Кнопка здачі створюється автоматично з назвою мовою бота — не додавайте її самі. Підписник натискає її й надсилає роботу в чат.
  • task_autocheck: true — завдання приймається під час здачі, і курс одразу йде далі.
  • task_autocheck: false — завдання чекає на перевірку в Список завдань; курс продовжиться після того, як ви приймете його.

4. Налаштуйте, коли надсилається кожен крок

У кожного кроку є sending_time. Крок планується, коли надіслано попередній; перший крок — коли підписник отримує доступ до продукту. Коли саме, вирішує sending_time.option: Задайте його під час створення кроку або пізніше через Оновити час надсилання:
На підписника чекає лише stop. З будь-яким іншим варіантом наступний крок планується одразу після надсилання попереднього — навіть якщо підписник ще не відповів на запитання й не здав завдання. Якщо в усіх кроків immediately, увесь курс прийде одразу.

Чекати на підписника: stop

Що вважається дією на попередньому кроці: У message і lesson власної дії немає — додайте їм кнопку:
stop приймається, лише якщо в попереднього кроку вже є дія. Інакше запит завершиться помилкою 422 sending_time — «Select the action in the previous step». Перший крок продукту не може бути stop.
Тому порядок важливий. Або:
  • створюйте кроки по одному: після кожного message чи lesson додайте йому кнопку, потім створіть наступний крок зі stop; або
  • створіть усі кроки з immediately, додайте кнопки, потім переключіть кроки 2…N на stop через Оновити час надсилання.
Типовий курс:

Через час: duration

Затримка відраховується від моменту надсилання попереднього кроку, а для першого кроку — від моменту отримання доступу. delay_type — seconds, minutes, hours або days. Після текстового question є один виняток: якщо підписник відповідає до закінчення затримки, відлік починається заново з моменту відповіді. Відповіді на опитування й квізи та здані завдання на затримку не впливають. Щоб повідомлення не приходили вночі чи у вихідні, додайте вікно надсилання (delay_limit, див. нижче).

У заданий час доби: time

  • З delay_time береться лише час доби, дата ігнорується. Передавайте його зі зміщенням — див. Часовий пояс.
  • delay_number — через скільки днів після надсилання попереднього кроку: 0 — того самого дня в цей час або наступного дня, якщо цей час уже минув; 1 — наступного дня; і так далі.
  • delay_limit.weekdays обмежує дні: у недозволений день крок переноситься на найближчий дозволений день у той самий час. time_from і time_to для цього варіанта ігноруються.
Наприклад, «кожен урок наступного ранку о 10:00» — це time з delay_number: 1 на кожному уроці.

У дату: date

Крок надсилається всім підписникам в один і той самий момент — використовуйте це для запусків і живих подій. Передавайте delay_at зі зміщенням — див. Часовий пояс.
  • Під час збереження активного кроку delay_at має бути в майбутньому, інакше 422 sending_time — «Change the sending time to a date in the future».
  • Підписник, який дійшов до кроку після цієї дати, отримує його одразу. З skip_past_date: true крок натомість пропускається, і підписник переходить до наступного.

Вікно надсилання: delay_limit

Обмежує duration певними годинами й днями (для time застосовуються лише дні):
  • time_from і time_to — хвилини від півночі в часовому поясі проєкту: 540 — це 09:00, 1260 — 21:00. Враховуються лише цілі години: 570 (09:30) працює як 09:00.
  • time_from більше за time_to — нічне вікно, наприклад 1320–360 (22:00–06:00).
  • time_from, що дорівнює time_to, означає будь-який час доби; тоді діють лише weekdays.
  • weekdays: mon, tue, wed, thu, fri, sat, sun — хоча б один.
  • Якщо крок випадає за межі вікна, він переноситься на найближчий момент, коли вікно відкрите в дозволений день.
  • Вікно «будь-який час у всі сім днів» рівнозначне відсутності вікна й не зберігається.

Не надсилати автоматично: never

Крок у курсі пропускається: підписники не отримують його після попереднього кроку, і наступний крок іде одразу за попереднім. Це значення за замовчуванням, якщо sending_time не передано.

Часовий пояс

Розклад рахується в часовому поясі вашого проєкту (в особистому кабінеті: Налаштування → Проєкт → Основне → Часовий пояс; якщо не задано — UTC): час доби для time, а також години й дні delay_limit. delay_at і delay_time — значення дати й часу. Значення без зміщення читається як UTC, тому передавайте зміщення часового поясу проєкту — наприклад, 10:00:00+02:00 для 10:00 за Києвом узимку. Для time час доби залишається фіксованим у часовому поясі проєкту цілий рік.

5. Увімкніть продукт

Коли продукт увімкнений, видайте підписникам доступ — див. Видати доступ до продукту.

Що потрібно пам’ятати

  • Мова стандартних текстів. Кнопка завдання, її повідомлення та стандартні помилки запитань створюються мовою бота. Відповіді API й повідомлення про помилки завжди англійською.
  • Файли прив’язані до користувача. Файли, зареєстровані з одним API-токеном, не можна прикріпити токеном іншого користувача.