martes, 12 de julio de 2022

BOT Whatsapp de Tienda Virtual

 Hola a continuación le dejo material para que puedan implementar un BOT de Tienda Virtual  y/o otros casos de uso donde se necesite trabajar con un carrito de compras empleando hoja de calculo google sheet.

¿ Deseas solo probarlo YA?

1) Ingresar a la siguiente pagina

https://anlusoftware.blogspot.com/

2) Seleccionar la opcion "GENERAR TOKEN WHATSAPP PARA BOT" y luego el BOT que deseas activar "Whatsapp chatbot tienda virtual con google sheets"


3) Si todo esta OK se le mostrara mensaje confirmacion

4) Conversele al numero de celular .

5) El BOT trabaja con la siguiente hoja sheet se iran almacenado los registros ahi,

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

¿ Necesitas implementarlo tu mismo para realizar cambios ?

- Crear la hoja Google sheet como indica el video 

         - Escanear la hoja para obtener token QR

         -  Whatsapp version android no business

Video Implementación


Página Excel Plantilla (texto)


https://docs.google.com/spreadsheets/d/1S27B72AnvOTfGrCnV5n1HJEKKFeUVGeQxkI8Q2l8qdc/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";

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) Habilitar BOT - Whatsapp', 'enviarconversacion');

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

    }

  

  if (operacion.op == "find_word" ){

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

  }

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

}


function find_conversacion(informacion) {


    try {

        var result, jo = {};

        var venta = JSON.parse(informacion);

        var excel = SpreadsheetApp.getActiveSpreadsheet();

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

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

        var sheet_producto = excel.getSheetByName("Producto");

        var sheet_sede = excel.getSheetByName("Sede");

        var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues();

        var rows_sede = sheet_sede.getRange(2, 1, sheet_sede.getLastRow() - 1, sheet_sede.getLastColumn()).getValues();       

        var fecha = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd HH:mm:ss");

        var fecha_solicitud = "." + Utilities.formatDate(new Date(), "GMT", "yy-MM-dd HH:mm");

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

        var ultimoevento = "";

        var descripcion_producto = "";

        var nombre_cliente = "";

        var sede_cliente="";

        var envio_cliente="Recogo Tienda";

        var ubicacion_delivery="";

        var direccion_delivery="";

        var codigo_producto="";

        var productos=[];

        var descripcion_sede_nombre="";

        var descripcion_sede_ubicacion="";

        var descripcion_sede_encargado="";

        var mensaje_asesor="";

        var codigo_pedido = "P_"+(Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000); //Utilities.formatDate(new Date(), "GMT", "HHmm");

        var descripcion_producto="";

        var nombre_archivo ="";

        var data_archivo ="";

        var tipo_archivo ="";      

        for (var ill = 0; ill < venta.mensaje.length; ill++) {

            if (venta.mensaje[ill].evento == "Producto") {

                codigo_producto = venta.mensaje[ill].mensaje;

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

                    if (("" + codigo_producto) == (rows_producto[i][0] + "")) {

                      productos.push({"codigo":codigo_producto,"descripcion":rows_producto[i][1],"precio":rows_producto[i][3],"moneda":rows_producto[i][2]});

                      break;

                    }

                }

            }

            if (venta.mensaje[ill].evento == "Finalizar_Informacion_producto") {

                codigo_producto = venta.mensaje[ill].mensaje;

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

                    if (("" + codigo_producto) == (rows_producto[i][0] + "")) {

                      descripcion_producto="*Producto* : "+rows_producto[i][1]+"\n*Precio* : "+rows_producto[i][2]+" "+rows_producto[i][3]+"\n"+rows_producto[i][4];

                      descripcion_producto += ";*IMAGES*;"+rows_producto[i][6]+"";

                      break;

                    }

                }

            }

            if (venta.mensaje[ill].evento == "Continuar Pedido") {

                productos[productos.length-1].cantidad = venta.mensaje[ill].mensaje;

            }

            

           if(venta.mensaje[ill].evento=="Seleccionar_Sedes"){

             nombre_cliente=venta.mensaje[ill].mensaje;

           }

          if(venta.mensaje[ill].evento=="MenuInicio" || venta.mensaje[ill].evento=="Finalizar_Tu_Ubicacion"){

            sede_cliente=venta.mensaje[ill].mensaje;

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

                    if (("" + sede_cliente) == (rows_sede[i][0] + "")) {

                      descripcion_sede_nombre=rows_sede[i][1];

                      descripcion_sede_ubicacion=rows_sede[i][2];

                      descripcion_sede_encargado=rows_sede[i][3];

                      break;

                    }

            }          

          }

        

          if(venta.mensaje[ill].evento=="Delivery_Pedido"){

            envio_cliente="Delivery";

          }

          if(venta.mensaje[ill].evento=="Finalizar_Terminar_Pedido"){            

            if(venta.mensaje[ill].mensaje==="ubicacion_send"){

              ubicacion_delivery=venta.mensaje[ill].documento.latitud+","+venta.mensaje[ill].documento.longitud;

              var response = Maps.newGeocoder().reverseGeocode(venta.mensaje[ill].documento.latitud,venta.mensaje[ill].documento.longitud);

              for (var iz = 0; iz < response.results.length; iz++) {

                direccion_delivery= response.results[iz].formatted_address;

                break;

              }

            }

          }

          

          if(venta.mensaje[ill].evento=="Finalizar_Enviar_voucher"){            

            if(venta.mensaje[ill].mensaje==="documento_send"){

             nombre_archivo =venta.mensaje[ill].documento.filename;

             data_archivo =venta.mensaje[ill].documento.data;

             tipo_archivo =venta.mensaje[ill].documento.mimetype;

            }

          }

             

          

          if(venta.mensaje[ill].evento=="Finalizar_Consulta_Pedido"){

            codigo_pedido=venta.mensaje[ill].mensaje;

          }

          if(venta.mensaje[ill].evento=="Adjuntar_Enviar_voucher"){

            codigo_pedido=venta.mensaje[ill].mensaje;

          }

          if(venta.mensaje[ill].evento=="Finalizar_Hablar_con_asesor"){

            mensaje_asesor=venta.mensaje[ill].mensaje;

          }

            ultimoevento = venta.mensaje[ill].evento;

        }

      

        var mensaje_detalle="Tu detalle es :\n";

        if(ultimoevento == "Mostrar_Detalle_Pedido"  || ultimoevento == "Finalizar_Terminar_Pedido"){

          var total=0.0;

          var moneda="";          

          for (var i = 0; i < productos.length; i++) {

            mensaje_detalle+="*"+productos[i].descripcion+"* Cant."+ productos[i].cantidad+" x "+productos[i].moneda+""+productos[i].precio+"\n";

            var subtotal=Number.parseFloat(productos[i].cantidad)*Number.parseFloat(productos[i].precio);

            total=Number.parseFloat(Number.parseFloat(total)+Number.parseFloat(subtotal)).toFixed(2);

            moneda=productos[i].moneda;

            if(ultimoevento == "Finalizar_Terminar_Pedido"){

              for (var ij = 0, lj = rows_producto.length; ij < lj; ij++) {

                    if (("" + productos[i].descripcion) == (rows_producto[ij][1] + "")) {

                      var stock_actualizar = parseInt(rows_producto[ij][5])-parseInt(productos[i].cantidad);

                      sheet_producto.getRange(ij+2, 6).setValue(stock_actualizar);

                      break;

                    }

              }

            }

          }

          mensaje_detalle+="*Total* :"+moneda+""+total;

        }  

        if (ultimoevento == "Mostrar_Detalle_Pedido") {

          jo.status = '0';

          jo.message = mensaje_detalle;

          jo.conversacion = { "mensaje": "", "evento": "Mostrar_Detalle_Pedido_Informacion", "retornar": "OpcionTipoEnvio" };

        }

        if (ultimoevento == "Finalizar_Terminar_Pedido") {

          sheet.appendRow([codigo_pedido,fecha,nombre_cliente,numero,descripcion_sede_nombre,mensaje_detalle,'Pendiente',envio_cliente,direccion_delivery,ubicacion_delivery,"",JSON.stringify(venta.mensaje)]);

          jo.status = '0';

          jo.message = "Su pedido ha sido registrado✅😃\nUn asesor se comunicara contigo en breve, su codigo de seguimiento es *"+codigo_pedido+"*\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

          jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Terminar_Pedido_informacion", "retornar": "" };

        }

        if (ultimoevento == "Finalizar_Tu_Ubicacion") {

          jo.status = '0';

          var mensaje_sede="No existe la sede seleccionada ✅😃";

          if(sede_cliente!=""){

            mensaje_sede="*Sede* :"+descripcion_sede_nombre+"\n*Ubicacion* : "+descripcion_sede_ubicacion+"\n*Encargado* : "+descripcion_sede_encargado;

          }

          jo.message = mensaje_sede;

          jo.conversacion = { "mensaje": "", "evento": "Finalizar_Tu_Ubicacion_informacion", "retornar": "Finalizar_Tu_Ubicacion_Menu" };

        }      

        if (ultimoevento == "Finalizar_Informacion_producto") {

          jo.status = '0';

          var mensaje_producto="No existe el producto seleccionado ✅😃";

          if(descripcion_producto!=""){

            mensaje_producto=descripcion_producto;

          }

          jo.message = mensaje_producto;

          jo.conversacion = { "mensaje": "", "evento": "Finalizar_Informacion_producto_informacion", "retornar": "Finalizar_Informacion_producto_Menu" };

        }      

      

         if(ultimoevento=="Finalizar_Hablar_con_asesor"){

           

          jo.status = '0';

          jo.message = "Se ha registrado el mensaje ✅😃\nUn asesor se comunicara contigo en breve\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

          jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Hablar_con_asesor_informacion", "retornar": "" };

          var sheet_solicitud =excel.getSheetByName("Solicitud_asesor");

          sheet_solicitud.appendRow([fecha,nombre_cliente,descripcion_sede_nombre,numero,mensaje_asesor,'Pendiente',JSON.stringify(venta.mensaje)])

       } 

      

         if(ultimoevento=="Finalizar_Consulta_Pedido"){

          var mensaje_consulta="No existe pedido # *"+codigo_pedido+"* ✅😃";

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

           if(rows){

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

               var dataRow = rows[i];

               if((dataRow[0]+"")===""+codigo_pedido){

                 mensaje_consulta = "El pedido # *"+codigo_pedido+"* ( "+dataRow[6]+" )\n";

                 mensaje_consulta+= dataRow[5];

                 break;

               }  

             }

          }

          mensaje_consulta+="\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

          jo.status = '0';

          jo.message = mensaje_consulta;

          jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Consulta_Pedido_informacion", "retornar": "" };

       }

      

       if(ultimoevento=="Finalizar_Enviar_voucher"){

          var mensaje_consulta="No existe pedido # *"+codigo_pedido+"* ✅😃";

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

           if(rows){

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

               var dataRow = rows[i];

               if((dataRow[0]+"")===""+codigo_pedido){


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

                 var folderurl_completo = sheet_parametro.getRange(4, 2).getValue();   

                 var folderurl_texto= (folderurl_completo).substring((folderurl_completo).lastIndexOf("/") + "/".length, (folderurl_completo).length);

                 var folderurl=(folderurl_texto.split("?"))[0];

                 var folder_ = DriveApp.getFolderById(folderurl); 

                 var nombre_archivo_="ARCHIVO_"+codigo_pedido+".png";

                 if(nombre_archivo){

                   nombre_archivo_ =nombre_archivo;

                 }

                 var decoded = Utilities.base64Decode(data_archivo);

                 var image = Utilities.newBlob(decoded,tipo_archivo,nombre_archivo_);

                 // SE CREA EL ARCHIVO

                 var file = folder_.createFile(image);

                 var files_ = folder_.getFilesByName(nombre_archivo_);

                 var urlfile ="";

                 while (files_.hasNext()) {

                   var archivo_=files_.next();          

                   urlfile = archivo_.getUrl();

                 }

                 var range = sheet.getRange(i+2, 11);

                 var richValue = SpreadsheetApp.newRichTextValue().setText(nombre_archivo_).setLinkUrl(urlfile).build();

                 range.setRichTextValue(richValue);


                 mensaje_consulta = "El pedido # *"+codigo_pedido+"* se actualizo el voucher pago \n";

                 mensaje_consulta+= dataRow[5];

                 break;

               }  

             }

          }

          mensaje_consulta+="\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

          jo.status = '0';

          jo.message = mensaje_consulta;

          jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Enviar_voucher_informacion", "retornar": "" };

       }

      

    } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

    }


    var result = JSON.stringify(jo);

    sheet_qr.getRange(9, 5).setValue(result);


    return result;

}



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

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

    }

}


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

    } catch (e) {

    }

}


function find_word(informacion){

    var result,jo={};

    try{

        var resultado = JSON.parse(informacion);

        var excel= SpreadsheetApp.getActiveSpreadsheet(); 

        var sheet_sede =excel.getSheetByName("Pedidos");

        var rows_sede = sheet_sede.getRange(2,1,sheet_sede.getLastRow()-1, sheet_sede.getLastColumn()).getValues(); 

        jo.status = '1';

        jo.message = ' No existe'; 

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

      for(var i2 = 0, l2= rows_sede.length; i2<l2 ; i2++){

          var dataRow = rows_sede[i2];

          var record = {};

          if((dataRow[3]+"")==(numero+"") && resultado.mensaje=="Por favor ingrese tu nombre 🙋‍♂."){

            jo.status = '0';

            jo.message = ' Hola '+dataRow[2]+ " 🙋‍♂.";

            jo.conversacion={"mensaje":dataRow[2],"evento":"Seleccionar_Sedes","retornar":"MenuInicio"};            

            break;

          }

        }

      } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

      } 

    var result = JSON.stringify(jo); 

    return result;

  

}


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 = [];

   var dataProducto = [];

   var dataSede = [];

    

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

      var sheet_producto =excel_qr.getSheetByName("Producto");

      var rows_producto = sheet_producto.getRange(2,1,sheet_producto.getLastRow()-1, sheet_producto.getLastColumn()).getValues(); 

      for(var i1 = 0, l1= rows_producto.length; i1<l1 ; i1++){

        var dataRow = rows_producto[i1];

        var record = {};

        record['mensaje'] = "*"+dataRow[0]+"* : "+dataRow[1]+" ("+dataRow[2]+""+dataRow[3] +")";

        dataProducto.push(record);     

      }

    }

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

       var sheet_sede =excel_qr.getSheetByName("Sede");

       var rows_sede = sheet_sede.getRange(2,1,sheet_sede.getLastRow()-1, sheet_sede.getLastColumn()).getValues(); 

       for(var i2 = 0, l2= rows_sede.length; i2<l2 ; i2++){

         var dataRow = rows_sede[i2];

         var record = {};

        record['mensaje'] = "*"+dataRow[0]+"* : "+dataRow[1];

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

         record['encargado'] =dataRow[2];

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

         dataSede.push(record);     

       }

    }

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

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

            }

        }


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

        payload.data_1 =dataSede;

        payload.data_2 =dataProducto;

      

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

        }

    }

}



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/

1 comentario:

  1. Hola soy de Perú quisiera poder contactarme contigo con respecto a un chatbox con servicio 24x7 con coneccion a Sheet y Wasapt pero que se ecuentre en la Nube o un servidor gratuito obviamente habra un incentivo por ello. Espero que me puedas contactar

    ResponderEliminar

Chatbot Taxi en whatsapp con Chatgpt

  Hola a continuación le dejo material para que puedan implementar un BOT de solicitud de taxi a traves de BOT whatsapp empleando la Super I...