Віджет — це інтерактивний компонент, вбудований безпосередньо в повідомлення бота: промокод із кнопкою копіювання, таймер зворотного відліку, трекер статусу замовлення, вікторина або календар для вибору дати й часу. Коли клієнт взаємодіє з віджетом, бот оновлює те саме повідомлення на місці — без надсилання нових повідомлень або показу позначки «відредаговано».

Є два способи надіслати віджет:
- Готовий шаблон — один рядок у Калькуляторі. Макет і функціональність уже реалізовані.
- Власний віджет — напишіть власний HTML-код (або попросіть Mavi створити його) і обробляйте взаємодії за допомогою блоків потоку бота.
Де працюють віджети
| Месенджер | Тільки Telegram |
| Тип чату | Тільки приватні чати між клієнтом і ботом |
| Не підтримується | Групи, канали, Telegram Business |
| Застосунок Telegram | Потрібна остання версія Telegram. Старіші версії показують повідомлення «Непідтримуване повідомлення» та підпис |
| Пересилання | Віджети не можна пересилати або копіювати |
Віджети не підтримують текстові поля введення або клавіатури. Клієнти можуть взаємодіяти лише натисканням. Якщо вам потрібно, щоб клієнти вводили текст, використовуйте звичайне запитання бота або Web App.
Віджети не відображаються у вікні тестування бота в панелі керування, оскільки це не Telegram. Тестуйте віджети безпосередньо в Telegram, надіславши повідомлення своєму боту.
Готові шаблони
Усі шаблони надсилаються за допомогою однієї функції:
tg_send_widget(platform_id, template, params, caption)
| Параметр | Опис |
|---|---|
platform_id |
ID отримувача. Для поточного клієнта використовуйте змінну platform_id
|
template |
Назва шаблону: promo, timer, order_status, faq, quiz, calendar
|
params |
Словник із налаштуваннями шаблону |
caption |
Текст, що відображається під віджетом. Клієнти також бачать його у списку чатів, у сповіщеннях і в старіших версіях Telegram, тому він має бути змістовним сам по собі |
Функція повертає відповідь Telegram API. ID надісланого повідомлення доступний у response['result']['message_id']. Збережіть його, якщо плануєте оновлювати віджет пізніше.
Якщо функція повертає текст замість відповіді Telegram, сталася помилка: невідомий шаблон, недійсний або відсутній параметр, або віджет перевищує ліміт розміру. Текст помилки пояснює, що пішло не так.
Як створити параметри
Створіть словник і призначте кожен параметр в окремому рядку:
p = {}
p["code"] = "WIDGET10"
p["title"] = "Ваш промокод"
p["note"] = "Знижка 10% на будь-яке замовлення"
w = tg_send_widget(platform_id, "promo", p, "Ваш промокод WIDGET10 — знижка 10%")
Введіть код у полі Калькулятор блоку. На скріншоті показано блок Стартова умова, який надсилає віджет статусу замовлення, коли клієнт надсилає фразу «віджет замовлення».

У блоці, який надсилає віджет, зазвичай встановлюють поле відповіді на #{none}. Блок не надсилає окреме текстове повідомлення, оскільки підпис віджета слугує текстом повідомлення.
Мова
Шаблони містять вбудований текст інтерфейсу, наприклад, підписи кнопок, назви місяців і днів тижня, «Час вийшов» та інші повідомлення.
Мова за замовчуванням у Mavibot — англійська (en).
Щоб використати іншу мову, вкажіть параметр lang:
p["lang"] = "de"
Підтримувані мови:
ru, en, de, es, fr, pt, tr, uk, kk, ms, th, ar.
Тексти, які ви надаєте самостійно — заголовки, запитання, кроки та підписи — відображаються точно так, як введені, і не перекладаються автоматично.
Промокод — promo
Відображає промокод із кнопкою, яка копіює його одним натисканням.

| Параметр | Опис |
|---|---|
code |
Промокод. Обов’язковий |
title |
Текст, що відображається над кодом |
note |
Текст, що відображається під кодом, наприклад, дата закінчення |
button |
Підпис кнопки. За замовчуванням: «Скопіювати промокод» |
used_text |
Текст, що відображається, коли код позначено як використаний |
p = {}
p["code"] = "WIDGET10"
p["title"] = "Ваш промокод"
p["note"] = "Знижка 10% на будь-яке замовлення"
p["button"] = "Скопіювати код"
w = tg_send_widget(platform_id, "promo", p, "Ваш промокод WIDGET10 — знижка 10%")
client.promo_widget_id = w['result']['message_id']
Щоб позначити код як використаний, що закреслює код і прибирає кнопку:
p = {}
p["used"] = 1
t = tg_edit_widget_data(platform_id, client.promo_widget_id, p)
Таймер зворотного відліку — timer
Відображає зворотний відлік до вказаної дати й часу.
Відлік працює на пристрої клієнта. Бот не бере участі в оновленні таймера.

| Параметр | Опис |
|---|---|
until |
Цільова дата й час у форматі "ДД.ММ.РРРР ГГ:ХВ", з урахуванням часового поясу проєкту |
seconds |
Альтернативно, кількість секунд від моменту надсилання віджета |
title |
Заголовок таймера. За замовчуванням: «Пропозиція закінчується через» |
done |
Текст, що відображається, коли відлік закінчується |
text |
Текст, що відображається під відліком |
button, url
|
Підпис кнопки та URL призначення (тільки https://) |
hide_button |
Встановіть 1, щоб приховати кнопку, коли відлік закінчується |
Ви повинні вказати або until, або seconds.
p = {}
p["seconds"] = 7200
p["title"] = "Пропозиція закінчується через"
p["button"] = "Відвідати сайт"
p["url"] = "https://salebot.pro"
w = tg_send_widget(platform_id, "timer", p, "Пропозиція закінчується через 2 години")
Коли відлік досягає нуля, боту не надсилається жодне повідомлення чи зворотний виклик. Якщо боту потрібно виконати дію, коли пропозиція закінчується, використовуйте звичайне таймерне з’єднання в потоці бота.
Статус замовлення — order_status
Відображає список етапів замовлення з виділеним поточним етапом.
Бот може оновлювати етап на місці, тому клієнт завжди бачить те саме повідомлення.

| Параметр | Опис |
|---|---|
title |
Заголовок віджета |
steps |
Список етапів, від 1 до 12. За замовчуванням: прийнято, готується, передано кур’єру, у дорозі, доставлено |
step |
Номер поточного етапу, починаючи з 1 |
text |
Текст, що відображається під етапами |
Надсилання віджета:
p = {}
p["title"] = "Статус замовлення"
p["steps"] = ["Прийнято", "Готується", "Доставлено"]
p["step"] = 1
p["text"] = "Ваше замовлення прийнято та готується"
w = tg_send_widget(platform_id, "order_status", p, "Ваше замовлення")
client.order_widget_id = w['result']['message_id']
Перехід до наступного етапу з будь-якого іншого блоку, наприклад, коли змінюється етап угоди, менеджер надсилає команду або спрацьовує таймер:
p = {}
p["step"] = 2
p["text"] = "Ваше замовлення готується і незабаром буде передано кур’єру"
t = tg_edit_widget_data(platform_id, client.order_widget_id, p)

Підпис під віджетом не змінюється під час оновлення етапу. Використовуйте нейтральний підпис, наприклад «Ваше замовлення», замість «Статус: Прийнято».
Часті запитання — faq
Відображає список запитань. Клієнти можуть натиснути на запитання, щоб розгорнути відповідь.

| Параметр | Опис |
|---|---|
title |
Заголовок віджета |
items |
Список пар запитання-відповідь. Обов’язковий |
p = {}
p["title"] = "Часті запитання"
p["items"] = [["Як я можу оплатити?", "Ви можете оплатити карткою. Посилання на оплату буде надіслано в цей чат."], ["Скільки триває доставка?", "Доставка зазвичай займає 1–2 дні по місту та 3–7 днів по країні."], ["Чи можу я повернути товар?", "Так, протягом 14 днів."]]
w = tg_send_widget(platform_id, "faq", p, "Відповіді на часті запитання")
Текст відображається як звичайний текст. HTML-теги та інша розмітка не обробляються.
Вікторина та опитування — quiz
Відображає запитання з варіантами відповідей, по одному запитанню за раз.
Якщо вказано правильні відповіді, віджет працює як вікторина та підраховує бали. Без правильних відповідей він працює як опитування.

| Параметр | Опис |
|---|---|
title |
Заголовок, що відображається над запитаннями |
questions |
Список запитань. Обов’язковий |
retry |
Встановіть 1, щоб відобразити кнопку «Спробувати ще раз» у кінці |
callback |
Власний текст зворотного виклику замість widget_quiz_finished
|
Кожне запитання — це словник, що містить:
-
q— текст запитання -
options— варіанти відповідей -
correct— правильна відповідь, вказана за індексом (починаючи з 1) або точним текстом
p = {}
p["title"] = "Вікторина: Перевірте свої знання"
p["retry"] = 1
p["questions"] = [{"q": "Скільки буде 2 + 2?", "options": ["3", "4", "5"], "correct": 2}, {"q": "Яка столиця Франції?", "options": ["Лондон", "Париж", "Берлін"], "correct": "Париж"}]
w = tg_send_widget(platform_id, "quiz", p, "Пройдіть вікторину з двох запитань!")
Щоб створити опитування без підрахунку балів, опустіть correct у кожному запитанні.
Правильні відповіді перевіряються платформою і не надсилаються на пристрій клієнта.
Що отримує потік бота
Відповіді на окремі запитання не надсилаються в розмову.
Коли клієнт відповідає на останнє запитання, бот отримує зворотний виклик widget_quiz_finished, і заповнюються такі змінні:
| Змінна | Значення |
|---|---|
widget_quiz_score |
Кількість правильних відповідей; порожньо для опитувань |
widget_quiz_total |
Загальна кількість запитань |
widget_quiz_answers |
Індекси вибраних варіантів, наприклад [2,2]
|
Щоб обробити результат, створіть з’єднання з блоку, який надіслав вікторину, або використовуйте блок Стартова умова з умовою widget_quiz_finished.
Приклад відповіді:
Ваш результат: #{widget_quiz_score} з #{widget_quiz_total} правильних відповідей

Календар — calendar
Відображає місячний календар, де клієнти можуть вибрати дату, а потім часовий слот.
Він замінює кілька сторінок із кнопками дати й часу, включаючи навігацію «Назад» і «Далі».

Календар підтримує три режими.
Власні дати та час
Доступний час завжди передається через параметр slots.
Однакові часові слоти щодня — надайте список часів і діапазон дат:
p = {}
p["title"] = "Виберіть дату та час"
p["name"] = "Консультація"
p["days"] = 10
p["slots"] = ["10:00", "12:00", "15:00"]
w = tg_send_widget(platform_id, "calendar", p, "Виберіть дату та час")
Різні часові слоти для конкретних дат — надайте словник, що зіставляє дати зі списками часів. Доступні дати беруться з ключів словника:
p = {}
p["slots"] = {"20.11.2026": ["10:00", "12:00"], "21.11.2026": ["15:00"]}
w = tg_send_widget(platform_id, "calendar", p, "Виберіть дату та час")
| Параметр | Опис |
|---|---|
slots |
Доступний час, як список або словник, згрупований за датами |
days |
Кількість доступних днів, починаючи з сьогодні |
date_from, date_to
|
Альтернативно, межі діапазону дат у форматі "ДД.ММ.РРРР"
|
dates |
Альтернативно, список конкретних дат |
weekdays_off |
Недоступні дні тижня: 1 = понеділок, 7 = неділя |
title |
Підказка, що відображається під сіткою календаря |
name |
Назва предмета або послуги, що бронюється; відображається після вибору |
change |
Встановіть 1, щоб відобразити кнопку «Вибрати інший час» після вибору |
callback |
Власний текст зворотного виклику замість widget_calendar_selected
|
Тільки дата
Не передавайте slots, якщо клієнту потрібно лише вибрати дату.
p = {}
p["days"] = 45
p["weekdays_off"] = [7]
w = tg_send_widget(platform_id, "calendar", p, "Choose a date")
Онлайн-бронювання
Вкажіть філію та послугу, і календар автоматично отримає доступні дати та часові слоти з модуля Services.
cal = {}
cal["company_id"] = comp_id
cal["service_ids"] = serv_id
cal["days_limit"] = 30
cal["name"] = serv_title
w = tg_send_widget(platform_id, "calendar", cal, serv_title)
| Параметр | Опис |
|---|---|
company_id |
Ідентифікатор філії |
service_ids |
Послуга або список послуг |
employee_id |
Ідентифікатор співробітника; якщо не вказано, використовується будь-який доступний співробітник |
days_limit |
Кількість днів наперед для пошуку доступності. За замовчуванням: 14 |
people_count |
Кількість місць, необхідних для групової послуги |
auto_booking |
Встановіть 1, щоб платформа автоматично створювала бронювання |
Ці параметри такі ж, як і ті, що використовуються в get_dates_for_booking та get_slots_for_booking.
Що отримує бот-потік
Окремі вибори дати не надсилаються в розмову.
Коли клієнт обирає часовий слот, або дату, якщо календар не має часових слотів, бот отримує зворотний виклик widget_calendar_selected, і заповнюються наступні змінні:
| Змінна | Значення |
|---|---|
widget_date |
Вибрана дата у форматі DD.MM.YYYY
|
widget_time |
Вибраний час у форматі HH:MM; порожній для календарів лише з датою |
widget_message_id |
ID повідомлення, що містить віджет |

Формати дати та часу такі ж, як і ті, що приймаються в create_booking та modify_booking_time.
Онлайн-бронювання з календарем: повний приклад
Віджет обробляє вибір дати, часові слоти та навігацію, зменшуючи кількість необхідних блоків бота.
Блок 1. Вибір послуги
Використовуйте блок Start Condition з умовою "записатися на прийом".
Відповідь: "Оберіть послугу:"
Встановіть поле кнопок на #{srv_buttons}.
comp_id = 8
srv_data = get_services_for_booking(comp_id)
srv_kb = tools_make_button_str_checker(srv_data, 'title', 1)
srv_buttons = srv_kb['buttons']
srv_checker = srv_kb['checker']
Блок 2. Календар
Відповідь: #{none}.
З'єднайте Блок 1 з Блоком 2 за умовою #{srv_checker}.
serv_id = tools_check_user_input(srv_data, question, 'title', 'id')
serv_title = tools_check_user_input(srv_data, question, 'title', 'title')
cal = {}
cal["company_id"] = comp_id
cal["service_ids"] = serv_id
cal["days_limit"] = 30
cal["name"] = serv_title
cal_sent = tg_send_widget(platform_id, "calendar", cal, serv_title)
Блок 3. Створення бронювання
Відповідь: #{none}.
З'єднайте Блок 2 з Блоком 3 за умовою widget_calendar_selected з Точним збігом.
booking_date = widget_date
booking_time = widget_time
booking_result = create_booking(comp_id, serv_id, booking_date, booking_time, '')
booking_ok = booking_result['status']
Блок 4. Бронювання підтверджено
З'єднайте Блок 3 з Блоком 4 за умовою змінної booking_ok == True із затримкою в одну секунду.
Відповідь:
Ваш запис підтверджено: #{serv_title}, #{booking_date} о #{booking_time}. До зустрічі!
Блок 5. Часовий слот більше недоступний
Відповідь: #{none}.
З'єднайте Блок 3 з Блоком 5 за умовою змінної booking_ok != True із затримкою в одну секунду.
Цей блок скидає наявний календар, дозволяючи клієнту вибрати інший час і показуючи повідомлення про помилку.
fix = {}
fix["reset"] = 1
fix["error"] = "Цей часовий слот щойно забронювали. Будь ласка, оберіть інший."
t = tg_edit_widget_data(platform_id, widget_message_id, fix)
Додайте ще одне з'єднання від Блоку 5 до Блоку 3 з умовою widget_calendar_selected.
Тепер клієнт може вибрати інший час у тому ж календарі.
Простіший варіант: автоматичне бронювання
Додайте наступний параметр до налаштувань календаря:
cal["auto_booking"] = 1
Платформа створить бронювання одразу, коли клієнт обере час.
Якщо вибраний часовий слот стане недоступним, віджет покаже помилку безпосередньо.
Зворотний виклик widget_calendar_selected надсилається лише після успішного бронювання, разом зі змінною widget_booking_id.
За такого підходу Блоки 3 і 5 не потрібні.
Використовуйте бронювання через бот-потік (перший підхід), якщо вам потрібна передоплата або спеціальні перевірки перед підтвердженням запису.
Оновлення надісланого віджета
Використовуйте наступну функцію для оновлення даних віджета:
tg_edit_widget_data(platform_id, message_id, data)
| Параметр | Опис |
|---|---|
message_id |
ID повідомлення віджета, збережене під час надсилання або отримане з widget_message_id після взаємодії |
data |
Словник, що містить нові значення |
Можна оновлювати лише дані віджета. Ви не можете змінити макет уже надісланого віджета. Щоб використати інший макет, надішліть новий віджет.
Як застосовуються оновлення:
-
Промокод, таймер, статус замовлення, FAQ: нові дані повністю замінюють попереднє оновлення. Будь-які відсутні поля повертаються до початкових значень, наданих під час надсилання віджета. Тому включайте кожне поле, яке має відрізнятися від початкових даних, наприклад, і
step, іtext. - Вікторина та календар: нові дані застосовуються поверх поточного стану віджета.
Спеціальні параметри оновлення:
| Шаблон | Дані | Результат |
|---|---|---|
promo |
{"used": 1} |
Позначає промокод як використаний |
timer |
{"seconds": 600} або {"until": "…"}
|
Перезапускає зворотний відлік |
calendar |
{"reset": 1, "error": "message"} |
Очищає вибір, відкриває календар заново та показує повідомлення |
Власні віджети
Коли готових шаблонів недостатньо — наприклад, якщо вам потрібен каталог товарів із кошиком, рейтинг зірками або калькулятор цін — ви можете створити власний HTML-віджет.

Як це працює
- Створіть віджет як єдиний HTML-файл, що містить його стилі та JavaScript.
- Збережіть код як файл
.txtу розділі Files проєкту та скопіюйте URL файлу. Система зберігання не приймає файли.html. - Блок бота надсилає віджет за допомогою URL і передає його початкові дані.
- Коли клієнт взаємодіє з віджетом, бот отримує зворотний виклик, що містить текст, визначений у коді віджета.
- Блок-обробник обчислює нові дані та надсилає їх назад віджету, який оновлює свій інтерфейс.
Надсилання власного віджета
tg_send_widget_file(platform_id, url, data, caption)
Приклад:
st = {}
st["rating"] = 0
w = tg_send_widget_file(platform_id, "https://files.mavibot.ai/…/rating.txt", st, "Оцініть ваше замовлення — торкніться зірки")
Параметр data — це словник, що містить початковий стан, який використовується для відображення віджета.
Обробка взаємодій
Коли клієнт взаємодіє з власним віджетом, бот отримує зворотний виклик.
Також заповнюються наступні змінні:
| Змінна | Значення |
|---|---|
widget_data |
Текст запиту, надісланий віджетом, наприклад rate:4
|
widget_message_id |
ID повідомлення, де відбулася взаємодія |
widget_query_id |
Ідентифікатор запиту |
Створіть обробник за допомогою блоку Trigger та увімкніть налаштування Trigger only on Callback.
Умова має відповідати тексту запиту віджета.
Цей тип блоку працює незалежно від поточної позиції клієнта в бот-потоці та не переміщує його з поточного кроку.
Важливо: Не використовуйте блок Start Condition для обробки взаємодій із власним віджетом. Віджет залишається в чаті, і клієнт може взаємодіяти з ним у будь-який час — навіть під час заповнення анкети, бронювання запису або здійснення платежу. Блок Start Condition перенаправив би клієнта до обробника та перервав би його поточний крок.
Приклад обробника рейтингу:
Умова (регулярний вираз):
^rate:[1-5]$
Калькулятор:
local a = splitter(widget_data, ":")
client.widget_rating = a[1]
st = {}
st["rating"] = client.widget_rating
t = tg_edit_widget_data(platform_id, widget_message_id, st)
Дані власного віджета замінюються повністю під час оновлень. Завжди надсилайте повний стан, а не лише змінене поле.
Обмеження розміру даних — 1024 байти.
Зберігайте великі статичні набори даних (наприклад, каталоги товарів) у коді віджета, а через дані віджета надсилайте лише значення, що змінюються.
Відповідь на запит віджета
За замовчуванням віджет одразу отримує порожню відповідь, а оновлені дані надходять через окреме оновлення віджета.
Якщо віджету потрібно отримати дані безпосередньо у відповідь на свій запит, текст запиту має починатися з ?, наприклад:
?price
У цьому випадку блок-обробник має викликати наступну функцію протягом 15 секунд:
tg_answer_widget_query(data)
Інакше віджет покаже помилку тайм-ауту.
Обмеження розміру відповіді — 1024 байти.
Вимоги до коду
-
Єдиний файл: включайте стилі всередині
<style>, а JavaScript — всередині<script>. Зовнішні скрипти, таблиці стилів, шрифти та зображення завантажувати не можна. Зображення мають бути вбудовані за допомогою URL-адресdata:або SVG. - Обмеження розміру: максимум 32 КБ до стиснення та 4 КБ після стиснення.
-
Без полів введення: елементи
input,select,textareaтаformвидаляються. Підтримуються лише елементи<button>як інтерактивні елементи керування. -
Без мережевих запитів:
fetchта подібні API не працюють. Єдиний спосіб зв'язку з ботом — черезTelegramWidget.request("text"), з розміром запиту 1–64 байти. - Без внутрішньої прокрутки: максимальна висота віджета — 600 пікселів. Усе, що виходить за ці межі, обрізається. Щоб створити карусель, переміщуйте ряд карток, а не використовуйте прокрутку.
-
Доступ до елементів: використовуйте
document.getElementById. Доступ до елементів як глобальних змінних на основі їх ID не працює. -
Тема Telegram: використовуйте змінні теми Telegram, такі як
var(--tg-theme-text-color), щоб віджет виглядав коректно як у світлій, так і в темній темах. -
Дані віджета: читайте дані з
TelegramWidget.chatDataта перемальовуйте віджет, коли відбувається подіяchatDataChanged. -
Запити: викликайте
requestбезпосередньо в обробнику взаємодії користувача. Дозволено лише один запит на взаємодію.
Віджет не показує помилки кодування. Непідтримувані елементи мовчки видаляються, а помилка JavaScript може призвести до порожнього віджета. Завжди тестуйте віджет у Telegram після внесення змін.
Мінімальний приклад власного віджета
Наведений нижче приклад відображає товар, кнопку, яка надсилає запит боту, і лічильник кошика на основі даних віджета.
<style>
body{margin:0;padding:14px}
.h{color:var(--tg-theme-hint-color);font-size:.85em}
button{width:100%;margin-top:8px}
</style>
<b>Маргарита · $10</b>
<div class="h" id="c"></div>
<button id="add">Додати в кошик</button>
<div class="h" id="e"></div>
<script>
var W=window.TelegramWidget,$=function(i){return document.getElementById(i)},busy=0;
function draw(){
var s={};
try{s=JSON.parse(W.chatData)||{}}catch(e){}
$('c').textContent='У кошику: '+(s.count||0)
}
$('add').onclick=function(){
if(busy)return;
busy=1;
$('e').textContent='';
W.request('cart_add').then(
function(){busy=0},
function(x){
busy=0;
$('e').textContent='Помилка: '+x.code
}
)
};
W.onEvent('chatDataChanged',draw);
draw();
</script>
Mavi та віджети
Mavi може автоматично створювати повні бот-сценарії з віджетами.
Просто опишіть, що вам потрібно, звичайною мовою.
Наприклад:
- "Коли клієнт надсилає 'order', покажи віджет статусу замовлення з трьома етапами. Коли він надсилає 'ready', перемісти замовлення на другий етап."
- "Створи сценарій бронювання послуг: клієнти обирають послугу за допомогою кнопок, а потім обирають дату та час за допомогою віджета календаря."
- "Створи віджет рейтингу зірками для замовлень і зберігай обраний рейтинг у змінну клієнта."
Mavi автоматично налаштовує готові шаблони.
Для користувацьких віджетів Mavi пише та перевіряє код, зберігає файл віджета в проєкт і створює блоки, необхідні для надсилання віджета та обробки взаємодій з клієнтом.
Довідник
Функції
| Функція | Опис |
|---|---|
tg_send_widget(platform_id, template, params, caption) |
Надсилає готовий шаблон віджета |
tg_send_widget_file(platform_id, url, data, caption) |
Надсилає користувацький віджет з файлу |
tg_edit_widget_data(platform_id, message_id, data) |
Оновлює дані в існуючому віджеті |
tg_answer_widget_query(data) |
Відповідає на запит користувацького віджета, що починається з ?
|
Зворотні виклики та змінні
| Подія | Зворотний виклик | Змінні |
|---|---|---|
| Вікторину завершено | widget_quiz_finished |
widget_quiz_score, widget_quiz_total, widget_quiz_answers
|
| Дата та час вибрані в календарі | widget_calendar_selected |
widget_date, widget_time; також widget_booking_id, якщо увімкнено auto_booking
|
| Взаємодія з користувацьким віджетом | Текст запиту, визначений у коді віджета |
widget_data, widget_message_id, widget_query_id
|
Якщо ваш бот містить кілька вікторин або календарів, призначте унікальний зворотний виклик кожному віджету за допомогою параметра callback, щоб ви могли розрізняти їх в умовах сценарію бота.
Обмеження
- Віджети працюють лише в приватних чатах Telegram між клієнтом і ботом.
- Для кожного клієнта зберігаються лише п'ять останніх вікторин і календарів. Старіші перестають реагувати на взаємодії.
- Очищення всіх змінних клієнта в сценарії бота вимикає раніше надіслані вікторини та календарі.
- Дані віджета обмежені 1024 байтами.
- Запити від користувацьких віджетів обмежені 64 байтами.
- Запити користувацьких віджетів, що потребують
tg_answer_widget_query, мають бути оброблені протягом 15 секунд.
Усунення несправностей
| Проблема | Причина / Рішення |
|---|---|
Віджет не надсилається, а змінна містить Unknown parameter…
|
Шаблон отримав непідтримуваний параметр. Повідомлення про помилку перелічує дозволені параметри |
| Календар зупиняється після вибору дати, не показуючи часові слоти | Параметр slots не було надано |
| Після взаємодії з віджетом бот перестає реагувати на кнопки в поточному кроці | Обробник взаємодії використовує блок Start Condition. Замініть його на Non-State Block з Condition |
| Користувацький віджет виглядає порожнім | У коді віджета є помилка. Поширена причина — доступ до елемента за його ID без використання document.getElementById
|
| Telegram показує "Unsupported message" | Клієнт використовує застарілу версію Telegram |
Bad Request: chat not found |
Віджет було надіслано поза Telegram, наприклад, з вікна тестування бота |