domingo, 15 de enero de 2023

¡Realiza exámenes en línea con el Bot de WhatsApp!

 Hola a continuación le dejo material para que puedan implementar un BOT Whatsapp para realización de exámenes, encuestas y/o otros empleando hoja de calculo google sheet.

¿ Necesitas implementarlo tu mismo para realizar cambios ?

- Crear la hoja Google sheet como indica el video 

         - Escanear la hoja para obtener token QR

Video Implementación


Página Excel Plantilla

https://docs.google.com/spreadsheets/d/1ftwTqg7ztSEzbEKxW-qFLiQw_cB9kmc0tRDoGmAnGzc/edit?usp=sharing


Código AppScript 



var excel_qr = SpreadsheetApp.getActiveSpreadsheet();

var sheet_qr = excel_qr.getSheetByName("Configuracion");

var api_interna = "https://script.google.com/macros/s/AKfycbyoBhxuklU5D3LTguTcYAS85klwFINHxxd-FroauC4CmFVvS0ua/exec";


function onOpen() {

    createMenus();

}


function createMenus() {

    var menu = SpreadsheetApp.getUi().createMenu("Whatsapp");

    menu.addItem('1) Obtener TOKEN Session BOT  - QR Whatsapp', 'qrwhatsapp');

    menu.addItem('1) Obtener TOKEN Session Notificaciones  - QR Whatsapp', 'qrwhatsappnotificacion');

    menu.addItem('2) Habilitar BOT - Whatsapp', 'enviarconversacion');

    menu.addItem('3) Notificar Examenes', 'enviarexamenes');

    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 == "find_conversacion" ){

    respuesta = find_conversacion(JSON.stringify(operacion));

  }

 

    return ContentService.createTextOutput(respuesta).setMimeType(ContentService.MimeType.JSON);

}


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") {

            if(sheet_qr.getRange(2, 5).getValue()=="BOT"){

             sheet_qr.getRange(3, 2).setValue(qr.session);

            }else{

              sheet_qr.getRange(3, 4).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(2, 5).setValue("BOT");

        var response = Browser.msgBox('Seguro que quiere generar QR BOT ahora ?', Browser.Buttons.YES_NO);

    } catch (e) {

        Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK);

    }

    if (response == "yes") {

        enviar();

        Browser.msgBox('La acción ha sido realizada , escanear registros luego de 10 segundos', Browser.Buttons.OK);

    }

}

function qrwhatsappnotificacion() {

    var response = "No"

    try {

        sheet_qr.getRange(2, 5).setValue("NOTIFICACION");

        var response = Browser.msgBox('Seguro que quiere generar QR Notificacion ahora ?', Browser.Buttons.YES_NO);

    } catch (e) {

        Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK);

    }

    if (response == "yes") {

        enviar();

        Browser.msgBox('La acción ha sido realizada , escanear registros luego de 10 segundos', Browser.Buttons.OK);

    }

}


function enviar() {

    var appscript = sheet_qr.getRange(1, 2).getValue();

    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());

    } catch (e) {

    }

}


function enviarexamenes(){

      var response = "No"

    var token_session = "";

   try {

        token_session = sheet_qr.getRange(3, 4).getValue();

        var response = Browser.msgBox('Seguro que quiere enviar examenes a los alumnos , 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") {

        var dataMensajes = [];

        if (excel_qr.getSheetByName("Alumnos")) {

            var sheet = excel_qr.getSheetByName("Alumnos");

            var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();

            for (var i = 0, l = rows.length; i < l; i++) {

              try{

                var record = {};

                record['numero'] =  rows[i][1];

                record['mensaje'] = (sheet_qr.getRange(4, 2).getValue()).replace("%nombre%",rows[i][2]);

                sheet.getRange(i+2,4).setValue("INICIADO");

                dataMensajes.push(record);

                 } catch (e) {

                   Browser.msgBox('Error en la hoja conversacion revisar valores '+ i, Browser.Buttons.OK);

                   return;

              }

            }

        }

        var payload = { "op": "registermessage", "token_qr": token_session, "mensajes": dataMensajes };

        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 habilito los mensajes inicie la conversacion ', Browser.Buttons.OK);

        }

    }

}  

function enviarconversacion() {

    var response = "No"

    var token_session = "";

   try {

        token_session = sheet_qr.getRange(3, 2).getValue();

        var response = Browser.msgBox('Seguro que quiere habilitar el BOT con la conversacion , 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") {

        var dataConversacion = [];

        if (excel_qr.getSheetByName("Conversacion")) {

            var sheet = excel_qr.getSheetByName("Conversacion");

            var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();

            for (var i = 0, l = rows.length; i < l; i++) {

              try{

                var dataRow = rows[i];

                var record = {};

                record['evento'] = dataRow[0];

                record['entrada'] = dataRow[1];

                record['salida'] = JSON.parse(dataRow[2]);

                record['retornar'] = dataRow[3];

                dataConversacion.push(record);

                 } catch (e) {

                   Browser.msgBox('Error en la hoja conversacion revisar valores '+ i, Browser.Buttons.OK);

                   return;

                 }

            }

        }

        var payload = { "op": "registermessage", "token_qr": token_session, "conversacion": dataConversacion };

        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 habilito el BOT inicie la conversacion ', Browser.Buttons.OK);

            } else {

                Browser.msgBox('Error al iniciar : ' + json.message, Browser.Buttons.OK);

            }

        } catch (e) {

            Browser.msgBox('Se habilito el BOT inicie la conversacion ', Browser.Buttons.OK);

        }

    }

}

function find_conversacion(informacion){

 try{

   var venta = JSON.parse(informacion);

   var excel= SpreadsheetApp.getActiveSpreadsheet(); 

   var sheet_configuracion = excel.getSheetByName("Configuracion");

   var numero = (venta.numero).substring(0, (venta.numero).lastIndexOf("@"));

   var jo={};

   // RESERVO EL ARREGLO DE CONVERSACION

   let arreglo =  (JSON.parse(informacion).mensaje).reverse();

   //OBTENER EL ULTIMO EVENTO

   var ultima_conversacion = arreglo[0];

   sheet_configuracion.getRange(10,4).setValue(informacion);

   sheet_configuracion.getRange(10,5).setValue(ultima_conversacion);

   if(ultima_conversacion.evento=="Iniciar"){

      var data_pregunta = {"pregunta":1,"posicion":-1};

      var sheet_evaluacion = excel.getSheetByName("Evaluaciones");

      try {

        // SE VALIDA QUE ESTADO SEA INICIADO

        var sheet_alumnos = excel.getSheetByName("Alumnos");

        var rows_alumnos = sheet_alumnos.getRange(2, 1, sheet_alumnos.getLastRow() - 1, sheet_alumnos.getLastColumn()).getValues();

        var alumno = rows_alumnos.find(function (row) {

                return (row[1] + "") == "" + numero;

        });

        if(alumno[3]=="INICIADO"){

              var pregunta_anterior = arreglo.find(element => element.evento=="Iniciar_exito" && element.datos_temporal != undefined );

              var sheet_datos = excel.getSheetByName("Cuestionario");

              var rows_datos = sheet_datos.getRange(2, 1, sheet_datos.getLastRow() - 1, sheet_datos.getLastColumn()).getValues();

              if(pregunta_anterior==undefined){                  

                  // SE BUSCA RANDOM PREGUNTAS

                  var cuestionario_codigo = Math.floor(Math.random() * rows_datos.length);

                  sheet_configuracion.getRange(10,1).setValue(cuestionario_codigo);

                  sheet_configuracion.getRange(10,2).setValue(rows_datos[cuestionario_codigo][0]);

                  sheet_evaluacion.appendRow([alumno[0],alumno[2],new Date(),new Date(),rows_datos[cuestionario_codigo][0],0,""]);

                  data_pregunta.posicion = sheet_evaluacion.getLastRow();

                  data_pregunta.cuestionario = rows_datos[cuestionario_codigo][0];                   

              }else{

                data_pregunta.cuestionario = pregunta_anterior.datos_temporal.cuestionario;

                data_pregunta.posicion = pregunta_anterior.datos_temporal.posicion;

                data_pregunta.pregunta = (pregunta_anterior.datos_temporal.pregunta+1);

                sheet_evaluacion.getRange(data_pregunta.posicion,(data_pregunta.pregunta+6)).setValue(ultima_conversacion.mensaje);

                sheet_evaluacion.getRange(data_pregunta.posicion,4).setValue(new Date());

                if((ultima_conversacion.mensaje+"").toUpperCase()==(pregunta_anterior.datos_temporal.respuesta_correcta+"").toUpperCase()){

                sheet_evaluacion.getRange(data_pregunta.posicion,6).setValue(parseInt(sheet_evaluacion.getRange(data_pregunta.posicion,6).getValue())+parseInt(pregunta_anterior.datos_temporal.puntos));                

                sheet_evaluacion.getRange(data_pregunta.posicion,(data_pregunta.pregunta+6)).setBackground("#008000");

                }else{

                sheet_evaluacion.getRange(data_pregunta.posicion,(data_pregunta.pregunta+6)).setBackground("#FF0000");

                } 

              }

              var pregunta = rows_datos.find(function (row) {

                      return (row[2] + "") == "" + data_pregunta.pregunta && (row[0] + "") == "" +data_pregunta.cuestionario;

              });

              if(pregunta==undefined){

                jo.message= "Se termino el examen tu puntuacion es "+sheet_evaluacion.getRange(data_pregunta.posicion,6).getValue();

                jo.flagclean="1";

                jo.terminar_do="false";   

                jo.datos_temporal = data_pregunta;

                var codigo_alumno = rows_alumnos.findIndex(function (row) {

                  return (row[1] + "") == "" + numero;

                });

                sheet_alumnos.getRange(codigo_alumno+2,4).setValue("COMPLETADO");

              }else{

                data_pregunta.respuesta_correcta =  pregunta[9];

                data_pregunta.puntos =  pregunta[10];

                jo.message= pregunta[3]+"\n"+(""+pregunta[4]?"a) "+pregunta[4]:"")+"\n"+(""+pregunta[5]?"b) "+pregunta[5]:"")+"\n"+(""+pregunta[6]?"c) "+pregunta[6]:"")+"\n"+(""+pregunta[7]?"d) "+pregunta[7]:"")+"\n"+(""+pregunta[8]?"e) "+pregunta[8]:"");

                jo.datos_temporal = data_pregunta;

                jo.terminar_do="false";   

              }

        }else{

          jo.message= "Lo siento su examen no esta iniciado ";;

          jo.flagclean="1";

          jo.terminar_do="false";   

        } 

      } catch (e) {

        sheet_configuracion.getRange(11,7).setValue("error"+e);

      }

      jo.conversacion = { "mensaje": "@find_conversacion@", "evento": "Iniciar_exito", "retornar": ultima_conversacion.retornar };      

    }  

    jo.status = '0';

 } catch (e) {

    jo.status = '-1';

    jo.message = e.toString();

  }

  var result = JSON.stringify(jo); 

  return result;

}


HABILITAR BOT 24 x 7 :

La solución BOT emplea Web Whatsapp  para recibir y enviar mensajes , por lo cual es necesario la contratación de un servidor para el BOT este operativo 24 x 7  , debido a ello existe un pago mensual de $ 8.00 .

IR a PAGAR 8 DOLARES

ASESORIA PERSONALIZADA :

En caso necesites alguna asesoría personalizada agéndame un espacio.

https://reservarasesoriaanlusoft.blogspot.com/

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...