Bot de Atención de WhatsApp
Para configurar tu bot de atención, ve al menú WhatsApp → Bots y registra un nuevo bot de atención usando el botón Nuevo ChatBot.
Puedes cambiar la funcionalidad del bot de dos maneras distintas: a través de JSON o del Editor Visual. Los cambios realizados en el editor se reflejarán en el JSON y viceversa.

Temas y Preguntas
La estructura básica del bot está organizada en Temas y Preguntas. Cada tema puede contener múltiples preguntas.

Programabilidad (Helper)
Varios aspectos del bot pueden ser programados para adaptarse mejor a tu empresa. Tienes acceso a todas las funciones del bot directamente en el editor de código:

Métodos disponibles en la clase helper:
void ClearAsked()
Limpia el historial de preguntas y respuestas.
void ClearVars()
Limpia las variables establecidas.
void CloseTicket(String TextMessage)
Finaliza la conversación.
void Debug(String debugLine)
Agrega un log de depuración.
void DebugVars()
Agrega variables al log de depuración.
String Deserialize(String json)
Deserializa una cadena JSON en un objeto.
Retorno: Object
void DisableBot()
Desactiva el bot.
void EnableBot()
Activa el bot.
void DisableTopic(String TopicName)
Desactiva el tema para el bot.
void EnableTopic(String TopicName)
Activa el tema para el bot.
void EnviaPerguntaPorId(String idPergunta)
Envía una pregunta al cliente por el ID dado.
String GetVar(String varName)
Recupera el valor de una variable.
Retorno: String con el valor de la variable.
void GoSub(String idPergunta)
Va a la subrutina especificada.
String HttpPost(String url, String Header, String Body, String ContentType)
Realiza un HTTP POST.
Retorno: String con el contenido devuelto después del post.
Boolean isNullOrEmpty(String value)
Verifica si el valor es nulo o vacío.
Retorno: true|false
Boolean isValidCnpj(String CNPJ)
Verifica si el CNPJ proporcionado es válido.
Retorno: true|false
Boolean isValidCpf(String Cpf)
Verifica si el CPF proporcionado es válido.
Retorno: true|false
Boolean isValidEmail(String email)
Verifica si el email proporcionado es válido.
Retorno: true|false
Boolean isValidNome(String Name)
Verifica si el nombre proporcionado es válido.
Retorno: true|false
void LastAskedPop()
Elimina la última respuesta recibida.
String LoadFromFile(String FileName)
Carga el contenido de un archivo.
Retorno: String con el contenido del archivo.
String LoadUrl(String url)
Carga contenido desde una URL externa.
Retorno: String con el contenido.
void ParseBadWordsFromText(String fileContent)
Agrega a la lista de palabras obscenas.
void ParseVariablesFromJSON(String fileContent)
Establece variables de entorno según el JSON proporcionado.
void ParseVariablesFromText(String fileContent)
Establece variables de entorno según el texto proporcionado.
String SaveVariablesToJSON()
Devuelve JSON que contiene las variables y sus respectivos valores.
String Serialize(Object obj)
Serializa un objeto a una cadena JSON.
Boolean RegularExpressionMatch(String regularExpression, String value)
Verifica si el valor coincide con la expresión regular proporcionada.
Retorno: true|false
String RegularExpressionValue(String regularExpression, String value, Int32 captureGroup)
Verifica si el valor coincide con la expresión regular proporcionada.
Retorno: String con el valor del grupo especificado.
void SendMessageTemplate(String TemplateIdOrName)
Envía un mensaje desde una plantilla pre-registrada.
void SendMessageText(String TextMessage)
Envía un mensaje de texto.
void SetPerguntaAtiva(String idPergunta)
Establece la pregunta como activa.
void SetTag(String newTag)
Agrega una etiqueta al contacto.
void SetVar(String varName, String|Object varValue)
Establece una variable.
void Sleep(int miliSeconds)
Pausa el procesamiento.
void StartTyping()
Envía el estado "Escribiendo" al cliente.
void TransferTicket(String DestinationLogin)
Transfiere el ticket a un agente.
void UpdateProfileStatus(String newStatus)
Actualiza el estado del perfil.
Variables Dinámicas
Variables que serán reemplazadas según el contacto actual.
| Variable | Ejemplo | Nota |
|---|---|---|
$perfilname$ | José Maria dos Santos | Reemplazado por número de teléfono si no está disponible. |
$perfil-pushname$ | José Maria | Reemplazado por número de teléfono si no está disponible. |
$jid$ | 5511998765432@s.whatsapp.net | |
$id_atendimento$ | 219482 | |
$id_profile$ | 30129292 | |
$robo_ativo$ | True/False | |
$pushname$ | Centro de Soporte | Nombre de visualización de WhatsApp |
$ou(value1|value2)$ | value 1 | Alterna aleatoriamente entre los valores |
Ejemplo de Bot
Copia el ejemplo de un bot preconfigurado a continuación para aprender el funcionamiento básico de la herramienta:
{
"Topicos": [
{
"Id": "1",
"Name": "Commands",
"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(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n // your code\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(\"End 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": "Data Topic",
"CondicaoInicio": "",
"CondicaoTermino": "",
"CondicaoInicioResultado": true,
"CondicaoTerminoResultado": false,
"Enabled": true,
"PerguntasPassivas": [
{
"Perguntas": [],
"RespostaPossiveis": [
{
"Resposta": "RIGHT",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n // your code\n String name = \"$0$\";\n helper.SetVar(\"NAME\",name);\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(\"End 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(\"Starting OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // your code\n retorno = helper.isValidNome(\"$0$\");\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End OnEvaluate - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"Default": false,
"ClearLast": true,
"RespostaRegEx": null,
"VariavelNome": null,
"VariavelValor": null
},
{
"Resposta": "WRONG",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n // your code\n helper.StartTyping();\n helper.Sleep(3000);\n helper.SendMessageText(\"Sorry, I didn't understand... Could you please type your FULL name again?\");\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(\"End 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(\"Starting OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // your code\n retorno = !helper.isValidNome(\"$0$\");\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End 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(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n // your code\n String name = helper.GetVar(\"NAME\");\n \n if(!helper.isValidNome(name))\n {\n helper.StartTyping();\n helper.Sleep(100);\n helper.SendMessageText(\"Hello! Who am I speaking with?\");\n } \n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n}",
"MaxCount": 0,
"UsedCount": 0,
"Id": "QUAL_NOME",
"CanEvaluate": true
},
{
"Perguntas": [],
"RespostaPossiveis": [
{
"Resposta": "RIGHT",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n // your code\n helper.SetVar(\"CPF\", helper.GetVar(\"0\"));\n helper.EnviaPerguntaPorId(\"END\");\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End 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(\"Starting OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // your code\n retorno = helper.isValidCpf(\"$0$\");\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End OnEvaluate - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"Default": false,
"ClearLast": true,
"RespostaRegEx": null,
"VariavelNome": null,
"VariavelValor": null
},
{
"Resposta": "WRONG",
"OnAnswerScript": "\nBoolean OnExecute(SalesBot.LambaHelper helper)\n {\n Boolean retorno = false;\n\n try \n {\n helper.Debug(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n helper.SendMessageText(\"Invalid CPF. Please enter it again:\");\n // your code\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End 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(\"Starting OnEvaluate - $NameContext$ - $NameObjext$\");\n\n // your code\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(\"End 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(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n // your code\n helper.Debug(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n String cpf = helper.GetVar(\"CPF\");\n String name = helper.GetVar(\"NAME\");\n \n if(!helper.isValidCpf(cpf))\n {\n helper.StartTyping();\n helper.Sleep(100);\n helper.SendMessageText(name + \", please enter your <b>CPF</b> to continue:\");\n } \n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End 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(\"Starting OnExecute - $NameContext$ - $NameObjext$\");\n\n helper.SendMessageText(\"Thank you!\\n\\nWe will contact you as soon as possible.\");\n\n // your code\n retorno = true;\n }\n catch(Exception ex)\n {\n helper.Debug(ex);\n }\n finally\n {\n helper.Debug(\"End OnExecute - $NameContext$ - $NameObjext$\");\n }\n \n return retorno;\n }\n",
"MaxCount": 0,
"UsedCount": 0,
"Id": "END",
"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
}
Crea tu bot, pega el contenido anterior en el editor JSON y haz clic en Importar en la parte inferior de la página.
Guarda tu bot y luego ejecuta la prueba.
Prueba tu bot
Antes de poner el bot en uso, es crucial ejecutar todas las pruebas necesarias. Usa la herramienta de pruebas disponible:

Para simular el ticket de soporte creado por el usuario en el entorno de pruebas, hay dos comandos especiales:

| Comando | Orden de Ejecución | Función |
|---|---|---|
/FIRST_TIME_USER | 3 | Enviado en una nueva conversación (usuario nuevo), cuando NO ha habido intercambio de mensajes en los últimos 30 días. |
/START_SESSION | 4 | Enviado al inicio de la conversación, cuando SÍ HA HABIDO intercambio de mensajes en los últimos 30 días. |
/FIRST_TIME_USER_FROM_ME | 1 | Enviado en una nueva conversación (sin intercambio de mensajes en los últimos 30 días) iniciada por el sistema (por un agente u otros medios, no por el usuario). |
/START_SESSION_FROM_ME | 2 | Enviado en una conversación iniciada por el agente o sistema (no por el usuario), donde ha habido intercambio de mensajes en menos de 30 días. |
Ambos comandos ejecutarán el tema con el mismo nombre e iniciarán tu script. Estos comandos son ejecutados automáticamente por el sistema en el entorno de producción.
Recuerda crear la pregunta con la entrada /START_SESSION o /FIRST_TIME_USER para procesar estos comandos e iniciar la sesión de soporte del bot.