diff --git a/content.js b/content.js index 634d5da..2f4a165 100644 --- a/content.js +++ b/content.js @@ -1,5 +1,5 @@ const defaultMessages = [ - '😊 ¡Hola! Qué gusto saludarte. Soy xxxxxxxx, asesor de Claro, y es un placer para mí ser la persona que le dé solución a tu solicitud. ¿Me confirmas por favor tu nombre completo, número de cédula y cómo puedo ayudarte hoy🌤️? 📄', + '😊 ¡Hola! Qué gusto saludarte. Soy xxxxxxxx, asesor de Claro, y es un placer para mí ser la persona que le dé solución a tu solicitud. ¿Me confirmas por favor tu nombre completo, número de cédula y cómo puedo ayudarte hoy🌤️? 📄', '👋 ¡Hola! Bienvenido(a) al canal de atención de Claro. Mi nombre es xxxxxxxx y con gusto me encargaré de tu solicitud🤩 haré todo lo que esté a mi alcance para encontrar solución a cualquier novedad que estés presentando. Para comenzar, ¿puedes indicarme tu nombre y número de documento? 📝', '🤗 ¡Hola! Gracias por contactarnos. Soy xxxxxxxx, me complace mucho poder ayudarte el día de hoy;🌈🌸 Me comprometo a hacer todo lo que esté en mis manos para encontrar una solución a cualquier percance que tengas hoy. Cuéntame con qué puedo ayudarte, y por favor compárteme tu nombre completo, cédula y el número de la línea si es posible. 📱', '🌟 ¡Hola! Espero que estés muy bien. Mi nombre es xxxxxxxx y con gusto te acompañaré con tu solicitud para poder darle solución a cualquier inquietud que presentes. ¿Podrías confirmarme tus datos: nombre, cédula y si es un servicio hogar o móvil? 💬', @@ -87,112 +87,98 @@ async function procesarElementosWhatsapp() { if (element.classList.contains('new-case')) { console.log('Elemento es un new-case'); element.click(); - await new Promise(resolve => setTimeout(resolve, 1200)); + const caseID = document.querySelector('.social-case-conversation-header span')?.textContent || ''; + console.log('Nuevo caso: ' + caseID); + await new Promise(resolve => setTimeout(resolve, 1500)); const headerText = document.querySelector('.social-case-conversation-header span')?.textContent || ''; - console.log('Nuevo caso: ' + headerText); + + const clientConversationItems = document.querySelectorAll('.case-conversation-item.client'); + const allBodyTextsClient = []; + + // Process client conversation items asynchronously + await Promise.all(Array.from(clientConversationItems).map(async (item) => { + const bodyTextSpansClient = item.querySelectorAll('span.body-text'); + await Promise.all(Array.from(bodyTextSpansClient).map(async (span) => { + const randomId = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); + allBodyTextsClient.push({ + id: randomId, + role: "user", + content: span.textContent.trim() + }); + })); + })); + + console.log('Textos span.body-text de elementos .case-conversation-item.client:', allBodyTextsClient); + // Check if there are any messages in the conversation + if (allBodyTextsClient.length === 0) { + console.log('No client messages found, skipping case'); + element.classList.add('caso-gestionado'); + continue; + } + // Get the last message from the client + const lastMessage = allBodyTextsClient[allBodyTextsClient.length - 1]; + // Verify if the last message is empty or only contains whitespace + if (!lastMessage.content || lastMessage.content.trim() === '') { + console.log('Last message is empty, skipping case'); + element.classList.add('caso-gestionado'); + continue; + } + + + console.log('Caso new-case: ' + headerText); const textarea = document.querySelector('.selected-message-container-all-case textarea#textareaActAsChat'); if (textarea && textarea.offsetHeight > 0 && textarea.offsetWidth > 0 && getComputedStyle(textarea).display !== 'none' && getComputedStyle(textarea).visibility !== 'hidden') { console.log('El textarea está visible.'); - // Capturar TODOS los mensajes en orden cronológico - const conversationItems = document.querySelectorAll( - '.case-conversation-item.client, .case-conversation-item.agent, .case-conversation-item.system' - ); - - const allMessages = []; - conversationItems.forEach(item => { - if (item.classList.contains("client")) { - const spans = item.querySelectorAll("span.body-text"); - spans.forEach(span => { - if (span.textContent.trim() !== "") { - allMessages.push({ - id: Math.random().toString(36).substring(2, 15), - role: "user", - content: span.textContent.trim() - }); - } - }); - } else if (item.classList.contains("agent") || item.classList.contains("system")) { - const texts = item.querySelectorAll(".sm-whatsapp .text, span.body-text"); - texts.forEach(t => { - if (t.innerText.trim() !== "") { - allMessages.push({ - id: Math.random().toString(36).substring(2, 15), - role: "assistant", - content: t.innerText.trim() - }); - } - }); + // Intentar obtener el mensaje guardado en chrome.storage.local + let selectedMessage; + try { + // Obtener el mensaje guardado de forma sincrónica + const data = await chrome.storage.local.get(['mensaje']); + if (data.mensaje) { + console.log('Usando mensaje guardado desde chrome.storage.local'); + selectedMessage = data.mensaje; + } else { + console.log('No hay mensaje guardado, usando uno aleatorio'); + selectedMessage = defaultMessages[Math.floor(Math.random() * defaultMessages.length)].replace(/xxxxxxxx/g, capitalizedName); } - }); + } catch (error) { + console.error('Error al obtener mensaje guardado:', error); + selectedMessage = defaultMessages[Math.floor(Math.random() * defaultMessages.length)].replace(/xxxxxxxx/g, capitalizedName); + } + textarea.value = selectedMessage; + textarea.dispatchEvent(new Event('input', { bubbles: true })); + console.log('Mensaje 1 escrito en caso:', selectedMessage); - console.log("Conversación en orden:", allMessages); + await new Promise(resolve => setTimeout(resolve, 1500)); + const sendButton = document.querySelector('a.social-case-reply-as-chat-send'); + if (sendButton && sendButton.offsetParent !== null) { + // sendButton.click(); + console.log('Mensaje 1 enviado'); + } + await new Promise(resolve => setTimeout(resolve, 2500)); + const selectedMessageTwo = secondMessages[Math.floor(Math.random() * secondMessages.length)]; + textarea.value = selectedMessageTwo; + textarea.dispatchEvent(new Event('input', { bubbles: true })); + console.log('Mensaje 2 escrito en caso:', selectedMessageTwo); - const data = await chrome.storage.local.get("okanToken"); - const okanToken = data.okanToken; - let mensaje; - - if (okanToken) { - console.log('Token obtenido: ' + okanToken); - const options = { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Accept': '*/*', - 'Authorization': `Bearer ${okanToken}` - }, - body: JSON.stringify({ - "datos": { "tema": "", "extraContext": "" }, - "history": allMessages - }) - }; - - try { - const response = await fetch('https://io.linguogpt.ai/api/assistant/7cb1a048-8e67-44fe-a71e-ccacf19ef944', { ...options, timeout: 15000 }); - if (response.status === 200) { - const data = await response.json(); - if (data.suggestions && data.suggestions.length > 0) { - mensaje = data.suggestions[0].text; - console.log('Mensaje obtenido del endpoint:', mensaje); - } - } else if (response.status === 401) { - alert("Debes iniciar sesión en Okan"); - console.warn('Authentication error: User needs to login to Okan'); - } else { - console.error('Error en respuesta de linguo:', response.status); - } - } catch (error) { - console.error('Error en la petición a linguo:', error); - } + await new Promise(resolve => setTimeout(resolve, 1200)); + if (sendButton && sendButton.offsetParent !== null) { + // sendButton.click(); + console.log('Mensaje 2 enviado'); } - const overlay_hide = document.getElementById(`robotOverlay`); - if (overlay_hide) overlay_hide.remove(); - - if (mensaje) { - textarea.value = mensaje; - textarea.dispatchEvent(new Event('input', { bubbles: true })); - console.log('Mensaje escrito en caso:', mensaje); - - await new Promise(resolve => setTimeout(resolve, 1200)); - const sendButton = document.querySelector('a.social-case-reply-as-chat-send'); - if (sendButton && sendButton.offsetParent !== null) { - sendButton.click(); - console.log('Mensaje enviado'); - } - } else { - console.log("No se obtuvo mensaje de Linguo, caso se marca como gestionado igualmente."); - } element.classList.add('caso-gestionado'); console.log('Caso gestionado: ' + headerText); } - } else if (element.classList.contains('unread') && !element.classList.contains('new-case')) { + } + else if (element.classList.contains('unread') && !element.classList.contains('new-case')) { console.log('Element classes:', element.classList.toString()); element.click(); await new Promise(resolve => setTimeout(resolve, 1200)); - const headerText = document.querySelector('.social-case-conversation-header span')?.textContent || ''; - console.log('Caso unread: ' + headerText); + const caseID = document.querySelector('.social-case-conversation-header span')?.textContent || ''; + console.log('Caso unread: ' + caseID); const textarea = document.querySelector('.selected-message-container-all-case textarea#textareaActAsChat'); if (textarea && textarea.offsetHeight > 0 && textarea.offsetWidth > 0 && getComputedStyle(textarea).display !== 'none' && getComputedStyle(textarea).visibility !== 'hidden') { console.log('El textarea está visible.'); @@ -202,16 +188,26 @@ async function procesarElementosWhatsapp() { '.case-conversation-item.client, .case-conversation-item.agent, .case-conversation-item.system' ); - const allMessages = []; + // Construir el objeto con la estructura requerida + const payload = { + conversation_id: caseID, + source_chat: 'SMCC Recap - Test', + case_info: { + base_id: '7cb1a048-8e67-44fe-a71e-ccacf19ef944', + context_extra: '' + }, + messages: [] + }; + conversationItems.forEach(item => { if (item.classList.contains("client")) { const spans = item.querySelectorAll("span.body-text"); spans.forEach(span => { if (span.textContent.trim() !== "") { - allMessages.push({ - id: Math.random().toString(36).substring(2, 15), + payload.messages.push({ + id: item.getAttribute('id'), role: "user", - content: span.textContent.trim() + content: span.textContent.replace(/\n{2,}/g, '\n').trim() }); } }); @@ -219,17 +215,17 @@ async function procesarElementosWhatsapp() { const texts = item.querySelectorAll(".sm-whatsapp .text, span.body-text"); texts.forEach(t => { if (t.innerText.trim() !== "") { - allMessages.push({ - id: Math.random().toString(36).substring(2, 15), + payload.messages.push({ + id: item.getAttribute('id'), role: "assistant", - content: t.innerText.trim() + content: t.innerText.replace(/\n{2,}/g, '\n').trim() }); } }); } }); - console.log("Conversación en orden:", allMessages); + console.log("Conversación en orden:\n" + JSON.stringify(payload, null, 2)); const data = await chrome.storage.local.get("okanToken"); const okanToken = data.okanToken; @@ -251,11 +247,11 @@ async function procesarElementosWhatsapp() { }; try { - const response = await fetch('https://io.linguogpt.ai/api/assistant/7cb1a048-8e67-44fe-a71e-ccacf19ef944', { ...options, timeout: 15000 }); + const response = await fetch('https://agent.linguogpt.ai/api/agent/run/bd63d7f5-667e-4f6b-ba31-9e4c02a26ed8', { ...options, timeout: 15000 }); if (response.status === 200) { const data = await response.json(); if (data.suggestions && data.suggestions.length > 0) { - mensaje = data.suggestions[0].text; + mensaje = data.message; console.log('Mensaje obtenido del endpoint:', mensaje); } } else if (response.status === 401) { @@ -272,6 +268,8 @@ async function procesarElementosWhatsapp() { const overlay_hide = document.getElementById(`robotOverlay`); if (overlay_hide) overlay_hide.remove(); + console.log("Mensaje de linguo: "+mensaje); + if (mensaje) { textarea.value = mensaje; textarea.dispatchEvent(new Event('input', { bubbles: true })); @@ -280,7 +278,7 @@ async function procesarElementosWhatsapp() { await new Promise(resolve => setTimeout(resolve, 1200)); const sendButton = document.querySelector('a.social-case-reply-as-chat-send'); if (sendButton && sendButton.offsetParent !== null) { - sendButton.click(); + // sendButton.click(); console.log('Mensaje enviado'); } } else { @@ -288,7 +286,7 @@ async function procesarElementosWhatsapp() { } element.classList.add('caso-gestionado'); - console.log('Caso gestionado: ' + headerText); + console.log('Caso gestionado: ' + caseID); } } else { continue; @@ -309,5 +307,6 @@ async function procesarElementosWhatsapp() { procesandoCasos = false; } -// Ejecutar la función cada 3 segundos -setInterval(procesarElementosWhatsapp, 7000); \ No newline at end of file +// Ejecutar la función cada 7 segundos +setInterval(procesarElementosWhatsapp, 7000); +// procesarElementosWhatsapp(); diff --git a/content2.js b/content2.js new file mode 100644 index 0000000..f373e85 --- /dev/null +++ b/content2.js @@ -0,0 +1,295 @@ +const defaultMessages = [ + '😊 ¡Hola! Qué gusto saludarte. Soy xxxxxxxx, asesor de Claro, y es un placer para mí ser la persona que le dé solución a tu solicitud. ¿Me confirmas por favor tu nombre completo, número de cédula y cómo puedo ayudarte hoy🌤️? 📄', + '👋 ¡Hola! Bienvenido(a) al canal de atención de Claro. Mi nombre es xxxxxxxx y con gusto me encargaré de tu solicitud🤩 haré todo lo que esté a mi alcance para encontrar solución a cualquier novedad que estés presentando. Para comenzar, ¿puedes indicarme tu nombre y número de documento? 📝', + '🤗 ¡Hola! Gracias por contactarnos. Soy xxxxxxxx, me complace mucho poder ayudarte el día de hoy;🌈🌸 Me comprometo a hacer todo lo que esté en mis manos para encontrar una solución a cualquier percance que tengas hoy. Cuéntame con qué puedo ayudarte, y por favor compárteme tu nombre completo, cédula y el número de la línea si es posible. 📱', + '🌟 ¡Hola! Espero que estés muy bien. Mi nombre es xxxxxxxx y con gusto te acompañaré con tu solicitud para poder darle solución a cualquier inquietud que presentes. ¿Podrías confirmarme tus datos: nombre, cédula y si es un servicio hogar o móvil? 💬', + '✨ ¡Hola! Un gusto saludarte 😊 Soy xxxxxxxx, asesor de Claro, con gusto atenderé tu solicitud, recuerda permanecer en el chat para agilizar la atención. Para empezar, ¿me puedes compartir tu nombre completo, cédula y contarme cómo puedo ayudarte?❤️ ' +]; + +const secondMessages = [ + 'Te invitamos a registrarte en la App Mi Claro de manera sencilla y rápida, para que puedas consultar y gestionar tus servicios desde un solo lugar. Solo necesitas hacer clic en el siguiente enlace: https://f63y8.app.goo.gl/gen_registro_wt. Recuerda que a través de la app Mi Claro puedes gestionar la factura de tus servicios Claro, cambiar las claves de Wi-Fi, añadir elegidos de familia y amigos, re-agendar visitas técnicas y calificar la atención de nuestros técnicos.', + '¡Recuerda gestionar tus servicios Claro de manera fácil y rápida! 📱✨ Descarga la app Mi Claro y accede a tus facturas, consulta tu consumo y realiza pagos en segundos. 💳💡 ¡Descárgala hoy mismo y disfruta de todas sus ventajas! 🎉🔗 https://f63y8.app.goo.gl/miclaro', + 'Te invitamos a hacer uso de Mi Claro App, desde aquí podrás: administrar tus productos, ver el detalle de tu plan o cuenta hogar, pagar tus facturas, personalizar tu red wifi, realizar compras de paquetes prepago y postpago; realizar seguimiento de tus visitas técnicas programadas, agendar turnos en oficinas, acceder a los beneficios que tienes por ser cliente Claro al descargar los cupones de Claro Club, realizar compras de productos y muchas cosas más en un solo lugar.', + 'Deseamos recordarle que como usuario, cuenta con acceso a la App Mi Claro📲, en donde puede realizar múltiples acciones de manera fácil y rápida✅: pagar su factura, recargar su línea, consultar servicios de móvil y hogar, y gestionar su clave Wifi y el registro de IMEI. También puede legalizar líneas, comprar en plataformas de streaming y acceder a Claro Club. Adicionalmente, tiene la posibilidad de revisar el estado de sus consumos y aumentar la capacidad de su plan aprovechando diferentes ofertas💗 https://www.claro.com.co/personas/autogestion/app-mi-claro/', + 'Recuerda hacer uso de nuestra app mi Claro 📲 ya que puedes autogestionar diferentes procesos como compra de paquetes, realizar pagos de tus servicios, consumos del servicio, personificación de nombre y contraseña de red wifi, entre muchas más funciones.🎉', + '📌Recuerda que contamos con la maravillosa App Mi Claro, la cual puedes utilizar para todo tipo de trámites 📫, como por ejemplo consultas sobre sus facturas 📃, consumos 📈, soporte hogar 🛠️, cambio de contraseñas wifi ⚙️, consulta de cuotas 📱, pagos y mucho más 💸✅', + 'Mientras estés en la línea, recuerda que puedes aprovechar esta oportunidad para gestionar tu uso de la plata de forma fácil y rápida. Con la plataforma Clave Mi Claro, puedes validar todo tipo de gestiones: desde tu facturación hasta la contratación de servicios como Netflix, HBO y Amazon Prime. 📺 Además, puedes agendar visitas técnicas y obtener información sobre ellas. ¡Disfruta de todas estas facilidades! 🌟', + 'Acá estaré cuando estés listo para responder, por ahora, recuerda que estoy acá pendiente para ayudarte. Mientras estamos en gestión te recordamos que puedes ¡Optimizar el servicio de internet en tu hogar con Ultra Wifi de Claro! 📶 Disfruta de una experiencia superior de conexión en línea con tu familia. Con Ultra Wifi, recibirás dos unidades repetidoras de señal que asegurará una conexión estable y sin interrupciones, incluso en las áreas más alejadas de tu hogar.Además de mejorar la cobertura, Ultra Wifi te ofrece pago flexibles: Adquiere Ultra Wifi por solo $10,900 mensuales y difiere el pago hasta en 36 cuotas, facilitando tu presupuesto familiar. ¿Listo para mejorar tu experiencia de internet en casa? ¿Te gustaría activarlo ahora mismo? 🌐', + 'Recuerda que para gestionar la información de tu visita, como lo son los datos del técnico (su nombre, documento, credencial, etc.),🛠️ realizar el re-agendamiento de la misma, su cancelación, llevar a cabo un seguimiento en tiempo de real de su realización y calificar al técnico,✅ puedes hacerlo por medio de la App Mi Claro 🛠️.', + 'Mientras le doy solución recuerda que con Claro, puede financiar fácilmente la tecnología que más le guste, ya sea televisores, celulares o consolas📺️📱. Si me permite un momento, voy generar un reporte y mi compañero se comunicara con usted para brindará toda la información . ¡No deje pasar esta oportunidad!.', + 'Sabías que puedes gestionar todos tus servicios, como validar la factura o pagarla; gestionar tu red wifi; calificar las visitas técnicas programadas; conocer las ofertas que tenemos en el momento desde la App mi claro.😀😀 https://www.claro.com.co/personas/autogestion/app-mi-claro/' +]; + +// Variable para controlar si hay un procesamiento en curso +let procesandoCasos = false; + +// Función asíncrona para procesar los elementos de WhatsApp +async function procesarElementosWhatsapp() { + // Si ya hay un procesamiento en curso, no iniciamos otro + if (procesandoCasos) { + console.log('Ya hay un procesamiento en curso. Esperando a que termine...'); + return; + } + + const allWhatsappElements = Array.from(document.querySelectorAll('.navigation-whatsapp')).filter( + el => !el.classList.contains('caso-gestionado') + ); + + if (allWhatsappElements.length === 0) { + return; // No hay nada que hacer, salimos. + } + + // Declarar overlay aquí para que sea accesible en el bloque `finally`. + let overlay = null; + procesandoCasos = true; + + // Usar un bloque try...finally para garantizar la limpieza. + try { + console.log('Elementos de WhatsApp para procesar:', allWhatsappElements.length); + + const nameElement = document.querySelector('p.name'); + const capitalizedName = nameElement?.textContent + ? nameElement.textContent + .split(' ') + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(' ') + : 'Asesor'; + + // Crear y mostrar el overlay + overlay = document.createElement('div'); + overlay.id = `robotOverlay`; + overlay.style.position = 'fixed'; + overlay.style.top = '0'; + overlay.style.left = '0'; + overlay.style.width = '100%'; + overlay.style.height = '100%'; + overlay.style.backgroundColor = 'rgba(255, 255, 255, 0.5)'; + overlay.style.zIndex = '9999'; + overlay.style.display = 'flex'; + overlay.style.justifyContent = 'center'; + overlay.style.alignItems = 'center'; + overlay.innerHTML = `