Skip to main content

Olá pessoal, tudo bem?



Recentemente respondi uma dúvida muito interessante aqui no fórum e resolvi criar esse post para compartilhar a solução com vocês.



Em diversos momentos nós podemos precisar alertar o usuário sobre alguma condição ou evento que irá impactar na conversa dele com nosso contato inteligente. Por exemplo, eu posso querer informar a qualquer momento para o usuário quando que o horário de atendimento encerrou e evitar que ele percorra todo um fluxo de cadastro para só informar isso no final. Neste post irei mostrar como é possível fazer isso de um jeito bastante prático.



A implementação dessa solução é bastante simples e rápida. Todas as alterações são feitas nas ações de entrada do bot, conforme mostra o print abaixo.





Neste exemplo, meu objetivo é enviar uma mensagem para o usuário sempre que encerrar o tempo de atendimento do Desk. Para isso, executei os seguintes passos:



1 - Criei um script nas ações globais de entrada para validar se está no horário de atendimento. Este script retorna um booleano e registro essa informação na variável estaEmHorarioDeAtendimento . Não há condições de execução desse script, ele sempre irá executar.



2 - Adicionei uma requisição http para enviar a mensagem de alerta para o usuário. As condições para executar essa ação são a variável mensagemDeAlertaJaEnviada não existir e a variável estaEmHorarioDeAtendimento ser igual a false. obs: Falarei da variável mensagemDeAlertaJaEnviada no próximo ponto.



image



A requição HTTP é a seguinte:



Método: POST


URL: A url você encontra nas configurações do seu bot roteador (se utilizar um roteador) ou no builder (se não utilizar um roteador). Você encontra ao clicar na engrenagem no canto direito do bot e nas opções “Informações de conexão”. É a url para enviar mensagens. No print abaixo mostra onde encontrar. Obs: essa url pode mudar de um bot para outro, por isso sempre pegue essa informação nas configurações de conexão do seu bot.





Headers: É preciso adicionar apenas uma chave no header que é o authorization do seu bot. Você encontra ela no mesmo lugar que encontrou a url de mensagens. É o campo “Authorization” do bot.





Body: No corpo da requisição você irá enviar este conteúdo:



{

"id": "{{random.guid}}",

"to": "{{contact.identity}}",

"type": "text/plain",

"content": "O Horário de atendimento chegou ao fim. Caso precise falar com algum atendente, entre aqui novamente amanhã das 08:00 às 18:00 horas."

}



O campo content é a mensagem que será enviada para o usuário, personalize-a como quiser.



3 - Por fim, eu defini a flag mensagemDeAlertaJaEnviada para controlar quando não enviar a mensagem novamente. Eu estou definindo essa variável com o valor true (mas pode ser qualquer valor) e definindo um tempo de uma hora (3600 segundos) para ela expirar. Essa variável é definida sempre que ela não existir ainda (para não sobrescrever o tempo de expiração) e quando estiver fora do horário de atendimento. Dessa forma, de uma em uma hora, caso o usuário continue conversando com o bot neste período, a mensagem será enviada novamente.





4 - Caso esteja utilizando um bot roteador, lembre-se de habilitar a opção de “Utilizar contexto do roteador” nas configurações do bot. Isso é necessário para que nossa requisição http que envia a mensagem tenha sucesso.





E é isso, não precisa alterar mais nada no bot. Para testar essa solução, criei um fluxo bem simples com 3 blocos que printam seus nomes.





Esse é o print do fluxo:





Caso queira analisar o bot que desenvolvi, este é o json para importar o fluxo dele.


experimental2.json (9,5,KB)



Por fim, essa mesma solução pode ser adaptada para outros cenários, basta mudar o script do primeiro ponto.



E é isso, qualquer dúvida podem mandar aqui que estou a disposição.

Muito bom! Valeu pela dica @raphael.silva


demais, @raphael.silva 🙂 ótimo conteúdo!!!


Olá. Obrigado pela postagem.

 

        Como posso fazer para desviar o fluxo do bot para outro estado através de uma ação global?

        Eu tenho um bot no Telegram e o usuário navega por esse bot através de menus. Porém, se a qualquer momento ele digitar um certo comando, quero poder desviar o fluxo para outro ponto.

       Na verdade, tenho uma razão mais específica para querer isso. Eu posso enviar um link para o usuário por outra plataforma, digamos e-mail. Se o usuário clica no link, o Telegram abre no celular dele automaticamente e meu bot é chamado.

      O bot recebe um comando /start acompanhado de alguns parâmetros que chegam via input.message.

      Eu quero reagir a esses parâmetros e pular para outro ponto. Não quero ter que editar cada bloco do bot para isso.

      Esse é um exemplo de link:

https://t.me/NomeDoMeuBot?start=param1_param2_param3

      Se eu clico nele, o bot abre no Telegram e eu encontro via {{input.message.content}} o valor “/start param1_param2_param3”.

     Eu posso extrair os parâmetros com um script, seja com uma ação no estado (bloco) em que o bot se encontra, seja com uma ação global.

    Porém, se eu estiver fazendo o tratamento em um bloco específico, posso depois usar uma condição de saída que desvie o fluxo. Não sei como fazer o mesmo usando uma ação global.

 

 

 

 


Observei uma outra coisa problemática. Uma ação global deveria poder ser executada na entrada (“antes do envio do primeiro conteúdo”) ou na saída (“após o envio do último conteúdo ou resposta do usuário”).

 

Aparentemente, se eu configuro a ação global para ocorrer na saída, ela é executada depois do último conteúdo, mas antes da entrada do usuário. Então, se o usuário digita “/start” ou se o “/start” surge por efeito dele ter clicado no link enviado por outra plataforma, eu não tenho como reagir a isso e desviar o fluxo para o lugar certo, mesmo alterando cada bloco para ter uma condição de saída a mais.

Ainda posso conseguir o efeito desejado extraindo os parâmetros usando scripts em cada bloco, mas isso não é prático.

Descobri uma solução melhor. Não uso ação global. Trato o efeito do comando no bloco de exceções. Lá extraio os parâmetros e faço o desvio para o lugar certo.

Ainda será preciso alterar a validação da entrada do usuário em cada bloco para aceitar qualquer coisa que comece com /start. Como não crio um condição de saída que trate o /start, o efeito é o de causar uma exceção.


Comente