diff --git a/robot.js b/robot.js index 9638f7b..be77199 100644 --- a/robot.js +++ b/robot.js @@ -125,7 +125,7 @@ async function main() { } // ========================================== -// šŸ„ MULTIASISTENCIA (CON REINTENTOS ANTI-CAƍDAS) +// šŸ„ MULTIASISTENCIA (ROBOT REPARADO Y BLINDADO) // ========================================== async function runMultiasistencia(ownerId, user, pass, gremiosDB) { const browser = await chromium.launch({ @@ -139,8 +139,9 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) { }); const context = await browser.newContext(); const page = await context.newPage(); + try { - // INICIO DE SESIƓN CON REINTENTOS + console.log("šŸŒ [Multi] Iniciando sesión..."); await gotoWithRetry(page, 'https://web.multiasistencia.com/w3multi/acceso.php'); await page.fill('input[name="usuario"]', user); @@ -148,25 +149,19 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) { await page.click('input[type="submit"]'); await page.waitForTimeout(4000); - // ENTRAR AL BUZƓN CON REINTENTOS + console.log("šŸ“„ [Multi] Entrando al buzón..."); await gotoWithRetry(page, 'https://web.multiasistencia.com/w3multi/frepasos_new.php?refresh=1'); await page.waitForTimeout(3000); - console.log("šŸ”„ [Multi] Forzando recarga segura mediante script interno..."); - try { - await page.evaluate(() => { - if (typeof refrescar === 'function') refrescar(); - }); - await page.waitForLoadState('networkidle'); - await page.waitForTimeout(3000); - } catch (e) {} - // --- BUCLE DE PAGINACIƓN --- let todosExpedientes = new Set(); let paginaActual = 1; while (true) { - console.log(`\nšŸ“„ [Multi] Escaneando pĆ”gina ${paginaActual}...`); + console.log(`šŸ“„ [Multi] Escaneando pĆ”gina ${paginaActual}...`); + + // Esperamos un poco a que cargue la tabla para evitar que lea en blanco + await page.waitForTimeout(1000); const expedientesPagina = await page.evaluate(() => { const links = Array.from(document.querySelectorAll('a[href*="reparacion="]')); @@ -176,14 +171,13 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) { console.log(` šŸ‘‰ Encontrados ${expedientesPagina.length} expedientes en la pĆ”gina ${paginaActual}.`); expedientesPagina.forEach(ref => todosExpedientes.add(ref)); - const hasNextPage = await page.evaluate(() => { - const links = Array.from(document.querySelectorAll('a.lnkheader')); - return links.some(a => a.innerText.trim() === 'PĆ”gina siguiente'); - }); + // Buscamos el botón de pĆ”gina siguiente con el selector nativo + const nextBtn = page.locator('a.lnkheader:has-text("PĆ”gina siguiente")').first(); + const hasNextPage = await nextBtn.count() > 0; if (hasNextPage) { console.log(` āž”ļø Botón 'Siguiente' detectado. Pulsando...`); - await page.locator('a.lnkheader:has-text("PĆ”gina siguiente")').first().click(); + await nextBtn.click(); await page.waitForTimeout(3000); paginaActual++; if(paginaActual > 15) { @@ -198,10 +192,9 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) { const expedientes = Array.from(todosExpedientes); console.log(`\nāœ… [Multi] TOTAL EXPEDIENTES LEƍDOS EN WEB: ${expedientes.length}`); - - // šŸ›‘ NUEVO SEGURO DE VIDA: Si lee menos de 5, desconfiamos de la web y NO archivamos nada, por si es un error puntual. + if (expedientes.length > 5 || paginaActual === 1) { - console.log(`🧹 Llamando a la escoba (syncAndArchive) con ${expedientes.length} refs...`); + console.log(`🧹 [Multi] Llamando a la escoba con ${expedientes.length} refs...`); await syncAndArchive(ownerId, 'multiasistencia', expedientes); } else { console.log("āš ļø [Multi] Pocos expedientes detectados. ABORTANDO ARCHIVADO DE SEGURIDAD."); @@ -230,16 +223,11 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) { const descHeader = Array.from(document.querySelectorAll('td.tcab')).find(td => td.innerText.includes("Descripción de la Reparación")); if (descHeader && descHeader.nextElementSibling) rawDesc = clean(descHeader.nextElementSibling.innerText); - // CORRECCIƓN: Borrado el recorte de fechas destructivo. - // Ahora le pasamos todo el bloque de texto completo a la IA para que no se pierdan palabras clave. - const cleanDesc = rawDesc; - const rawCPField = findByCab("Distrito Postal") || ""; const cpMatch = rawCPField.match(/\b\d{5}\b/); const cpOnly = cpMatch ? cpMatch[0] : ""; const popOnly = rawCPField.replace(cpOnly, '').replace('-', '').trim(); - // šŸ“ž EXTRAER TELƉFONO REAL (Evita coger el de la oficina) let telefonoReal = ""; const titulosDiv = Array.from(document.querySelectorAll('.subtitulo')); const divTelefono = titulosDiv.find(div => div.innerText && div.innerText.includes('TelĆ©fono')); @@ -247,7 +235,6 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) { const celdaNum = divTelefono.nextElementSibling.querySelector('.tdet'); if (celdaNum) telefonoReal = celdaNum.innerText.replace(/[^0-9]/g, ''); } - // Fallback por si acaso falla, usamos el que tenĆ­as antes if (!telefonoReal || telefonoReal.length < 9) { telefonoReal = (document.body.innerText.match(/[6789]\d{8}/) || [])[0] || ""; } @@ -259,9 +246,9 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) { "Población": popOnly, "Código Postal": cpOnly, "CompaƱƭa": "MULTI - " + (findByCab("Procedencia") || "MULTIASISTENCIA"), - "Descripción": cleanDesc, + "Descripción": rawDesc, "TelĆ©fono": telefonoReal, - "Estado": findByCab("Estado") || "", // šŸ›‘ AƑADIDO EL ESTADO AQUƍ + "Estado": findByCab("Estado") || "", "Urgente": findByCab("Urgente") || "No" }; });