Skip to main content

Robô de Atendimento

Para programar seu robô de atendimento, acesse o menu WhatsApp Robôs e cadastre um novo robô de atendimento através do botão Novo ChatBot

Você poderá alterar a funcionalidade do robô de duas formas distintas, por JSON ou pelo Editor visual. Sendo que as alterações realizadas no editor serão refletidas no JSON e vice-versa.

Tópicos e Perguntas

A estrutura básica do robô se atêm a Tópicos e Perguntas. Cada tópico poderá conter N perguntas.

Programabilidade (Helper)

Diversos aspectos do robô poderão ser programados para melhor atender sua empresa. Você terá acesso à todas as funções do robô diretamente no editor de código:

Métodos disponíveis da classe helper:

void ClearAsked()

Limpa histórico de perguntas e respostas.

void ClearVars()

Limpa as variáveis setadas.

void CloseTicket(String TextMessage)

Encerra conversa.

void Debug(String debugLine)

Insere log para debug.

void DebugVars()

Insere variáveis no log para debug.

String Deserialize(String json)

Deserializa String JSON para um Objeto.
Retorno: Objeto

void DisableBot()

Desabilita o robô.

void EnableBot()

Habilita o robô.

void DisableTopic(String TopicName)

Desabilita a utilização do tópico pelo robô.

void EnableTopic(String TopicName)

Habilita a utilização do tópico pelo robô.

void EnviaPerguntaPorId(String idPergunta)

Envia pergunta para o cliente conforme o ID informado.

String GetVar(String varName)

Resgata o valor de uma variável.
Retorno: String com o valor da variável.

void GoSub(String idPergunta)

Vai para a sub-rotina informada.

String HttpPost(String url, String Header, String Body, String ContentType)

Realiza um POST de HTTP.
Retorno: String com o conteúdo retornado após o post.

Boolean isNullOrEmpty(String valor)

Verifica se valor informado é nulo ou vazio.
Retorno: true|false

Boolean isValidCnpj(String CNPJ)

Verifica validade do CNPJ informado.
Retorno: true|false

Boolean isValidCpf(String Cpf)

Verifica validade do CPF informado.
Retorno: true|false

Boolean isValidEmail(String email)

Verifica validade do e-mail informado.
Retorno: true|false

Boolean isValidNome(String Nome)

Verifica validade do Nome informado.
Retorno: true|false

void LastAskedPop()

Remove última resposta recebida.

String LoadFromFile(String FileName)

Carrega o conteúdo de um arquivo.
Retorno: String com o conteúdo do arquivo.

String LoadUrl(String url)

Carrega conteúdo da uma URL externa.
Retorno: String com o conteúdo.

void ParseBadWordsFromText(String fileContent)

Insere na lista de palavras obscenas.

void ParseVariablesFromJSON(String fileContent)

Seta variáveis do ambiente de acordo com o JSON informado.

void ParseVariablesFromText(String fileContent)

Seta variáveis do ambiente de acordo com o texto informado.

String SaveVariablesToJSON()

Retorna JSON contendo as variáveis e seus respectivos valores.

String Serialize(Object obj)

Serializa objeto para uma String JSON.

Boolean RegularExpressionMatch(String regularExpression, String value)

Verifica se valor corresponde a expressão regular informada.
Retorno: true|false

String RegularExpressionValue(String regularExpression, String value, Int32 captureGroup)

Verifica se valor corresponde a expressão regular informada.
Retorno: String com o valor do grupo informado.

void SendMessageTemplate(String TemplateIdOrName)

Envia Mensagem de um template pré-cadastrado.

void SendMessageText(String TextMessage)

Envia Mensagem de texto.

void SetPerguntaAtiva(String idPergunta)

Seta a pergunta como ativa.

void SetTag(String newTag)

Adicionar tag ao contato.

void SetVar(String varName, String|Object varValue)

Seta variável.

void Sleep(int miliSeconds)

Pausa o processamento.

void StartTyping()

Envia status de "Digitando" ao cliente.

void TransferTicket(String DestinationLogin)

Transfere atendimento para um atendente.

void UpdateProfileStatus(String newStatus)

Atualiza o status do profile.

Variáveis dinâmicas

Variáveis que serão trocadas de acordo com o contato atual.

VariávelExemploObservação
$perfilname$José Maria dos SantosTrocado pelo número do telefone caso não exista.
$perfil-pushname$José MariaTrocado pelo número do telefone caso não exista.
$jid$5511998765432@s.whatsapp.net
$id_atendimento$219482
$id_profile$30129292
$robo_ativo$True/False
$pushname$Central de AtendimentoNome de exibição no WhatsApp
$ou(valor1|valor2)$valor 1Altena entre os valores de forma aleatória

Exemplo de robô

Copie o exemplo de um robô pré-configurado para conhecer o funcionamento básico da ferramenta:

{
"Topicos": [
{
"Id": "1",
"Name": "Comandos",
"CondicaoInicio": "",
"CondicaoTermino": "",
"CondicaoInicioResultado": true,
"CondicaoTerminoResultado": false,
"Enabled": true,
"PerguntasPassivas": [
{
"Perguntas": [
{
"IdFrase": 0,
"ListOfDependencies": [],
"DependencyCount": 0,
"Texto": "/FIRST_TIME_USER",
"OnAswerScript": "",
"OnEvaluateScript": ""
}
],
"RespostaPossiveis": [],
"Respostas": [],
"respostaIndex": 0,
"OnAnswerScript": "Boolean OnExecute(SalesBot.LambaHelper helper)\n{\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n helper.EnviaPerguntaPorId(\"QUAL_NOME\");\n \n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n}",
"MaxCount": 0,
"UsedCount": 0,
"Id": "FIRST_TIME_USER",
"CanEvaluate": true
}
],
"PerguntasAtivas": [],
"OnAnswerScript": "",
"OnStartScript": "",
"OnEndScript": "",
"CanEvaluate": true
},
{
"Id": "3",
"Name": "Topico dados",
"CondicaoInicio": "",
"CondicaoTermino": "",
"CondicaoInicioResultado": true,
"CondicaoTerminoResultado": false,
"Enabled": true,
"PerguntasPassivas": [
{
"Perguntas": [],
"RespostaPossiveis": [
{
"Resposta": "CERTA",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n String nome = \"$0$\";\n helper.SetVar(\"NOME\",nome);\n helper.ClearAsked();\n helper.EnviaPerguntaPorId(\"QUAL_CPF\");\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"OnValidationScript": "\n Boolean OnEvaluate(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n retorno = helper.isValidNome(\"$0$\");\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnEvaluate - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"Default": false,
"ClearLast": true,
"RespostaRegEx": null,
"VariavelNome": null,
"VariavelValor": null
},
{
"Resposta": "ERRADA",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n helper.StartTyping();\n helper.Sleep(3000);\n helper.SendMessageText(\"Desculpa não entendi... Poderia digitar novamente seu nome COMPLETO?\");\n helper.Sleep(3000);\n helper.EnviaPerguntaPorId(\"QUAL_NOME\");\n\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"OnValidationScript": "\n Boolean OnEvaluate(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n retorno = !helper.isValidNome(\"$0$\");\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnEvaluate - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"Default": true,
"ClearLast": false,
"RespostaRegEx": null,
"VariavelNome": null,
"VariavelValor": null
}
],
"Respostas": [],
"respostaIndex": 0,
"OnAnswerScript": "Boolean OnExecute(SalesBot.LambaHelper helper)\n{\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n String nome = helper.GetVar(\"NOME\");\n \n if(!helper.isValidNome(nome))\n {\n helper.StartTyping();\n helper.Sleep(100);\n helper.SendMessageText(\"Olá! Com quem eu falo?\");\n } \n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n}",
"MaxCount": 0,
"UsedCount": 0,
"Id": "QUAL_NOME",
"CanEvaluate": true
},
{
"Perguntas": [],
"RespostaPossiveis": [
{
"Resposta": "CERTO",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n helper.SetVar(\"CPF\", helper.GetVar(\"0\"));\n helper.EnviaPerguntaPorId(\"FIM\");\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"OnValidationScript": "\n Boolean OnEvaluate(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n retorno = helper.isValidCpf(\"$0$\");\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnEvaluate - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"Default": false,
"ClearLast": true,
"RespostaRegEx": null,
"VariavelNome": null,
"VariavelValor": null
},
{
"Resposta": "ERRADO",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n helper.SendMessageText(\"CPF inválido. Digite novamente por favor:\");\n // seu codigo\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"OnValidationScript": "\n Boolean OnEvaluate(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n String CPF = helper.GetVar(\"0\");\n\n retorno = !helper.isValidCpf(CPF);\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnEvaluate - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"Default": true,
"ClearLast": false,
"RespostaRegEx": null,
"VariavelNome": null,
"VariavelValor": null
}
],
"Respostas": [],
"respostaIndex": 0,
"OnAnswerScript": "Boolean OnExecute(SalesBot.LambaHelper helper)\n{\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n // seu codigo\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n String cpf = helper.GetVar(\"CPF\");\n String nome = helper.GetVar(\"NOME\");\n \n if(!helper.isValidCpf(cpf))\n {\n helper.StartTyping();\n helper.Sleep(100);\n helper.SendMessageText(nome + \", digite seu <b>CPF</b> para continuar:\");\n } \n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n}",
"MaxCount": 0,
"UsedCount": 0,
"Id": "QUAL_CPF",
"CanEvaluate": true
},
{
"Perguntas": [],
"RespostaPossiveis": [],
"Respostas": [],
"respostaIndex": 0,
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Iniciando OnExecute - $NameContext$ - $NameObjext$\");\n\n helper.SendMessageText(\"Obrigado!\\n\\nEntraremos em contato o mais breve possível.\");\n\n // seu codigo\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"Fim OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"MaxCount": 0,
"UsedCount": 0,
"Id": "FIM",
"CanEvaluate": true
}
],
"PerguntasAtivas": [],
"OnAnswerScript": "",
"OnStartScript": "",
"OnEndScript": "",
"CanEvaluate": true
}
],
"HistoricoConversa": [],
"BadWords": null,
"BadWordTopic": null,
"Enabled": true,
"OnLoadScript": "",
"OnUnLoadScript": "",
"OnInputScript": "",
"OnTimerScript": "",
"OnIdleScript": "",
"OnAnswerScript": "",
"OnBadWordScript": "",
"BadWordTopicName": "",
"IdCount": 0,
"OnUnknowScript": "",
"IdleTimeInSecconds": 60,
"TimerTimeInSecconds": 5
}

Crie seu robô, cole o conteúdo acima no editor JSON e clique em Importar no final da página.

Salve o seu robô e em seguida faça o teste.

Teste seu robô

Antes de colocar o robô para uso é crucial que você faça todos os testes necessários. Para isso utilize a ferramenta disponível para testes:

Para simular o ticket de atendimento criado pelo usuário dentro do ambiente de testes, existem dois comandos especiais:

ComandoOrdem de ExecuçãoFunção
/FIRST_TIME_USER3Enviado em uma conversa nova (usuário novo), quando NÃO houve troca de mensagens nos últimos 30 dias.
/START_SESSION4Enviado no início da conversa, quando HOUVE troca de mensagens nos últimos 30 dias.
/FIRST_TIME_USER_FROM_ME1Enviado em uma conversa nova (sem troca de mensagens nos últimos 30 dias) que foi iniciada através do sistema (por um atendente, ou outra forma que não pelo usuário).
/START_SESSION_FROM_ME2Enviado em uma conversa iniciada pelo atendente ou sistema (não pelo usuário), em que houve troca de mensagens em menos de 30 dias.

Ambos os comandos irão executar o tópico de mesmo nome, e dará o start ao seu script. Estes comandos são executados automaticamente pelo sistema no ambiente de produção.

Importante

Lembre-se de que criar a pergunta com a entrada /START_SESSION ou /FIRST_TIME_USER para processar estes comandos e dar inicio ao atendimento pelo robô.