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

Промокод

Є два способи надіслати віджет:

  • Готовий шаблон — один рядок у Калькуляторі. Макет і функціональність уже реалізовані.
  • Власний віджет — напишіть власний 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

Відображає список запитань. Клієнти можуть натиснути на запитання, щоб розгорнути відповідь.

Віджет 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-віджет.

Власний віджет: рейтинг зірками

Як це працює

  1. Створіть віджет як єдиний HTML-файл, що містить його стилі та JavaScript.
  2. Збережіть код як файл .txt у розділі Files проєкту та скопіюйте URL файлу. Система зберігання не приймає файли .html.
  3. Блок бота надсилає віджет за допомогою URL і передає його початкові дані.
  4. Коли клієнт взаємодіє з віджетом, бот отримує зворотний виклик, що містить текст, визначений у коді віджета.
  5. Блок-обробник обчислює нові дані та надсилає їх назад віджету, який оновлює свій інтерфейс.

Надсилання власного віджета

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, наприклад, з вікна тестування бота