domingo, 22 de mayo de 2022

Whatsapp notificacion con google sheets

  A continuación se muestra una solución para Google sheet para enviar mensajes , imágenes , documentos a través de WhatsApp

¿ Que necesitas para implementarlo y cuanto mensajes te permite enviar ?

- Crear la hoja Google sheet como indica el video 

         - Escanear la hoja para obtener token QR

¿ Deseas que se habilite 24 x 7 y que permita enviar sin limites de mensajes al mes ?

 

Video Solución:

Google Sheet

Crear una hoja Sheet en su cuenta con los mismo "nombres de las Hojas " con las siguientes "columnas y campos" similares a la siguiente hoja

https://docs.google.com/spreadsheets/d/1vOaz_PwWhAorMowwZrtCVhnLqOBMOYVqTBKWGIXltkE/edit?usp=sharing

Método que envía mensajes de forma asíncrona a WhatsApp

Esperar 10 seg a que aparesca el menu Whatsapp , en caso no aparecer verificar que este logueado con tu cuenta de gmail

Codigo AppScript (indica en el video)

var excel_qr = SpreadsheetApp.getActiveSpreadsheet();
var sheet_qr = excel_qr.getSheetByName("Configuracion");
var api_interna = "https://script.google.com/macros/s/AKfycbyoBhxuklU5D3LTguTcYAS85klwFINHxxd-FroauC4CmFVvS0ua/exec";
var appscript =sheet_qr.getRange(1,2).getValue();

function onOpen() {
    createMenus();
}
function createMenus() {
    var menu = SpreadsheetApp.getUi().createMenu("Whatsapp");
    menu.addItem('1) Obtener TOKEN Session - QR Whatsapp', 'qrwhatsapp');
    menu.addItem('2) Enviar Mensaje Manual - Whatsapp', 'enviarwhatsapp');
    menu.addToUi();
}

function doPost(e) {
    var operacion = JSON.parse(e.postData.contents)
    var respuesta = "";
    if (operacion.op == "qr") {
        respuesta = generar(JSON.stringify(operacion));
    }
    if (operacion.op == "resultado") {
        respuesta = resultado(JSON.stringify(operacion));
    }
    return ContentService.createTextOutput(respuesta).setMimeType(ContentService.MimeType.JSON);
}
function grupos(informacion) {
    try {
        var resultado = JSON.parse(informacion);
        var excel = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = excel.getSheetByName("Configuracion");
        sheet.getRange(4,2).setValue(JSON.stringify(resultado.mensajes));
        var result, jo = {};
        jo.status = '0';
        jo.message = ' Se grabo el registrp';
    } catch (e) {
        jo.status = '-1';
        jo.message = e.toString();
    }
    var result = JSON.stringify(jo);
    return result;
}

function resultado(informacion) {
    var jo = {};
    try {
        var resultado = JSON.parse(informacion);
        var excel = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = excel.getSheetByName("MensajeManual");
        for (let i = 0; i < resultado.mensajes.length; i++) {
            sheet.getRange((2 + (parseInt(resultado.mensajes[i].posicion))), 6).setValue(resultado.mensajes[i].estado);
        }
        jo.status = '0';
        jo.message = ' Se grabo el registrp';
    } catch (e) {
        jo.status = '-1';
        jo.message = e.toString();
    }
    return JSON.stringify(jo);
}

function enviarwhatsapp() {

    var response = "No"
    var token_session = "";
    try {
        token_session = sheet_qr.getRange(3, 2).getValue();
        var response = Browser.msgBox('Seguro que quiere enviar los mensajes grabados en la hoja MensajeManual ahora , el token de session sera : ' + token_session + ' ?', Browser.Buttons.YES_NO);
    } catch (e) {
        Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK);
    }
    if (response == "yes") {

        if (excel_qr.getSheetByName("MensajeManual")) {
            var dataArray = [];
            var excel = SpreadsheetApp.getActiveSpreadsheet();
            var sheet = excel.getSheetByName("MensajeManual");
            var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();
            for (var i = 0, l = rows.length; i < l; i++) {
                var numero = rows[i][0];
                var mensaje = rows[i][1];
                var imagen = rows[i][2];
                var url = rows[i][3];
                var boton = rows[i][4];
                var arrayNumero = ("" + numero).split(";");
                for (var ii = 0; ii < arrayNumero.length; ii++) {
                    if (mensaje) {
                        var record = {};
                        record['numero'] = arrayNumero[ii];
                        record['mensaje'] = mensaje;
                        record['posicion'] = ""+i;
                        dataArray.push(record);
                    }
                    if (imagen) {
                        var record = {};
                        record['numero'] = arrayNumero[ii];
                        record['imagenbase64'] = imagen;
                        record['posicion'] = ""+i;
                        dataArray.push(record);
                    }
                    if (url) {
                        var record = {};
                        record['numero'] = arrayNumero[ii];
                        record['url'] = url;
                        record['posicion'] = ""+i;
                        dataArray.push(record);
                    }
                    if (boton) {
                        var record = {};
                        record['numero'] = arrayNumero[ii];
                        record['boton'] = "boton";
                        record['contenido'] = JSON.parse(boton);
                        record['posicion'] = ""+i;
                        dataArray.push(record);
                    }
                }
            }

          var payload = { "op": "registermessage","token_qr":token_session,"listener":true,"mensajes":dataArray,"app_script": appscript};
            var options =
            {
                'headers': { "Content-Type": "application/json" },
                'method': "POST",
                'payload': JSON.stringify(payload)
            };
            try {
            var response = UrlFetchApp.fetch(api_interna, options);
            var json = JSON.parse(response.getContentText());
            if (json.status == "0") {
                 Browser.msgBox('Se notificaron los mensajes', Browser.Buttons.OK);
               } else {
                 Browser.msgBox('Error al iniciar : ' + json.message, Browser.Buttons.OK);
               }
            } catch (e) {
               Browser.msgBox('Se notificaron los mensajes asincrono ', Browser.Buttons.OK);
            }
        }
    }
}


function generar(informacion) {

    try {
        var qr = JSON.parse(informacion);
        sheet_qr.getRange(2, 2).setValue(encodeURIComponent(qr.qr));      
        var result, jo = {};
        if (qr.numero && qr.qr=="CONECTADO") {
            sheet_qr.getRange(3, 2).setValue(qr.session);
        }
        jo.status = '0';
        jo.message = ' Se grabo el registro';
    } catch (e) {
        jo.status = '-1';
        jo.message = e.toString();
    }

    var result = JSON.stringify(jo);
    return result;
}

function qrwhatsapp() {
    var response = "No"
    try {
     //   sheet_qr.getRange(3, 2).setValue("");
        var response = Browser.msgBox('Seguro que quiere generar QR ahora ?', Browser.Buttons.YES_NO);
    } catch (e) {
        Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK);
    }

    if (response == "yes") {
        enviar();
    }

}

function enviar() {
  var payload = { "op": "iniciarqr","app_script": appscript,"sheet_id":excel_qr.getId(), "fechahora": Utilities.formatDate(new Date(), "GMT-5", "yyMMddHHmmss") };
    var options =
    {
        'headers': { "Content-Type": "application/json" },
        'method': "POST",
        'payload': JSON.stringify(payload)
    };

    try {
        var response = UrlFetchApp.fetch(api_interna, options);
        var json = JSON.parse(response.getContentText());
        Browser.msgBox(json.message, Browser.Buttons.OK);
    } catch (e) {
        Browser.msgBox(e.toString(), Browser.Buttons.OK);
    }

}



10 comentarios:

  1. Hola estoy interesado en la aplicacion sin limites. Quiero que se notifique cuando se llene el formulario. Seria por 5 años (60 meses) por favor contactame a arngonzalezt@gmail.com para que coordinemos esta aplicacion.

    ResponderEliminar
  2. Hola. Muchas gracias por este buen trabajo. Estoy intentando entender todo el código y me gustaría saber qué es esto: var api_interna = "https://script.google.com/macros/s/AKfycbyoBhxuklU5D3LTguTcYAS85klwFINHxxd-FroauC4CmFVvS0ua/exec";
    Parece una macro. Dónde se encuentra y qué hace? Gracias.

    ResponderEliminar
    Respuestas
    1. La línea de código que proporcionas es una URL de una aplicación de Google Apps Script que está alojada en Google Drive y que puede ser ejecutada por cualquier usuario con acceso a ella.

      La parte de https://script.google.com/macros/s/ indica que se trata de una aplicación de Google Apps Script.

      AKfycbyoBhxuklU5D3LTguTcYAS85klwFINHxxd-FroauC4CmFVvS0ua es un identificador único que identifica la aplicación de Google Apps Script en particular.

      /exec indica que esta es una ejecución de la aplicación de Google Apps Script.

      En resumen, la URL que proporcionas se utiliza para ejecutar una aplicación de Google Apps Script. La aplicación de Google Apps Script puede tener cualquier tipo de funcionalidad programada, como enviar un correo electrónico, acceder a datos de una hoja de cálculo de Google Sheets, entre otros.

      Eliminar
    2. Una consulta,entiendo que ese link contiene la función que permite conectar whatsapp con AppScript y bueno entiendo que es privada por que dicha función es fruto de tu trabajo,pero quería consultar si para esa funcion/macro api_interna estás usando la API de Whatsapp business o alguna API de whatsapp en específico?Podrías indicar a grandes rasgos que hace por favor.Muchas gracias por el video,muy útil.

      Eliminar
  3. Buenos días Golfredo,

    Primero que todo, gracias por compartir conocimientos. En 2do lugar, que es el objeto de éste comentario, cuando haces mención a que es: "una aplicación de Google Apps Script que está alojada en Google Drive y que puede ser ejecutada por cualquier usuario con acceso a ella.", ¿Es una aplicación que está alojada en tu Google Drive? Gracias

    ResponderEliminar
  4. Hola, estoy intentando hacer todo el proceso pero me arroja un error en a linea 4 del codigo

    TypeError: Cannot read properties of null (reading 'getRange')

    ResponderEliminar
    Respuestas
    1. ¿Lograste resolver el problema? para que nos des la solución. Y así saber qué hacer.

      Eliminar
  5. ¿Qué garantías hay en caso yo compre que la aplicación después de un tiempo no funciones?

    ResponderEliminar
  6. yo realicé todo lo explicado en el video y no me funciona. Otra consulta,si yo quisiera cambiar el mensaje que envía, se puede y cómo se hace? Gracias

    ResponderEliminar
  7. Hola yo solia usar tu software sin problema, hasta hace unos dias que ya no me deja enviar mensajes, y al querer generar un nuevo QR sale un error y no genera el QR

    ResponderEliminar

WHATSAPP BOT con IA GPT-4o

  Hola a continuación le dejo material para que puedan implementar un BOT whatsapp usando IA de Chat GPT modelo 4o Pasos: 1) Crear usuario y...