jueves, 29 de septiembre de 2022

BOT Whatsapp ¿Quién es ese pokémon?

 Hola a continuación le dejo material para que puedan implementar un BOT Whatsapp que invoca a la API Pokemon https://pokeapi.co/  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 "quien es este pokemon" 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/1zXIh0LVrodXtgDpHp5EFaUxniNjQShi8-jy0DPvVptU/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

Video Implementación



Página Excel Plantilla


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


Pasos de ejecución

Luego de haber copiado el código appscript y desplegarlo , ejecutar la funcion onOpen y se mostrara un menu de opciones Whatsapp , iniciar con el paso 1 y se mostrara codigo QR que debe escanearlo con su Whatsapp y se obtendra token de session en la celda 3B

Luego ejecutar el paso 2 Menu Whatsapp se iniciara el BOT

Esperar 10 seg a que aparesca el menu Whatsapp

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

    }

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

            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 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 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 ', 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) {

    var result, jo = {};

    try {

        var resultado = JSON.parse(informacion);

        var excel = SpreadsheetApp.getActiveSpreadsheet();

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

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

      sheet_sumarry.getRange(10, 1).setValue(informacion);

        jo.status = '1';

        jo.message = "error";

        var nombre_cliente = "";

        var nombre_adivinar = "";

        var ultimoevento = "";

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

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

            if (resultado.mensaje[ill].evento == "validar_pokemon"  || resultado.mensaje[ill].evento == "cerrar_consulta_pokemon" ) {

                nombre_adivinar = resultado.mensaje[ill].mensaje;

            }

          if (resultado.mensaje[ill].evento.includes("adivinar_pokemon_informacion")) {

                nombre_cliente = resultado.mensaje[ill].evento.replace("adivinar_pokemon_informacion","");

            }

            ultimoevento = resultado.mensaje[ill].evento;

        }

        jo.status = '1';

        jo.message = ' No existe';

      

        if (ultimoevento == "adivinar_pokemon") {

            jo.message = "No existe informacion 🚫";

            var options ={'headers': { "Content-Type": "application/json" },'method': "GET"};

            var response = UrlFetchApp.fetch("https://pokeapi.co/api/v2/pokemon?limit=1000000&offset=0", options);

            var json = JSON.parse(response.getContentText());

            var nombre_aleatorio="";

            if(json.count>0){

              var aleatorio = parseInt((Math.random() * (json.count - 1) + 1));

              var url_detalle = json.results[aleatorio].url;

              var nombre_aleatorio = json.results[aleatorio].name;

              var response_detalle = UrlFetchApp.fetch(url_detalle, options);

              var json_detalle = JSON.parse(response_detalle.getContentText());

              var imagen = json_detalle.sprites.other.home.front_default;

              jo.message = "¡¡¡ Adivina el POKEMON ¡¡¡;*IMAGES*;"+imagen;

            }      

          jo.conversacion = { "mensaje": "", "evento": "adivinar_pokemon_informacion"+nombre_aleatorio, "retornar": "nombre_pokemon" };

          jo.status = '0';

        }else if (ultimoevento == "validar_pokemon") {

            jo.message = "No es el nombre del pokemon 🚫 , se llama "+nombre_cliente;

            if(nombre_cliente.toUpperCase()==nombre_adivinar.toUpperCase()){

             jo.message = "OK el nombre es correcto ✅";

            }      

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

          jo.status = '0';

        } else if (ultimoevento == "cerrar_consulta_pokemon") {

            jo.message = "No existe el nombre "+nombre_adivinar +"  del POKEMON ingresado 🚫 ";

            var options ={'headers': { "Content-Type": "application/json" },'method': "GET"};

            var response = UrlFetchApp.fetch("https://pokeapi.co/api/v2/pokemon?limit=1000000&offset=0", options);

            var json = JSON.parse(response.getContentText());

            if(json.count>0){

              const result = json.results.find(word => word.name.toUpperCase() == nombre_adivinar.toUpperCase());

              if(result!=undefined){

                 var url_detalle = result.url;

                 var response_detalle = UrlFetchApp.fetch(url_detalle, options);

                 var json_detalle = JSON.parse(response_detalle.getContentText());

                 var imagen = json_detalle.sprites.other.home.front_default;

                jo.message = "¡¡¡ TU POKEMON "+nombre_adivinar+"¡¡¡;*IMAGES*;"+imagen;                

              }  

            }

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

            jo.status = '0';

        }

    } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

    }

    var result = JSON.stringify(jo);

    return result;

}



SI DESEA HABILITAR EL 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/

BOT Whatsapp Cupones QR con google sheets

 Hola a continuación le dejo material para que puedan implementar un BOT Whatsapp para entregar cupones 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 entrega cupones 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/1egsv5Eo-aExTTrj_xun-7u5j2YmOECuoB0RUCL4DZB0/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

Video Implementación



Página Excel Plantilla


https://docs.google.com/spreadsheets/d/1egsv5Eo-aExTTrj_xun-7u5j2YmOECuoB0RUCL4DZB0/edit?usp=sharing


Pasos de ejecución

Luego de haber copiado el código appscript y desplegarlo , ejecutar la funcion onOpen y se mostrara un menú de opciones Whatsapp , iniciar con el paso 1 y se mostrara codigo QR que debe escanearlo con su Whatsapp y se obtendra token de session en la celda 3B

Luego ejecutar el paso 2 Menu Whatsapp se iniciara el BOT

Esperar 10 seg a que aparesca el menu Whatsapp

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

    }

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

            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 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 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 ', 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) {

    var result, jo = {};

    try {

        var resultado = JSON.parse(informacion);

        var excel = SpreadsheetApp.getActiveSpreadsheet();

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

        jo.status = '1';

        jo.message = "error";

        var nombre_cliente = "";

        var ultimoevento = "";

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

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

            if (resultado.mensaje[ill].evento == "despues_nombre") {

                nombre_cliente = resultado.mensaje[ill].mensaje;

            }

            ultimoevento = resultado.mensaje[ill].evento;

        }

        jo.status = '1';

        jo.message = ' No existe';

        if (ultimoevento == "reserva_cupon") {

            jo.message = "No existe ningun cupon disponible 🚫";

            var sheet_sumarry = excel.getSheetByName("Cupones");

            var rows_sumarry = sheet_sumarry.getRange(2, 1, sheet_sumarry.getLastRow() - 1, sheet_sumarry.getLastColumn()).getValues();

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

                    if (rows_sumarry[i2][1] == "Entregado" && rows_sumarry[i2][3]==numero) {

                        jo.message = "Ya tiene asignado un CUPON a su numero" +numero +"  🚫 ";

                        break;

                    }else if (rows_sumarry[i2][1] == "Pendiente") {

                        jo.message = "Tu codigo de CUPON ES  " +rows_sumarry[i2][0] +"\n *Recueda el CUPON es unico e intransferible* \nGracias espero haberte ayudado👋.";

                        var QR = encodeURIComponent("Gracias por solicitar tu cupon BOTS :\nNombre : "+nombre_cliente+"\nCUPON :"+rows_sumarry[i2][0]+"Fecha Solicitud : "+fecha);

                        jo.message+= ";*IMAGES*;"+"https://chart.googleapis.com/chart?chs=400x400&cht=qr&chl="+QR;

                        sheet_sumarry.getRange(i2+2, 2).setValue("Entregado");

                        sheet_sumarry.getRange(i2+2, 3).setValue(nombre_cliente);

                        sheet_sumarry.getRange(i2+2, 4).setValue(numero);

                        sheet_sumarry.getRange(i2+2, 5).setValue(fecha);

                        break;

                    }

            }

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

            jo.status = '0';

        } else if (ultimoevento == "consulta_cupon") {

            jo.message = "No existe ningun cupon registrado para su Numero "+numero +" 🚫 ";

            var sheet_sumarry = excel.getSheetByName("Cupones");

            var rows_sumarry = sheet_sumarry.getRange(2, 1, sheet_sumarry.getLastRow() - 1, sheet_sumarry.getLastColumn()).getValues();

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

                    if (rows_sumarry[i2][1] == "Entregado" && rows_sumarry[i2][3]==numero) {

                        jo.message = "Tu codigo de CUPON ES  " +rows_sumarry[i2][0]+" ✅";

                        break;

                    }

            }

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

            jo.status = '0';

        }

    } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

    }

    var result = JSON.stringify(jo);

    return result;

}

SI DESEA HABILITAR EL 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/

lunes, 12 de septiembre de 2022

Sistema de Tienda Online

  A continuación se muestra una solución  de una tienda online para venta de ropas se emplea google APP Script, google Sheet, blogger , esta realizada con HTML 5 Responsive - Jquery se alinea a diversos tipos de navegadores Web y Mobile.

¿ Que necesitas para implementarlo ?

- SOLO  una cuenta de GMAIL

- Abrir URL Blogger

LINK APLICACIÓN :

https://carritocomprasropa.blogspot.com/

EXCEL APLICACIÓN :

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

VIDEO APLICACION :

FUENTES APLICACIÓN :

Para obtener las fuentes tiene un costo $ 2.00.

IR a PAGAR 2 DOLARES

NOTA : Luego del pago se redireccionara a una carpeta para descargar las fuentes

ASESORIA PERSONALIZADA :

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

https://reservarasesoriaanlusoft.blogspot.com/

jueves, 8 de septiembre de 2022

Sistema Asistencia Personal en campo con biometría y geolocalización

  A continuación se muestra una solución  control asistencia para el personal que trabaja en campo empleando  google APP Script, google Sheet, google Maps , esta realizada con HTML 5 Responsive - Jquery se alinea a diversos tipos de navegadores Web y Mobile. empleando validacion biométrica y geolocalización.

¿ Que necesitas para implementarlo ?

- SOLO  una cuenta de GMAIL

- Abrir URL Blogger

LINK APLICACIÓN :

https://anlusoftsegumientopersonal.blogspot.com/

EXCEL APLICACIÓN :

https://docs.google.com/spreadsheets/d/1tQ6For9s9XumzBd4okU87YcUBcJqZXt-wnAt7FrMy-Y/edit?usp=sharing

PAGINA GENERAR IMAGEN A BASE 64:

https://codebeautify.org/image-to-base64-converter

Nota : no debe pesar mas de 20KB restricción google sheets

VIDEO APLICACION :

FUENTES APLICACIÓN :

Para obtener las fuentes tiene un costo $ 3.00.

IR a PAGAR 3 DOLARES

NOTA : Luego del pago se redireccionara a una carpeta para descargar las fuentes

ASESORIA PERSONALIZADA :

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

https://reservarasesoriaanlusoft.blogspot.com/

domingo, 4 de septiembre de 2022

Notificacion Push con google sheet

 Hola a continuación le dejo material para que puedan implementar sus notificaciones tipo push desde una hoja de google sheet

¿ Que necesitas para implementarlo?

         - Solo tener cuenta en firebase y gmail

Video Implementación



Fuentes de la solución (html,js ,appscript)


https://drive.google.com/file/d/19SV2BHE8MrbETlGSEpd_DX3Zw9hYX5vU/view?usp=sharing

  • Debes desplegar la solucion en un url que tenga https, caso contrario firebase no autentica
  • Es importante crear la estructura de carpetas, caso contrario no se instalara el service workers

 index.html

 Notificacion/firebase-messaging-sw.js


Pagina google sheet (plantilla)


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


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