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".

Código promocional

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".

Widget no construtor do bot

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.

Código promocional

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.

Cronômetro regressivo

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.

Status do pedido: primeira etapa

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)

Status do pedido: segunda etapa

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.

Widget de FAQ

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.

Pergunta do quiz

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

Resultado do quiz e resposta do bot


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".

Calendário: selecionando data e hora

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

Calendário: seleção concluída

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 step e text.
  • 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.

Widget personalizado: classificação por estrelas

Como Funciona

  1. Crie um widget como um único arquivo HTML contendo seus estilos e JavaScript.
  2. Salve o código como um arquivo .txt na seção Arquivos do projeto e copie a URL do arquivo. O sistema de armazenamento não aceita arquivos .html.
  3. Um bloco do bot envia o widget usando a URL e passa seus dados iniciais.
  4. Quando um cliente interage com o widget, o bot recebe um callback contendo o texto definido no código do widget.
  5. 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 URLs data: 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, textarea e form são removidos. Apenas elementos <button> são suportados como controles interativos.
  • Sem solicitações de rede: fetch e APIs semelhantes não funcionam. A única maneira de se comunicar com o bot é através de TelegramWidget.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.chatData e redesenhe o widget quando o evento chatDataChanged ocorrer.
  • Solicitações: chame request diretamente 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_query devem 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