Um widget é um componente interativo incorporado diretamente em uma mensagem do bot: um código promocional com botão de copiar, um cronômetro regressivo, um rastreador de status de pedido, um quiz ou um calendário para selecionar data e hora. Quando um cliente interage com um widget, o bot atualiza a mesma mensagem no local — sem enviar novas mensagens ou exibir um rótulo "editado".

Existem duas maneiras de enviar um widget:
- Modelo pronto — uma única linha na Calculadora. O layout e a funcionalidade já estão implementados.
- Widget personalizado — escreva seu próprio código HTML (ou peça ao Mavi para criá-lo) e processe as interações usando blocos de fluxo do bot.
Onde os Widgets Funcionam
| Mensageiro | Somente Telegram |
| Tipo de chat | Somente chats privados entre um cliente e um bot |
| Não suportado | Grupos, canais, Telegram Business |
| Aplicativo Telegram | Requer uma versão recente do Telegram. Versões mais antigas exibem um aviso de "Mensagem não suportada" e a legenda |
| Encaminhamento | Widgets não podem ser encaminhados ou copiados |
Os widgets não suportam campos de entrada de texto ou teclados. Os clientes só podem interagir tocando. Se você precisar que os clientes insiram texto, use uma pergunta regular do bot ou um Web App.
Os widgets não são exibidos na janela de teste do bot no painel porque não é o Telegram. Teste os widgets diretamente no Telegram enviando mensagens para o seu bot.
Modelos Prontos
Todos os modelos são enviados usando uma única função:
tg_send_widget(platform_id, template, params, caption)
| Parâmetro | Descrição |
|---|---|
platform_id |
ID do destinatário. Para o cliente atual, use a variável platform_id
|
template |
Nome do modelo: promo, timer, order_status, faq, quiz, calendar
|
params |
Dicionário contendo as configurações do modelo |
caption |
Texto exibido abaixo do widget. Os clientes também o veem na lista de chats, notificações e versões mais antigas do Telegram, portanto, deve ser significativo por si só |
A função retorna a resposta da API do Telegram. O ID da mensagem enviada está disponível em response['result']['message_id']. Salve-o se você planeja atualizar o widget posteriormente.
Se a função retornar texto em vez de uma resposta do Telegram, ocorreu um erro: um modelo desconhecido, um parâmetro inválido ou ausente, ou um widget que excede o limite de tamanho. O texto do erro explica o que deu errado.
Como Construir Parâmetros
Crie um dicionário e atribua cada parâmetro em uma linha separada:
p = {}
p["code"] = "WIDGET10"
p["title"] = "Seu código promocional"
p["note"] = "10% de desconto em qualquer pedido"
w = tg_send_widget(platform_id, "promo", p, "Seu código promocional WIDGET10 — 10% de desconto")
Digite o código no campo Calculadora do bloco. A captura de tela mostra um bloco Condição de Início que envia um widget de status de pedido quando o cliente envia a frase "widget de pedido".

No bloco que envia o widget, você normalmente definiria o campo de resposta como #{none}. O bloco não envia uma mensagem de texto separada porque a legenda do widget serve como o texto da mensagem.
Idioma
Os modelos incluem texto de interface integrado, como rótulos de botões, nomes de meses e dias da semana, "Tempo esgotado" e outras mensagens.
O idioma padrão no Mavibot é o inglês (en).
Para usar outro idioma, especifique o parâmetro lang:
p["lang"] = "pt"
Idiomas suportados:
ru, en, de, es, fr, pt, tr, uk, kk, ms, th, ar.
Textos que você fornece — títulos, perguntas, etapas e legendas — são exibidos exatamente como inseridos e não são traduzidos automaticamente.
Código Promocional — promo
Exibe um código promocional com um botão que o copia com um toque.

| Parâmetro | Descrição |
|---|---|
code |
Código promocional. Obrigatório |
title |
Texto exibido acima do código |
note |
Texto exibido abaixo do código, como uma data de validade |
button |
Rótulo do botão. Padrão: "Copiar código promocional" |
used_text |
Texto exibido quando o código é marcado como usado |
p = {}
p["code"] = "WIDGET10"
p["title"] = "Seu código promocional"
p["note"] = "10% de desconto em qualquer pedido"
p["button"] = "Copiar código"
w = tg_send_widget(platform_id, "promo", p, "Seu código promocional WIDGET10 — 10% de desconto")
client.promo_widget_id = w['result']['message_id']
Para marcar o código como usado, o que risca o código e remove o botão:
p = {}
p["used"] = 1
t = tg_edit_widget_data(platform_id, client.promo_widget_id, p)
Cronômetro Regressivo — timer
Exibe uma contagem regressiva para uma data e hora especificadas.
A contagem regressiva é executada no dispositivo do cliente. O bot não está envolvido na atualização do cronômetro.

| Parâmetro | Descrição |
|---|---|
until |
Data e hora alvo no formato "DD.MM.YYYY HH:MM", usando o fuso horário do projeto |
seconds |
Alternativamente, o número de segundos a partir do momento em que o widget é enviado |
title |
Título do cronômetro. Padrão: "A oferta termina em" |
done |
Texto exibido quando a contagem regressiva termina |
text |
Texto exibido abaixo da contagem regressiva |
button, url
|
Rótulo do botão e URL de destino (somente https://) |
hide_button |
Defina como 1 para ocultar o botão quando a contagem regressiva terminar |
Você deve fornecer until ou seconds.
p = {}
p["seconds"] = 7200
p["title"] = "A oferta termina em"
p["button"] = "Visitar site"
p["url"] = "https://salebot.pro"
w = tg_send_widget(platform_id, "timer", p, "A oferta termina em 2 horas")
Quando a contagem regressiva chega a zero, nenhuma mensagem ou callback é enviado ao bot. Se o bot precisar executar uma ação quando a oferta expirar, use uma conexão de temporizador regular no fluxo do bot.
Status do Pedido — order_status
Exibe uma lista de etapas do pedido com a etapa atual destacada.
O bot pode atualizar a etapa no local, para que o cliente sempre veja a mesma mensagem.

| Parâmetro | Descrição |
|---|---|
title |
Título do widget |
steps |
Lista de etapas, de 1 a 12. Padrão: aceito, preparando, entregue ao entregador, a caminho, entregue |
step |
Número da etapa atual, começando em 1 |
text |
Texto exibido abaixo das etapas |
Enviando o widget:
p = {}
p["title"] = "Status do pedido"
p["steps"] = ["Aceito", "Preparando", "Entregue"]
p["step"] = 1
p["text"] = "Seu pedido foi aceito e está sendo preparado"
w = tg_send_widget(platform_id, "order_status", p, "Seu pedido")
client.order_widget_id = w['result']['message_id']
Avance para a próxima etapa de qualquer outro bloco, como quando uma etapa do negócio muda, um gerente envia um comando ou um temporizador dispara:
p = {}
p["step"] = 2
p["text"] = "Seu pedido está sendo preparado e será entregue ao entregador em breve"
t = tg_edit_widget_data(platform_id, client.order_widget_id, p)

A legenda abaixo do widget não muda quando a etapa é atualizada. Use uma legenda neutra como "Seu pedido" em vez de "Status: Aceito".
Perguntas Frequentes — faq
Exibe uma lista de perguntas. Os clientes podem tocar em uma pergunta para expandir sua resposta.

| Parâmetro | Descrição |
|---|---|
title |
Título do widget |
items |
Lista de pares de perguntas e respostas. Obrigatório |
p = {}
p["title"] = "Perguntas Frequentes"
p["items"] = [["Como posso pagar?", "Você pode pagar com cartão. Um link de pagamento será enviado para este chat."], ["Quanto tempo leva a entrega?", "A entrega geralmente leva de 1 a 2 dias localmente e de 3 a 7 dias em todo o país."], ["Posso devolver um item?", "Sim, dentro de 14 dias."]]
w = tg_send_widget(platform_id, "faq", p, "Respostas para perguntas frequentes")
O texto é exibido como texto simples. Tags HTML e outras marcações não são processadas.
Quiz e Pesquisa — quiz
Exibe perguntas com respostas de múltipla escolha, uma pergunta por vez.
Se respostas corretas forem especificadas, o widget atua como um quiz e calcula uma pontuação. Sem respostas corretas, funciona como uma pesquisa.

| Parâmetro | Descrição |
|---|---|
title |
Título exibido acima das perguntas |
questions |
Lista de perguntas. Obrigatório |
retry |
Defina como 1 para exibir um botão "Tentar novamente" no final |
callback |
Texto de callback personalizado em vez de widget_quiz_finished
|
Cada pergunta é um dicionário contendo:
-
q— texto da pergunta -
options— opções de resposta -
correct— resposta correta, especificada pelo seu índice baseado em 1 ou texto exato
p = {}
p["title"] = "Quiz: Teste Seu Conhecimento"
p["retry"] = 1
p["questions"] = [{"q": "Quanto é 2 + 2?", "options": ["3", "4", "5"], "correct": 2}, {"q": "Qual é a capital da França?", "options": ["Londres", "Paris", "Berlim"], "correct": "Paris"}]
w = tg_send_widget(platform_id, "quiz", p, "Faça este quiz de duas perguntas!")
Para criar uma pesquisa sem pontuação, omita correct de cada pergunta.
As respostas corretas são verificadas pela plataforma e não são enviadas ao dispositivo do cliente.
O que o Fluxo do Bot Recebe
As respostas individuais das perguntas não são enviadas para a conversa.
Quando o cliente responde à última pergunta, o bot recebe o callback widget_quiz_finished e as seguintes variáveis são preenchidas:
| Variável | Valor |
|---|---|
widget_quiz_score |
Número de respostas corretas; vazio para pesquisas |
widget_quiz_total |
Número total de perguntas |
widget_quiz_answers |
Índices das opções selecionadas, como [2,2]
|
Para processar o resultado, crie uma conexão a partir do bloco que enviou o quiz ou use um bloco Condição de Início com a condição widget_quiz_finished.
Exemplo de resposta:
Seu resultado: #{widget_quiz_score} de #{widget_quiz_total} respostas corretas

Calendário — calendar
Exibe um calendário mensal onde os clientes podem selecionar uma data e depois um horário.
Ele substitui várias páginas de botões de data e hora, incluindo navegação "Voltar" e "Avançar".

O calendário suporta três modos.
Datas e Horários Personalizados
Os horários disponíveis são sempre passados pelo parâmetro slots.
Mesmos horários todos os dias — forneça uma lista de horários e um intervalo de datas:
p = {}
p["title"] = "Selecione uma data e hora"
p["name"] = "Consulta"
p["days"] = 10
p["slots"] = ["10:00", "12:00", "15:00"]
w = tg_send_widget(platform_id, "calendar", p, "Escolha uma data e hora")
Horários diferentes para datas específicas — forneça um dicionário mapeando datas para listas de horários. As datas disponíveis são obtidas das chaves do dicionário:
p = {}
p["slots"] = {"20.11.2026": ["10:00", "12:00"], "21.11.2026": ["15:00"]}
w = tg_send_widget(platform_id, "calendar", p, "Escolha uma data e hora")
| Parâmetro | Descrição |
|---|---|
slots |
Horários disponíveis, como uma lista ou um dicionário agrupado por data |
days |
Número de dias disponíveis a partir de hoje |
date_from, date_to
|
Alternativamente, limites do intervalo de datas no formato "DD.MM.YYYY"
|
dates |
Alternativamente, uma lista de datas específicas |
weekdays_off |
Dias da semana indisponíveis: 1 = segunda-feira a 7 = domingo |
title |
Dica exibida abaixo da grade do calendário |
name |
Nome do item ou serviço que está sendo reservado; exibido após a seleção |
change |
Defina como 1 para exibir um botão "Escolher outro horário" após a seleção |
callback |
Texto de callback personalizado em vez de widget_calendar_selected
|
Somente Data
Não passe slots se o cliente precisar apenas selecionar uma data.
p = {}
p["days"] = 45
p["weekdays_off"] = [7]
w = tg_send_widget(platform_id, "calendar", p, "Escolha uma data")
Reserva Online
Forneça uma filial e um serviço, e o calendário recuperará automaticamente as datas e horários disponíveis do módulo Serviços.
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)
| Parâmetro | Descrição |
|---|---|
company_id |
Identificador da filial |
service_ids |
Serviço ou lista de serviços |
employee_id |
Identificador do funcionário; se omitido, qualquer funcionário disponível é usado |
days_limit |
Número de dias à frente para buscar disponibilidade. Padrão: 14 |
people_count |
Número de vagas necessárias para um serviço em grupo |
auto_booking |
Defina como 1 para permitir que a plataforma crie a reserva automaticamente |
Esses parâmetros são os mesmos usados por get_dates_for_booking e get_slots_for_booking.
O que o Fluxo do Bot Recebe
Seleções de data individuais não são enviadas para a conversa.
Quando o cliente seleciona um horário, ou uma data se o calendário não tiver horários, o bot recebe o callback widget_calendar_selected e as seguintes variáveis são preenchidas:
| Variável | Valor |
|---|---|
widget_date |
Data selecionada no formato DD.MM.YYYY
|
widget_time |
Hora selecionada no formato HH:MM; vazio para calendários somente data |
widget_message_id |
ID da mensagem que contém o widget |

Os formatos de data e hora são os mesmos aceitos por create_booking e modify_booking_time.
Reserva Online com Calendário: Exemplo Completo
O widget lida com seleção de data, horários e navegação, reduzindo o número de blocos necessários no bot.
Bloco 1. Seleção de Serviço
Use um bloco Condição de Início com a condição "agendar um horário".
Resposta: "Escolha um serviço:"
Defina o campo de botões como #{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']
Bloco 2. Calendário
Resposta: #{none}.
Conecte o Bloco 1 ao Bloco 2 usando a condição #{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)
Bloco 3. Criar Reserva
Resposta: #{none}.
Conecte o Bloco 2 ao Bloco 3 usando a condição widget_calendar_selected com Correspondência exata.
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']
Bloco 4. Reserva Confirmada
Conecte o Bloco 3 ao Bloco 4 usando a condição de variável booking_ok == True com um atraso de um segundo.
Resposta:
Sua reserva está confirmada: #{serv_title}, #{booking_date} às #{booking_time}. Até breve!
Bloco 5. Horário Não Está Mais Disponível
Resposta: #{none}.
Conecte o Bloco 3 ao Bloco 5 usando a condição de variável booking_ok != True com um atraso de um segundo.
Este bloco redefine o calendário existente, permitindo que o cliente selecione outro horário e exibindo uma mensagem de erro.
fix = {}
fix["reset"] = 1
fix["error"] = "Este horário acabou de ser reservado. Por favor, escolha outro."
t = tg_edit_widget_data(platform_id, widget_message_id, fix)
Adicione outra conexão do Bloco 5 ao Bloco 3 com a condição widget_calendar_selected.
O cliente agora pode selecionar outro horário no mesmo calendário.
Opção Mais Simples: Reserva Automática
Adicione o seguinte parâmetro às configurações do calendário:
cal["auto_booking"] = 1
A plataforma criará a reserva imediatamente quando o cliente selecionar um horário.
Se o horário selecionado ficar indisponível, o widget exibirá um erro diretamente.
O callback widget_calendar_selected é enviado somente após uma reserva bem-sucedida, junto com a variável widget_booking_id.
Com essa abordagem, os Blocos 3 e 5 não são necessários.
Use a reserva através do fluxo do bot (a primeira abordagem) se você precisar de pré-pagamento ou verificações personalizadas antes de confirmar um agendamento.
Atualizando um Widget Enviado
Use a seguinte função para atualizar os dados do widget:
tg_edit_widget_data(platform_id, message_id, data)
| Parâmetro | Descrição |
|---|---|
message_id |
ID da mensagem do widget, salvo ao enviá-lo ou obtido de widget_message_id após uma interação |
data |
Dicionário contendo os novos valores |
Apenas os dados do widget podem ser atualizados. Você não pode alterar o layout de um widget já enviado. Para usar um layout diferente, envie um novo widget.
Como as atualizações são aplicadas:
-
Cupom promocional, timer, status do pedido, FAQ: os novos dados substituem completamente a atualização anterior. Quaisquer campos ausentes voltam aos valores originais fornecidos quando o widget foi enviado. Portanto, inclua todos os campos que devem diferir dos dados iniciais, como
stepetext. - Quiz e calendário: os novos dados são aplicados sobre o estado atual do widget.
Parâmetros especiais de atualização:
| Modelo | Dados | Resultado |
|---|---|---|
promo |
{"used": 1} |
Marca o cupom promocional como usado |
timer |
{"seconds": 600} ou {"until": "…"}
|
Reinicia a contagem regressiva |
calendar |
{"reset": 1, "error": "mensagem"} |
Limpa a seleção, reabre o calendário e exibe uma mensagem |
Widgets Personalizados
Quando os modelos prontos não são suficientes — por exemplo, se você precisa de um catálogo de produtos com carrinho de compras, uma classificação por estrelas ou uma calculadora de preços — você pode criar um widget HTML personalizado.

Como Funciona
- Crie um widget como um único arquivo HTML contendo seus estilos e JavaScript.
- Salve o código como um arquivo
.txtna seção Arquivos do projeto e copie a URL do arquivo. O sistema de armazenamento não aceita arquivos.html. - Um bloco do bot envia o widget usando a URL e passa seus dados iniciais.
- Quando um cliente interage com o widget, o bot recebe um callback contendo o texto definido no código do widget.
- Um bloco de manipulador calcula os novos dados e os envia de volta ao widget, que atualiza sua própria interface.
Enviando um Widget Personalizado
tg_send_widget_file(platform_id, url, data, caption)
Exemplo:
st = {}
st["rating"] = 0
w = tg_send_widget_file(platform_id, "https://files.mavibot.ai/…/rating.txt", st, "Avalie seu pedido — toque em uma estrela")
O parâmetro data é um dicionário contendo o estado inicial usado para renderizar o widget.
Manipulando Interações
Quando um cliente interage com um widget personalizado, o bot recebe um callback.
As seguintes variáveis também são preenchidas:
| Variável | Valor |
|---|---|
widget_data |
Texto da solicitação enviado pelo widget, como rate:4
|
widget_message_id |
ID da mensagem onde a interação ocorreu |
widget_query_id |
Identificador da solicitação |
Crie o manipulador usando um bloco Gatilho e ative a configuração Gatilho somente em Callback.
A condição deve corresponder ao texto da solicitação do widget.
Este tipo de bloco funciona independentemente da posição atual do cliente no fluxo do bot e não o move para fora da etapa atual.
Importante: Não use um bloco Condição de Início para manipular interações de widgets personalizados. Um widget permanece no chat, e o cliente pode interagir com ele a qualquer momento — mesmo enquanto preenche um questionário, agenda uma reserva ou faz um pagamento. Um bloco Condição de Início redirecionaria o cliente para o manipulador e interromperia sua etapa atual.
Exemplo de manipulador de classificação:
Condição (expressão regular):
^rate:[1-5]$
Calculadora:
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)
Os dados do widget personalizado são substituídos inteiramente durante as atualizações. Sempre envie o estado completo em vez de apenas o campo alterado.
O limite de tamanho dos dados é 1024 bytes.
Mantenha grandes conjuntos de dados estáticos (como catálogos de produtos) dentro do código do widget e envie apenas os valores que mudam através dos dados do widget.
Respondendo a uma Solicitação do Widget
Por padrão, o widget recebe imediatamente uma resposta vazia, e os dados atualizados chegam através de uma atualização separada do widget.
Se o widget precisar receber dados diretamente em resposta à sua solicitação, o texto da solicitação deve começar com ?, por exemplo:
?price
Nesse caso, o bloco do manipulador deve chamar a seguinte função dentro de 15 segundos:
tg_answer_widget_query(data)
Caso contrário, o widget exibirá um erro de tempo limite.
O limite de tamanho da resposta é 1024 bytes.
Requisitos de Código
-
Arquivo único: inclua estilos dentro de
<style>e JavaScript dentro de<script>. Scripts externos, folhas de estilo, fontes e imagens não podem ser carregados. As imagens devem ser incorporadas usando URLsdata:ou SVG. - Limites de tamanho: máximo de 32 KB antes da compressão e 4 KB após a compressão.
-
Sem campos de entrada: elementos
input,select,textareaeformsão removidos. Apenas elementos<button>são suportados como controles interativos. -
Sem solicitações de rede:
fetche APIs semelhantes não funcionam. A única maneira de se comunicar com o bot é através deTelegramWidget.request("text"), com um tamanho de solicitação de 1 a 64 bytes. - Sem rolagem interna: a altura máxima do widget é de 600 pixels. Qualquer coisa além disso é cortada. Para criar um carrossel, mova uma linha de cartões em vez de usar rolagem.
-
Acesso a elementos: use
document.getElementById. Acessar elementos como variáveis globais com base em seus IDs não funciona. -
Tema do Telegram: use variáveis de tema do Telegram, como
var(--tg-theme-text-color), para que o widget pareça correto em temas claro e escuro. -
Dados do widget: leia os dados de
TelegramWidget.chatDatae redesenhe o widget quando o eventochatDataChangedocorrer. -
Solicitações: chame
requestdiretamente dentro de um manipulador de interação do usuário. Apenas uma solicitação é permitida por interação.
O widget não exibe erros de codificação. Elementos não suportados são removidos silenciosamente, e um erro de JavaScript pode resultar em um widget vazio. Sempre teste o widget no Telegram após fazer alterações.
Exemplo Mínimo de Widget Personalizado
O exemplo abaixo exibe um produto, um botão que envia uma solicitação ao bot e um contador de carrinho baseado nos dados do widget.
<style>
body{margin:0;padding:14px}
.h{color:var(--tg-theme-hint-color);font-size:.85em}
button{width:100%;margin-top:8px}
</style>
<b>Margherita · $10</b>
<div class="h" id="c"></div>
<button id="add">Adicionar ao carrinho</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='No carrinho: '+(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='Erro: '+x.code
}
)
};
W.onEvent('chatDataChanged',draw);
draw();
</script>
Mavi e Widgets
O Mavi pode criar fluxos de bot completos com widgets automaticamente.
Basta descrever o que você precisa em linguagem simples.
Por exemplo:
- "Quando o cliente enviar 'order', exiba um widget de status de pedido com três estágios. Quando enviar 'ready', mova o pedido para o segundo estágio."
- "Crie um fluxo de agendamento de serviço: os clientes escolhem um serviço usando botões e, em seguida, selecionam uma data e hora usando um widget de calendário."
- "Crie um widget de avaliação por estrelas para pedidos e salve a avaliação selecionada em uma variável de cliente."
O Mavi configura automaticamente modelos prontos.
Para widgets personalizados, o Mavi escreve e verifica o código, salva o arquivo do widget no projeto e cria os blocos necessários para enviar o widget e lidar com as interações do cliente.
Referência
Funções
| Função | Descrição |
|---|---|
tg_send_widget(platform_id, template, params, caption) |
Envia um modelo de widget pronto |
tg_send_widget_file(platform_id, url, data, caption) |
Envia um widget personalizado a partir de um arquivo |
tg_edit_widget_data(platform_id, message_id, data) |
Atualiza dados em um widget existente |
tg_answer_widget_query(data) |
Responde a uma solicitação de widget personalizado que começa com ?
|
Callbacks e Variáveis
| Evento | Callback | Variáveis |
|---|---|---|
| Questionário concluído | widget_quiz_finished |
widget_quiz_score, widget_quiz_total, widget_quiz_answers
|
| Data e hora selecionadas no calendário | widget_calendar_selected |
widget_date, widget_time; também widget_booking_id quando auto_booking está habilitado |
| Interação com widget personalizado | Texto da solicitação definido no código do widget |
widget_data, widget_message_id, widget_query_id
|
Se o seu bot contiver vários questionários ou calendários, atribua um callback exclusivo a cada widget usando o parâmetro callback para que você possa distingui-los nas condições do fluxo do bot.
Limitações
- Os widgets funcionam apenas em chats privados do Telegram entre um cliente e um bot.
- Apenas os cinco questionários e calendários mais recentes são retidos para cada cliente. Os mais antigos param de responder a interações.
- Limpar todas as variáveis de cliente em um fluxo de bot desativa questionários e calendários enviados anteriormente.
- Os dados do widget são limitados a 1024 bytes.
- As solicitações de widgets personalizados são limitadas a 64 bytes.
- Solicitações de widgets personalizados que exigem
tg_answer_widget_querydevem ser respondidas dentro de 15 segundos.
Solução de Problemas
| Problema | Causa / Solução |
|---|---|
O widget não é enviado e a variável contém Unknown parameter…
|
O modelo recebeu um parâmetro não suportado. A mensagem de erro lista os parâmetros permitidos |
| O calendário para após a seleção da data sem mostrar horários | O parâmetro slots não foi fornecido |
| Após interagir com um widget, o bot para de responder aos botões na etapa atual | O manipulador de interação usa um bloco de Condição de Início. Substitua-o por um bloco de Não-Estado com Condição |
| O widget personalizado aparece vazio | Há um erro no código do widget. Uma causa comum é acessar um elemento pelo seu ID sem usar document.getElementById
|
| O Telegram exibe "Unsupported message" | O cliente está usando uma versão desatualizada do Telegram |
Bad Request: chat not found |
O widget foi enviado fora do Telegram, por exemplo, da janela de teste do bot |