Mostrando entradas con la etiqueta Pruebas en línea. Mostrar todas las entradas
Mostrando entradas con la etiqueta Pruebas en línea. Mostrar todas las entradas

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/

🚀 Crea tu Propio Sistema de Inventario y Úsalo desde tu Celular 📱

 📱📦 Crea tu Sistema de Inventario y úsalo desde tu celular. En este video muestro cómo desarrollar un sistema de inventario con escáner us...