18 Commits

Author SHA1 Message Date
5916ba6615 fix: posible problema en envio masivo 2023-01-25 21:26:55 -06:00
4b5aabf09a Update Dockerfile 2023-01-15 20:47:13 -06:00
487ba83f7c Merge branch 'master' of https://github.com/cheveguerra/botLeiferAurik-Mod_2.0 2023-01-15 20:45:28 -06:00
7591feb598 dockerfile 2023-01-15 20:45:23 -06:00
554d9b2f4f Update package.json 2023-01-15 20:32:31 -06:00
ee4c00cb46 Update package.json 2023-01-15 20:29:21 -06:00
c31fc1d201 Update package.json 2023-01-15 20:27:57 -06:00
dfd2c7d97d Update package.json 2023-01-15 20:26:00 -06:00
44921e7b78 Update package.json 2023-01-15 20:18:12 -06:00
55012a9d88 docs: mods 2023-01-15 15:30:44 -06:00
1660cf46c3 docs: error en texto 2023-01-15 15:25:33 -06:00
ef9917e954 docs: explicación de submenus mas completa 2023-01-15 15:21:09 -06:00
7febd90e56 feat:se agrego el envio de varios msjs juntos 2023-01-15 14:44:13 -06:00
e8847800f6 agregamos .env 2023-01-07 23:46:57 -06:00
ee79cd9dab cambio en gitignore para conservar .env 2023-01-07 23:46:07 -06:00
b8bf6d1107 cambios en response.json 2023-01-07 16:20:19 -06:00
4cc92a1d80 Merge branch 'master' of https://github.com/cheveguerra/botLeiferAurik-Mod_2.0 2023-01-07 15:46:22 -06:00
828030e424 changed whatsapp-web.js branch to mine! 2023-01-07 15:45:33 -06:00
11 changed files with 278 additions and 91 deletions

15
.env Normal file
View File

@@ -0,0 +1,15 @@
######DATABASE: none, mysql, dialogflow
DEFAULT_MESSAGE=true
SAVE_MEDIA=true
PORT=3005
DATABASE=none
LANGUAGE=es
SQL_HOST=
SQL_USER=
SQL_PASS=
SQL_DATABASE=
KEEP_DIALOG_FLOW=false
MULTI_DEVICE=true
DIALOGFLOW_MEDIA_FOR_SLOT_FILLING=false
GDRIVE_FOLDER_ID=

1
.gitignore vendored
View File

@@ -8,7 +8,6 @@ media/*
mediaSend/*
!mediaSend/.gitkeep
!mediaSend/nota-de-voz.mp3
.env
.wwebjs_auth
backup
backup/*

23
Dockerfile Normal file
View File

@@ -0,0 +1,23 @@
FROM node:18-alpine as node
# Installs latest Chromium (92) package.
RUN apk add --no-cache \
chromium \
nss \
freetype \
harfbuzz \
ca-certificates \
ttf-freefont \
nodejs \
yarn
# Tell Puppeteer to skip installing Chrome. We'll be using the installed package.
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
# Puppeteer v10.0.0 works with Chromium 92.
COPY . .
RUN npm install puppeteer@10.0.0
RUN npm install
CMD ["npm", "start"]

View File

@@ -4,19 +4,29 @@
Este proyecto es un clon de la **version 1** (legacy) de [Leifer Mendez](https://github.com/leifermendez/bot-whatsapp) y tiene las siguientes modificaciones:
- Permite **submenus**.
- Un submenú es una regla que **sólo se dispara** cuando la regla anterior es la especificada, los submenus se definen agregando el parametro "```pasoRequerido```" en el **response.json**.
- Un submenú es un paso que **sólo se dispara** cuando el paso anterior es el especificado, los submenus se definen agregando el parametro "```pasoRequerido```" en el **response.json**, entonces si queremos que el paso **zapatos** solo se muestre cuando antes pasamos por el **menú inicial**, agregamos el parámetro "pasoRequerido" a la regla "zapatos", de esta forma si alguien pone el número **1** sin estar en el menú principal, **no** los va a mandar a **zapatos**.
```json
"menu":{
"replyMessage":[
"%saludo%\nHoy es %dia_semana%.\n"
"%saludo%",
"Escribe 1 para zapatos.",
"Escribe 2 para bolsos."
],
"media":null,
"trigger":null
},
"submenu":{
"zapatos":{
"replyMessage":[
"Este submenu solo se dispara si **ANTES** se disparó la regla 'menu'"
"Esta es la lista de nuestros zapatos."
],
"media":null,
"trigger":null,
"pasoRequerido":"menu"
},
"bolsos":{
"replyMessage":[
"Esta es la lista de nuestros bolsos."
],
"media":null,
"trigger":null,
@@ -47,11 +57,38 @@ Este proyecto es un clon de la **version 1** (legacy) de [Leifer Mendez](https:/
}
```
- Permite **remplazos** en el texto de los mensajes por ejemplo:
- __%saludo%__ para que aparezca "Buenos días, tardes o noches" dependiendo de la hora.
- __%primer_nombre%__ para que aparezca el nombre (hasta el primer espacio) del remitente.
- __%dia_semana%__ para que aparezca "lunes, martes, miercoles, etc" dependiendo del día de la semana.
- __%msjant_XX%__ para que aparezca el mensaje xx anterior, es decir, si quieres mostrar el texto de 2 mensajes anteriores se pone %msjant_2%.
- Ponemos __%saludo%__ para que aparezca "Buenos días, tardes o noches" dependiendo de la hora.
- Ponemos __%primer_nombre%__ para que aparezca el nombre (hasta el primer espacio) del remitente.
- Ponemos __%dia_semana%__ para que aparezca "lunes, martes, miercoles, etc" dependiendo del día de la semana.
- Ponemos __%msjant_XX%__ para que aparezca el mensaje xx anterior, es decir, si quieres mostrar el texto de 2 mensajes anteriores se pone %msjant_2%.
- etc, etc, se pueden agregar mas remplazos en la funcion "remplazos" en el archivo "adapter\index.js".
- Permite el envío de **multiples mensajes** definidos en la **misma respuesta** del **response.json**. (Esta modificación se la robe por completo a [KJoaquin](https://github.com/KJoaquin), el lo solucionó [aquí](https://github.com/codigoencasa/bot-whatsapp/issues/111#issuecomment-1353504575) 🙌🏽 y yo solo lo adapté a mi repo!)
Antes:
```json
{
"ejemploViejo":{
"replyMessage":["¿Hola como estas?"],
"media":null,
"trigger":null
}
}
```
Ahora **replyMessage** debe de contener un arreglo con los mensajes que se van a enviar:
```json
{
"ejemploNuevo":{
"replyMessage":[
{ "mensaje":["¿Hola como estas?"]},
{ "mensaje":["Este es el *segundo* mensaje.","Contiene dos lineas 🤪"]},
{ "mensaje":["Este es el *tercer* mensaje"]}
],
"media":null,
"trigger":null
}
}
```
- Las modificaciones están enfocadas al uso de los archivos __initial.json__ y __response.json__, yo no uso MySQL o DialogFlow, así que no sé si las modificaciones funcionen con esos modulos, en particular el __remplazo %msjant_XX%__ depende de los archivos __JSON__ que se crean en el directorio "chats".
- Tiene agregado el parche de **botones y listas**, así que funcionan sin problema (las listas no funcionan si el bot esta ligado a un número que use **Whatsapp Business**).
- Tiene los ultimos parches de **DialogFlow** (27-dic-2022) (When Dialogflow asks for an Image, then **Upload it to Google Drive** and then generate Shared Link)

View File

@@ -83,7 +83,7 @@ const get = (message, num) => new Promise((resolve, reject) => { //MOD by CHV -
else{x = null;}
} else
{ console.log("NO CUMPLE PASO REQ");
// console.log("pasoReq=" + resps[stepsInitial[i].key.toString()].pasoRequerido + " - PasoAnt=" + ultimoStep)
console.log("pasoReq=" + resps[stepsInitial[i].key.toString()].pasoRequerido + " - PasoAnt=" + ultimoStep)
}
}
}
@@ -100,7 +100,7 @@ const get = (message, num) => new Promise((resolve, reject) => { //MOD by CHV -
// console.log(elNum)
if(vamosA != "" && vamosA != undefined && cumplePasoPrevio == true){
console.log("ASIGNAMOS VAMOSA = " + vamosA);
// console.log("ASIGNAMOS VAMOSA = " + vamosA);
pasoAnterior[elNum] = vamosA;
}
// console.log("ULTIMOSTEP="+ultimoStep)
@@ -131,8 +131,9 @@ const reply = (step) => new Promise((resolve, reject) => {
const responseFind = stepsReponse[step] || {};
resData = {
...resData,
...responseFind,
replyMessage:responseFind.replyMessage.join('')}
...responseFind
// replyMessage:responseFind.replyMessage.join('')
}
resolve(resData);
return
}

43
app.js
View File

@@ -157,7 +157,12 @@ const listenMessage = () => client.on('message', async msg => {
if (lastStep) {
const response = await responseMessages(lastStep)
console.log("CLIENT="+client+", FROM:"+from+", REPLYMESSAGE:"+response.replyMessage);
await sendMessage(client, from, response.replyMessage, lastStep);
// await sendMessage(client, from, response.replyMessage, lastStep); // Mod by CHV - Para mandar varios mensajes en el mismo response, se cambio esta linea por el forEach de abajo.
response.replyMessage.forEach( async messages => {
var thisMsg = messages.mensaje
if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')}
await sendMessage(client, from, remplazos(thisMsg, client), response.trigger);
})
}
/**
@@ -193,14 +198,20 @@ const listenMessage = () => client.on('message', async msg => {
}, response.delay)
}
if (response.delay){
// console.log("+++++++++++++++++++ SENDING MSG WITH DELAY ("+response.delay+") +++++++++++++++++");
setTimeout(() => {
sendMessage(client, from, nuevaRespuesta, response.trigger, step);
// console.log(" ************* Msg with delay SENT ****************")
// await sendMessage(client, from, nuevaRespuesta, response.trigger, step); // Mod by CHV - Para mandar varios mensajes en el mismo response, se cambio esta linea por el forEach de abajo.
response.replyMessage.forEach( async messages => {
var thisMsg = messages.mensaje
if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')}
await sendMessage(client, from, remplazos(thisMsg, client), response.trigger);
}, response.delay)
}
else{
await sendMessage(client, from, nuevaRespuesta, response.trigger, step);
// await sendMessage(client, from, nuevaRespuesta, response.trigger, step); // Mod by CHV - Para mandar varios mensajes en el mismo response, se cambio esta linea por el forEach de abajo.
response.replyMessage.forEach( async messages => {
var thisMsg = messages.mensaje
if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')}
await sendMessage(client, from, remplazos(thisMsg, client), response.trigger);
})
}
if(response.hasOwnProperty('actions')){
const { actions } = response;
@@ -240,8 +251,8 @@ const listenMessage = () => client.on('message', async msg => {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function retardo() {
for (i=0;i<masivo.length;i++) {
console.log(masivo[i].numero+"@c.us");
for (sp=0;sp<masivo.length;sp++) {
console.log(masivo[sp].numero+"@c.us");
var rnd = getRandomInt(1,7); // Random entre 1 y 6 segundos.
if(rnd==1||rnd==4){saludo = "Hola ";}
else if(rnd==2||rnd==5){saludo = "Saludos ";}
@@ -252,12 +263,12 @@ const listenMessage = () => client.on('message', async msg => {
else if(rnd==4){caritas = "👧🏽🧔🏽";}
else if(rnd==5){caritas = "👩🏻‍🦰🧔🏽";}
else if(rnd==6){caritas = "🧔🏽👩🏻‍🦰";}
if(i % 15 === 0){console.log("******** VAN 15, HACEMOS PAUSA DE 10 SEGUNDOS ********"); await sleep(10000);} //
console.log(`============= Mandamos el mensaje ${i} ==============`);
if(sp % 15 === 0){console.log("******** VAN 15, HACEMOS PAUSA DE 10 SEGUNDOS ********"); await sleep(10000);} //
console.log(`============= Mandamos el mensaje ${sp} ==============`);
var elTextoDelMensaje = caritas + " *" + saludo + "amigo tendero* ❗❗👋🏻\n🕊 *GUNA* trae para ti dinámicas digitales, con las que podrás participar para ganar increíbles premios. 🏆💸💰\nSigue los siguientes pasos: 😃\n*1.* 📲Sigue la página de Yo Soy Guna en Facebook en la siguiente liga ➡️ https://www.facebook.com/yosoyguna\n*2.* 👉🏻Es importante des click en el botón Me Gusta 👍\n*3.* 🧐Sigue la dinámica que publicaremos , subiendo tu foto 📸 con los siguientes #yosoyguna #gunatenderos #gunachampions\n*4.* 🥳🎉En esta misma página , podrás ver publicados los ganadores🏅 y el tiempo en que serán elegidos. 💲 Además de tener acceso a increíbles promociones 🤑";
sendMedia(client, masivo[i].numero+"@c.us", "envioMasivoGuna.jpg");
sendMedia(client, masivo[sp].numero+"@c.us", "envioMasivoGuna.jpg");
await sleep(500);
client.sendMessage(masivo[i].numero+"@c.us", remplazos(elTextoDelMensaje, client));
client.sendMessage(masivo[sp].numero+"@c.us", remplazos(elTextoDelMensaje, client));
// client.sendMessage(masivo[i].numero+"@c.us", "Este es un mensaje de prueba para *"+masivo[i].numero+"*, HORA:*"+new Date().toLocaleTimeString()+"*");
console.log(`Esperamos ${rnd} segundos...`);
await sleep(rnd*1000);
@@ -276,7 +287,13 @@ const listenMessage = () => client.on('message', async msg => {
//Si quieres tener un mensaje por defecto
if (process.env.DEFAULT_MESSAGE === 'true') {
const response = await responseMessages('DEFAULT')
await sendMessage(client, from, response.replyMessage, response.trigger);
// await sendMessage(client, from, response.replyMessage, response.trigger); // Mod by CHV - Para mandar varios mensajes en el mismo response, se cambio esta linea por el forEach de abajo.
response.replyMessage.forEach( async messages => {
var thisMsg = messages.mensaje
if(Array.isArray(messages.mensaje)){thisMsg = messages.mensaje.join('\n')}
await sendMessage(client, from, remplazos(thisMsg, client), response.trigger);
})
/**
* Si quieres enviar botones
*/

View File

@@ -63,6 +63,7 @@ const sendMessage = async (client, number = null, text = null, trigger = null, r
number = cleanNumber(number)
const message = text
client.sendMessage(number, message);
console.log(number, message, regla)
await readChat(number, message, trigger, regla) //MOD by CHV - Agregamos el parametro "regla"
console.log(`⚡⚡⚡ Enviando mensajes....`);
// console.log("********************* SEND MESSAGE **************************************");

View File

@@ -55,6 +55,10 @@
"keywords": ["6"],
"key": "botonespaq3"
},
{
"keywords": "7|*doble*mensaje*",
"key": "doblemensaje"
},
{
"keywords": ["cursos"],
"key": "cursos"

View File

@@ -1,39 +1,63 @@
{
"DEFAULT":{
"replyMessage":[
"*Esta respuesta es un respuesta default* cuando no se consigue una palabra clave \n",
"la puedes desactivar en tu archivo .env DEFAULT_MESSAGE=false \n",
"tambien te quiero recordar que si presentas algun error pasarte por el repositorio \n",
"https://github.com/leifermendez/bot-whatsapp#chatbot-whatsapp-opensource \n",
"y recuerda tener la ultima versión del proyecto \n\n",
"Prueba escribiendo *hola* \n"
{ "mensaje":[
"*Esta es una respuesta por default* para cuando no se encuentra una palabra clave predefinida.",
"Se puede desactivar en el archivo .env DEFAULT_MESSAGE=false",
"tambien te quiero recordar que si presentas algun error pasarte por el repositorio",
"https://github.com/leifermendez/bot-whatsapp#chatbot-whatsapp-opensource",
"y recuerda tener la ultima versión del proyecto.",
"Prueba escribiendo */Menu*"
]
}
],
"media":null,
"trigger":null
},
"doblemensaje":{
"replyMessage":[
{"mensaje":["Este es un ejemplo del envío de *varios* mensajes con la *misma regla* en el *response.json*"]},
{
"mensaje":["Este es el *segundo* mensaje.","Contiene dos lineas 🤪"]
},
{"mensaje":["Este es el *tercer* mensaje, los *tres* van definidos en la *misma regla* del *response.json*"]}
],
"media":null,
"trigger":null,
"goto":"menu"
},
"menu":{
"replyMessage":[
"%saludo% %primer_nombre%, este es el menú, selecciona una opción: \n",
"Pon *1* para mensajes anteriores.\n",
"Pon *2* para ver remplazos.\n",
"Pon *3* para pedir nombre (RegExp).\n",
"Pon *4* para un ejemplo de listas y expresiones regulares.\n",
"Pon *5* para un ejemplo de botones.\n",
"Pon *6* para un ejemplo de botones y regExp.\n"
],
{
"mensaje":[
"%saludo% %primer_nombre%, este es el *menú*, selecciona una opción:",
"Pon *1* para ver mensajes anteriores.",
"Pon *2* para ver remplazos.",
"Pon *3* para pedir nombre (RegExp).",
"Pon *4* para un ejemplo de listas y expresiones regulares.",
"Pon *5* para un ejemplo de botones.",
"Pon *6* para un ejemplo de botones y regExp.",
"Pon *7* para un ejemplo de envío de *tres* mensajes en una *misma* regla."
]
}
] ,
"media":null,
"trigger":null
},
"opcion1":{
"replyMessage":[
"Seleccionaste la opción 1\n",
"*Ultimo mensaje:*\n",
"%msjant_0%\n",
"*Penultimo mensaje:*\n",
"%msjant_1%\n",
"*Antepenultimo mensaje:*\n",
"%msjant_2% \n\n",
"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 3 sin necesidad de volver a iniciar con */menu*."
{
"mensaje":[
"Seleccionaste la *opción 1*",
"*Ultimo mensaje:*",
"%msjant_0%",
"*Penultimo mensaje:*",
"%msjant_1%",
"*Antepenultimo mensaje:*",
"%msjant_2% \n",
"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."
]
}
],
"media":null,
"pasoRequerido":"menu",
@@ -41,12 +65,16 @@
},
"opcion2":{
"replyMessage":[
"Seleccionaste la opción 2\n",
"Remplazamos %saludo.% con *\"%saludo%\"*\n",
"Remplazamos %dia_semana.% con *\"%dia_semana%\"*\n",
"Remplazamos %hora24.%:%minutos.% con *\"%hora24%:%minutos%\"*\n",
"Remplazamos %.rnd_👍🏽,🤞🏼,🤪,🤔% con '%rnd_👍🏽,🤞🏼,🤪,🤔%'\n\n",
"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 3 sin necesidad de volver a iniciar con */menu*."
{
"mensaje":[
"Seleccionaste la *opción 2*",
"Remplazamos %saludo.% con *\"%saludo%\"*",
"Remplazamos %dia_semana.% con *\"%dia_semana%\"*",
"Remplazamos %hora24.%:%minutos.% con *\"%hora24%:%minutos%\"*",
"Remplazamos %.rnd_👍🏽,🤞🏼,🤪,🤔% con '%rnd_👍🏽,🤞🏼,🤪,🤔%'\n",
"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."
]
}
],
"media":null,
"pasoRequerido":"menu",
@@ -54,18 +82,26 @@
},
"opcion3":{
"replyMessage":[
"Seleccionaste la opción 3\n\n",
"Por favor dame tu nombre.\n\n",
"Aquí vamos a aceptar *cualquier* texto, porque en el *initial.json* tenemos keywords : \"***\" (un asterisco en expresiones regulares quiere decir *\"cualquier cosa\"*)\n",
"Y en *response.json* en la opción correspondiente tenemos \"pasoRequerido\" : \"menu\", que quiere decir que SOLO se va a disparar cuando el paso anterior sea \"menu\"."
{
"mensaje":[
"Seleccionaste la *opción 3*\n",
"Por favor dame tu nombre.\n",
"Aquí vamos a aceptar *cualquier* texto, porque en el *initial.json* tenemos keywords : \"*\" (un asterisco en expresiones regulares quiere decir *\"cualquier cosa\"*)",
"Y en *response.json* en la opción correspondiente tenemos \"pasoRequerido\" : \"menu\", que quiere decir que SOLO se va a disparar cuando el paso anterior sea \"menu\"."
]
}
],
"media":null,
"pasoRequerido":"menu"
},
"recibenombre":{
"replyMessage":[
"Gracias por tu nombre *%msjant_0%*.\n\n",
"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 3 sin necesidad de volver a iniciar con */menu*."
{
"mensaje":[
"Gracias por tu nombre *%msjant_0%*.\n",
"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."
]
}
],
"media":null,
"trigger":null,
@@ -74,7 +110,11 @@
},
"gRevisaCliente":{
"replyMessage":[
"/URL=http://localhost:8888/dbrquery?j={\"query\":\"select_revisacliente_GUNA\",\"exec\":\"ExecuteQuery\",\"params\":{\"par1\":\"XXPARAM1XX\"}}"
{
"mensaje":[
"/URL=http://localhost:8888/dbrquery?j={\"query\":\"select_revisacliente_GUNA\",\"exec\":\"ExecuteQuery\",\"params\":{\"par1\":\"XXPARAM1XX\"}}"
]
}
],
"media":null,
"trigger":null,
@@ -82,7 +122,11 @@
},
"gGuardainfo":{
"replyMessage":[
"/URL=http://localhost:8888/dbrquery?j={\"query\":\"insert_registroGallina_GUNA\",\"exec\":\"ExecuteCommand\",\"params\":{\"par1\":\"XXPARAM1XX\", \"par2\":\"XXPARAM2XX\", \"par3\":\"XXPARAM3XX\", \"par4\":\"XXPARAM4XX\"}}"
{
"mensaje":[
"/URL=http://localhost:8888/dbrquery?j={\"query\":\"insert_registroGallina_GUNA\",\"exec\":\"ExecuteCommand\",\"params\":{\"par1\":\"XXPARAM1XX\", \"par2\":\"XXPARAM2XX\", \"par3\":\"XXPARAM3XX\", \"par4\":\"XXPARAM4XX\"}}"
]
}
],
"media":null,
"trigger":null,
@@ -90,14 +134,26 @@
},
"rnd":{
"replyMessage":[
"%saludo%\nHoy es %dia_semana%.\nSon las %hora24%:%minutos% hrs.\nSon las %hora12%:%minutos% %ampm%\n*Palabra random:* %rnd_arbol,burro,cabra,dinosaurio,elefante,fuego,gorila%\n*Emoji random:* %rnd_👍🏽,😁,🤣,🤔,🤦🏽‍♂️,🙄,😎%\n*Número random:* %rnd_1,2,3,4,5,6,7%\n"
{
"mensaje":[
"%saludo%",
"Hoy es %dia_semana%.",
"Son las %hora24%:%minutos% hrs.",
"Son las %hora12%:%minutos% %ampm%",
"*Palabra random:* %rnd_arbol,burro,cabra,dinosaurio,elefante,fuego,gorila%",
"*Emoji random:* %rnd_👍🏽,😁,🤣,🤔,🤦🏽‍♂️,🙄,😎%",
"*Número random:* %rnd_1,2,3,4,5,6,7%\n"
]
}
],
"media":null,
"trigger":null
},
"rnd2":{
"replyMessage":[
""
{
"mensaje":[""]
}
],
"media":null,
"trigger":null,
@@ -114,12 +170,14 @@
},
"lista":{
"replyMessage":[
"*%saludo%*, este es un ejemplo de listas"
{
"mensaje":["*%saludo%*, este es un ejemplo de listas"]
}
],
"media":null,
"trigger":null,
"actions":{
"body":"Hola *%primer_nombre%*, estos son ejemplos del uso de expresiones regulares, todas las opciones de la lista disparan la misma regla:\n\n'*pak*3*|*pak*angular*|*paquete*3*|*paquete*angular*'\n\nAutomáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*.",
"body":"Hola *%primer_nombre%*, estos son ejemplos del uso de expresiones regulares, *todas* las opciones de la *lista* disparan la misma regla:\n\n'*pak*3*|*pak*angular*|*paquete*3*|*paquete*angular*'\n\nAutomáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*.",
"buttonText":"Ver los ejemplos de RegEx",
"sections": [
{"title":"Selecciona un mensaje:",
@@ -138,14 +196,16 @@
},
"botones":{
"replyMessage":[
"*%saludo%*, este es un ejemplo de botones"
{
"mensaje":["*%saludo%*, este es un ejemplo de botones"]
}
],
"media":"https://media2.giphy.com/media/VQJu0IeULuAmCwf5SL/giphy.gif",
"trigger":null,
"actions":{
"title":"¿Que te interesa ver %primer_nombre%?",
"message":"Recuerda todo este contenido es gratis y estaria genial que me sigas!",
"footer":"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*.",
"footer":"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*.",
"buttons":[
{"body":"Cursos"},
{"body":"Youtube"},
@@ -156,56 +216,86 @@
"goto":"menu"
},
"cursos":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *Cursos*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"replyMessage":[
{
"mensaje":["*%saludo% %primer_nombre%*, seleccionaste *Cursos*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."]
}
],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"youtube":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *YouTube*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"replyMessage":[
{
"mensaje":["*%saludo% %primer_nombre%*, seleccionaste *YouTube*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."]
}
],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"telegram":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *Telegram*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"replyMessage":[
{
"mensaje":["*%saludo% %primer_nombre%*, seleccionaste *Telegram*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."]
}
],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"manzana":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *manzana*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"replyMessage":[
{
"mensaje":["*%saludo% %primer_nombre%*, seleccionaste *manzana*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."]
}
],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"mango":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *mango*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"replyMessage":[
{
"mensaje":["*%saludo% %primer_nombre%*, seleccionaste *mango*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."]
}
],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"platano":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste *platano*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"replyMessage":[
{
"mensaje":["*%saludo% %primer_nombre%*, seleccionaste *platano*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."]
}
],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"paq3":{
"replyMessage":["*%saludo% %primer_nombre%*, seleccionaste el *paquete 3 de Angular*\n\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*."],
"replyMessage":[
{
"mensaje":["*%saludo% %primer_nombre%*, seleccionaste el *paquete 3 de Angular*\n","Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 7 sin necesidad de volver a iniciar con */menu*."]
}
],
"trigger":null,
"pasoRequerido":"menu",
"goto":"menu"
},
"botonespaq3":{
"replyMessage":[
"*%saludo%*, este es un ejemplo de botones y regExp"
{
"mensaje":["*%saludo%*, este es un ejemplo de botones y regExp"]
}
],
"media":null,
"trigger":null,
"actions":{
"title":"Hola %primer_nombre%, escoge un mensaje:",
"message":"Estos son ejemplos del uso de expresiones regulares, todos los botones disparan la misma regla:\n\n'*pak*3*|*pak*angular*|*paquete*3*|*paquete*angular*'\n\n",
"message":"Estos son ejemplos del uso de expresiones regulares, *todos* los botones disparan la misma regla:\n\n'*pak*3*|*pak*angular*|*paquete*3*|*paquete*angular*'\n\n",
"footer":"Automáticamente el flujo se regresa al *menú*, asi que puedes poner nuevamente un número del 1 al 5 sin necesidad de volver a iniciar con */menu*.",
"buttons":[
{"body":"Me gusta el paquete 3"},

22
package-lock.json generated
View File

@@ -25,7 +25,7 @@
"qrcode-terminal": "^0.12.0",
"socket.io": "^4.5.1",
"stormdb": "^0.6.0",
"whatsapp-web.js": "github:pedroslopez/whatsapp-web.js#fix-buttons-list",
"whatsapp-web.js": "github:cheveguerra/whatsapp-web.js#WaWJS",
"xlsx": "^0.18.5"
},
"devDependencies": {
@@ -1526,9 +1526,9 @@
}
},
"node_modules/engine.io-parser": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
"integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.5.tgz",
"integrity": "sha512-mjEyaa4zhuuRhaSLOdjEb57X0XPP9JEsnXI4E+ivhwT0GgzUogARx4MqoY1jQyB+4Bkz3BUOmzL7t9RMKmlG3g==",
"engines": {
"node": ">=10.0.0"
}
@@ -2142,9 +2142,9 @@
}
},
"node_modules/gcp-metadata": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.1.0.tgz",
"integrity": "sha512-QVjouEXvNVG/nde6VZDXXFTB02xQdztaumkWCHUff58qsdCS05/8OPh68fQ2QnArfAzZTwfEc979FHSHsU8EWg==",
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.2.0.tgz",
"integrity": "sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==",
"dependencies": {
"gaxios": "^5.0.0",
"json-bigint": "^1.0.0"
@@ -4774,9 +4774,9 @@
}
},
"node_modules/systeminformation": {
"version": "5.16.9",
"resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.16.9.tgz",
"integrity": "sha512-QTlv3GGSromPeLVW3pzM6uxU8RbkacW9e0+ZX23GAXaX+XE0UToSygAxCJDHSty6RB9lAFHCHg+FfiXFChi/+w==",
"version": "5.17.1",
"resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.17.1.tgz",
"integrity": "sha512-NX/EjbKznOTgt2pfCzZb5bPj5YJOO9mCUrRXquGMtmlfs+BowVaMsJSUUCvqOm9wexx4/F+ng4JQp6I4sG+SyA==",
"dev": true,
"optional": true,
"os": [
@@ -5121,7 +5121,7 @@
},
"node_modules/whatsapp-web.js": {
"version": "1.18.4",
"resolved": "git+ssh://git@github.com/pedroslopez/whatsapp-web.js.git#d1b2df9051bcfca3a1eb0c4b73f45f3ef6be784b",
"resolved": "git+ssh://git@github.com/cheveguerra/whatsapp-web.js.git#b3e5d99f521c6d594fd2e204f12d3fd8ae4eba3b",
"license": "Apache-2.0",
"dependencies": {
"@pedroslopez/moduleraid": "^5.0.2",

View File

@@ -1,6 +1,6 @@
{
"name": "test-ws-bot",
"version": "1.0.0",
"name": "chv-wweb-bot",
"version": "1.0.1",
"description": "",
"main": "app.js",
"scripts": {
@@ -27,7 +27,7 @@
"qrcode-terminal": "^0.12.0",
"socket.io": "^4.5.1",
"stormdb": "^0.6.0",
"whatsapp-web.js": "github:pedroslopez/whatsapp-web.js#fix-buttons-list",
"whatsapp-web.js": "github:cheveguerra/whatsapp-web.js#WaWJS2",
"xlsx": "^0.18.5"
},
"devDependencies": {