Como crear un Bot en Whatsapp web

2131

¿Apoco no quieres que la gente empiece a contactarte y puedas perfilar a quienes tienen mayor interés?

Aquí te muestro un código con el que he estado trabajando para que puedas contestar preguntas básicas o principales

Solo debes copiar y pegar este código en la consola -> «inspeccionar elemento» de Google Chrome en tu ventana que estés usando Whatsapp, ojo, este código es un ejemplo y puedes modificarlo a tu gusto, hacer que cada vez sea más inteligente y te ayude a atender mejor a tus clientes.

Es importante recalcar, que Whatsapp está constantemente actualizando su código, por lo que va cambiando, por ejemplo, en Diciembre del 2019, cuando publiqué esto por primera vez, el código obtenía el nombre de la persona que ellos mismos tenían registrado, en Agosto de 2020, esto se actualizó y ya no es tan sencillo.

Si requieres ayuda a como aplicarlo, contáctame y te ayudo a configurar un bot en Whatsapp sin compromiso.

/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */


(() => {
//
// GLOBAL VARS AND CONFIGS
//
var lastMessageOnChat = false;
var ignoreLastMsg = {};
var elementConfig = {
"chats": [1, 0, 5, 2, 0, 3, 0, 0, 0],
"chat_icons": [0, 0, 1, 1, 1, 0],
"chat_title": [0, 0, 1, 0, 0, 0],
"chat_lastmsg": [0, 0, 1, 1, 0, 0],
"chat_active": [0, 0],
"selected_title": [1, 0, 5, 3, 0, 1, 1, 0, 0, 0, 0]
};



//
// FUNCTIONS
//

// Get random value between a range
function rand(high, low = 0) {
    return Math.floor(Math.random() * (high - low + 1) + low);
}

function getElement(id, parent) {
    if (!elementConfig[id]) {
        return false;
    }
    var elem = !parent ? document.body : parent;
    var elementArr = elementConfig[id];
    elementArr.forEach(function(pos) {
        if (!elem.childNodes[pos]) {
            return false;
        }
        elem = elem.childNodes[pos];
    });
    return elem;
}

function getLastMsg() {
    var messages = document.querySelectorAll('.msg');
    var pos = messages.length - 1;

    while (messages[pos] && (messages[pos].classList.contains('msg-system') || messages[pos].querySelector('.message-out'))) {
        pos--;
        if (pos <= -1) {
            return false;
        }
    }
    if (messages[pos] && messages[pos].querySelector('.selectable-text')) {
        return messages[pos].querySelector('.selectable-text').innerText;
    } else {
        return false;
    }
}

function getUnreadChats() {
    var unreadchats = [];
    var chats = getElement("chats");
    if (chats) {
        chats = chats.childNodes;
        for (var i in chats) {
            if (!(chats[i] instanceof Element)) {
                continue;
            }
            var icons = getElement("chat_icons", chats[i]).childNodes;
            if (!icons) {
                continue;
            }
            for (var j in icons) {
                if (icons[j] instanceof Element) {
                    if (!(icons[j].childNodes[0].getAttribute('data-icon') == 'muted' || icons[j].childNodes[0].getAttribute('data-icon') == 'pinned')) {
                        unreadchats.push(chats[i]);
                        break;
                    }
                }
            }
        }
    }
    return unreadchats;
}

function didYouSendLastMsg() {
    var messages = document.querySelectorAll('.msg');
    if (messages.length <= 0) {
        return false;
    }
    var pos = messages.length - 1;

    while (messages[pos] && messages[pos].classList.contains('msg-system')) {
        pos--;
        if (pos <= -1) {
            return -1;
        }
    }
    if (messages[pos].querySelector('.message-out')) {
        return true;
    }
    return false;
}

// Call the main function again
const goAgain = (fn, sec) => {
    // const chat = document.querySelector('div.chat:not(.unread)')
    // selectChat(chat)
    setTimeout(fn, sec * 1000)
}

// Dispath an event (of click, por instance)
const eventFire = (el, etype) => {
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent(etype, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    el.dispatchEvent(evt);
}

// Select a chat to show the main box
const selectChat = (chat, cb) => {
    const title = getElement("chat_title", chat).title;

    eventFire(chat.firstChild.firstChild, 'mousedown');
    if (!cb) return;
    const loopFewTimes = () => {
        setTimeout(() => {
            const titleMain = getElement("selected_title").title;
            if (titleMain !== undefined && titleMain != title) {
                //console.log('not yet');
                return loopFewTimes();
            }
            return cb();
        }, 300);
    }

    loopFewTimes();
}

// Send a message
const sendMessage = (chat, message, cb) => {
    //avoid duplicate sending
    var title;

    if (chat) {
        title = getElement("chat_title", chat).title;
    } else {
        title = getElement("chat_title").title;
    }
    ignoreLastMsg[title] = message;
console.log("Titulo: " + title);
    messageBox = document.querySelectorAll("[contenteditable='true']")[1];

    //add text into input field
    messageBox.innerHTML = message.replace(/  /gm, '');

    //Force refresh
    event = document.createEvent("UIEvents");
    event.initUIEvent("input", true, true, window, 1);
    messageBox.dispatchEvent(event);

    //Click at Send Button
    eventFire(document.querySelector('span[data-icon="send"]'), 'click');

    cb();
}

//
// MAIN LOGIC
//
const start = (_chats, cnt = 0) => {
    // get next unread chat
    const chats = _chats || getUnreadChats(); //Toma los mensajes no leidos
    const chat = chats[cnt]; //conteo de chats no leidos

    var processLastMsgOnChat = false; //variable para procesar mensajes
    var lastMsg; //variable para el ultimo mensaje

    if (!lastMessageOnChat) { //si no hay un mensaje en el chat lastMessageonChat = false
        if (false === (lastMessageOnChat = getLastMsg())) { //revisa función getLastMsg, si no hay mensaje true, si hay mensaje linea 201
            lastMessageOnChat = true; //to prevent the first "if" to go true everytime
        } else {
            lastMsg = lastMessageOnChat; //Si hay mensaje se graba el valor en variable lastMsg
        }
    } else if (lastMessageOnChat != getLastMsg() && getLastMsg() !== false && !didYouSendLastMsg()) { //Si la variable LastMessageOnChar es diferente al ultimo mensaje, hay uno y tu no lo enviaste sino es recibido
        lastMessageOnChat = lastMsg = getLastMsg(); //El ultimo mensaje se actualiza al recibido
        processLastMsgOnChat = true; //Se hablita para procesarse
    }

    if (!processLastMsgOnChat && (chats.length == 0 || !chat)) { //Si no hay mensajes que procesar y no hay chats sin leer
        //console.log(new Date(), 'no hay mensajes para procesar...', chats.length, chat); //Imprime que no hay mensajes
        return goAgain(start, 1); //Vuelve a buscar mensajes cada 2 segs
    }

    // get infos
    var title; //variable para guardar titulo del chat
    if (!processLastMsgOnChat) {
        title = getElement("chat_title", chat).title + '';
        lastMsg = (getElement("chat_lastmsg", chat) || { innerText: '' }).innerText; //.last-msg returns null when some user is typing a message to me
    } else {
        title = getElement(".selected_title").title;
    }
    
    console.log("Nombre: " + title);
    // avoid sending duplicate messaegs
    if (ignoreLastMsg[title] && (ignoreLastMsg[title]) == lastMsg) {
        //console.log(new Date(), 'nothing to do now... (2)', title, lastMsg);
        return goAgain(() => { start(chats, cnt + 1) }, 0.1);
    }

    var person;
    person = document.getElementsByClassName("_8Uqu5")[0];
    person = person.getElementsByClassName("_357i8");
//console.log(person);
    string = [].map.call(person, function(node) {
        return node.textContent; // || node.innerText || "";
    }).join("");
	
    console.log("Mensaje de: " + string.split(" ")); //[0]);
    person = string;

    // what to answer back?
    let sendText
        //console.log("El ultimo mensaje es: " + lastMsg);


    /*if (lastMsg != "@HELP" || lastMsg != "@TIME" || lastMsg != "@JOKE") {
        lastMsg = ' ';
        console.log(lastMsg);

        return goAgain(start, 1);
    }*/

    if (lastMsg.toUpperCase().indexOf('HOLA') > -1) {
        sendText = `
            MENU para ${person} (escribe el numero o la palabra en el menu) :
                1. INFORMACION
                2. COMPRAR
                3. FAQ`
    }

     if (lastMsg.toUpperCase().indexOf('HOLI') > -1) {
        sendText = `
            MENU (escribe el numero o la palabra en el menu) :
                1. INFORMACION
                2. COMPRAR
                3. FAQ`
    }

    if (lastMsg.toUpperCase().indexOf('INFORMACION') > -1) {
        sendText = `
        BajaBot es un servicio de desarrollo de bots para WhatsApp, algo que practicamente nadie esta haciendo, o es muy costoso contratar de una agencia especializada, este es un "beta", lo que significa que por tiempo limitado, el servicio tendra un precio especial que se respetara por 12 meses despues de haberse registrado, y el servicio estara mejorando continuamente.
        Nuestro bot funciona por medio de whatsapp web, asi que solo requeririas escanear un codigo QR y tener el celular prendido`
    }
    if (lastMsg.toUpperCase().indexOf('1') > -1) {
        sendText = `
        BajaBot es un servicio de desarrollo de bots para WhatsApp, algo que practicamente nadie esta haciendo, o es muy costoso contratar de una agencia especializada, este es un "beta", lo que significa que por tiempo limitado, el servicio tendra un precio especial que se respetara por 12 meses despues de haberse registrado, y el servicio estara mejorando continuamente.
        Nuestro bot funciona por medio de whatsapp web, asi que solo requeririas escanear un codigo QR y tener el celular prendido`
    }

    if (lastMsg.toUpperCase().indexOf('COMPRAR') > -1) {
        sendText = `
        El desarrollo del bot cuesta $1,000 para configurarlo/desarrollarlo y $550 pesos mensuales para correrlo en la nube.
        Se puede comprar en baja.website 1`
    }
    if (lastMsg.toUpperCase().indexOf('2') > -1) {
        sendText = `
        El desarrollo del bot cuesta $1,000 para configurarlo/desarrollarlo y $550 pesos mensuales para correrlo en la nube.
        Se puede comprar en baja.website 2`
    }

   if (lastMsg.toUpperCase().indexOf('FAQ') > -1) {
        sendText = `
        P: Me van a bloquear mi numero?
        R: No, nuestra metodologia utilizando un bot del lado del cliente hace muy improbable que WhatsApp te bloquee
        P: Como van a ir implementando las mejoras
        R: Ya que el bot corre en nuestros servidores, nosotros iremos implementando mejoras ahi, y te mandaremos actualizaciones a tu correo sobre esto.
        P: Que si quiero cancelar mi suscripcion
        R: Simplemente nos mandas correo y la cancelamos
        P: Que necesito para tener un bot?
        R: Simplemente escanear un codigo QR y listo, solo debes tener tu celular prendido para su funcionamiento
        P: Que beneficios tiene y como me ayudaria un bot a mi negocio?
        R: Un bot te permitira contestarle dudas y venderle a tus clientes automaticamente cualquier hora del dia, por lo que te permitira crecer mejor tu negocio`
    }
    if (lastMsg.toUpperCase().indexOf('3') > -1) {
        sendText = `
        P: Me van a bloquear mi numero?
        R: No, nuestra metodologia utilizando un bot del lado del cliente hace muy improbable que WhatsApp te bloquee
        P: Como van a ir implementando las mejoras
        R: Ya que el bot corre en nuestros servidores, nosotros iremos implementando mejoras ahi, y te mandaremos actualizaciones a tu correo sobre esto.
        P: Que si quiero cancelar mi suscripcion
        R: Simplemente nos mandas correo y la cancelamos
        P: Que necesito para tener un bot?
        R: Simplemente escanear un codigo QR y listo, solo debes tener tu celular prendido para su funcionamiento
        P: Que beneficios tiene y como me ayudaria un bot a mi negocio?
        R: Un bot te permitira contestarle dudas y venderle a tus clientes automaticamente cualquier hora del dia, por lo que te permitira crecer mejor tu negocio`
    }

    // that's sad, there's not to send back...
    if (!sendText) {
        ignoreLastMsg[title] = lastMsg;
        //console.log(new Date(), 'new message ignored -> ', title, lastMsg);
        return goAgain(() => { start(chats, cnt + 1) }, 0.1);
    }

    //console.log(new Date(), 'new message to process, uhull -> ', title, lastMsg);

    // select chat and send message
    if (!processLastMsgOnChat) {
        selectChat(chat, () => {
            sendMessage(chat, sendText.trim(), () => {
                goAgain(() => { start(chats, cnt + 1) }, 0.1);
            });
        })
    } else {
        sendMessage(null, sendText.trim(), () => {
            goAgain(() => { start(chats, cnt + 1) }, 0.1);
        });
    }
}
start();
})()

¿Necesitas ayudar para configurar el bot en tu Whatsapp?

Cotizaciones para configuración de un Bot interactivo para WhatsApp Web déjame tus datos:

Desde simple implementación en tu navegador hasta creación de chat interactivo.

Úsalo bien 😉