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ável | Exemplo | Observação |
---|---|---|
$perfilname$ | José Maria dos Santos | Trocado pelo número do telefone caso não exista. |
$perfil-pushname$ | José Maria | Trocado 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 Atendimento | Nome de exibição no WhatsApp |
$ou(valor1|valor2)$ | valor 1 | Altena 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:
Comando | Ordem de Execução | Função |
---|---|---|
/FIRST_TIME_USER | 3 | Enviado em uma conversa nova (usuário novo), quando NÃO houve troca de mensagens nos últimos 30 dias. |
/START_SESSION | 4 | Enviado no início da conversa, quando HOUVE troca de mensagens nos últimos 30 dias. |
/FIRST_TIME_USER_FROM_ME | 1 | Enviado 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_ME | 2 | Enviado 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.
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ô.