From bbc35d5af90f1026c5ac184abd6b292cddde28ec Mon Sep 17 00:00:00 2001 From: marsalva Date: Fri, 13 Feb 2026 21:24:45 +0000 Subject: [PATCH] Actualizar robot.js --- robot.js | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/robot.js b/robot.js index 695ebff..467a2af 100644 --- a/robot.js +++ b/robot.js @@ -41,10 +41,8 @@ async function main() { } } -// ... (Mantén tus imports y la función main intactos) - // ========================================== -// 🏥 MULTIASISTENCIA V9 (LÓGICA DE FRAMES & SELECTORES) +// 🏥 MULTIASISTENCIA V10 (CON DESCRIPCIÓN FIABLE) // ========================================== async function runMultiasistencia(ownerId, user, pass) { const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] }); @@ -60,7 +58,6 @@ async function runMultiasistencia(ownerId, user, pass) { await page.click('input[type="submit"]'); await page.waitForTimeout(4000); - // Forzar recarga de listado (paso crítico del código de éxito) await page.goto('https://web.multiasistencia.com/w3multi/frepasos_new.php?refresh=1'); await page.waitForTimeout(2000); @@ -69,7 +66,7 @@ async function runMultiasistencia(ownerId, user, pass) { return Array.from(new Set(links.map(a => a.href.match(/reparacion=(\d+)/)?.[1]).filter(Boolean))); }); - console.log(`🔍 [Multi] Procesando ${expedientes.length} expedientes.`); + console.log(`🔍 [Multi] ${expedientes.length} expedientes encontrados.`); for (const ref of expedientes) { await page.goto(`https://web.multiasistencia.com/w3multi/repasos1.php?reparacion=${ref}`, { waitUntil: 'domcontentloaded' }); @@ -77,58 +74,54 @@ async function runMultiasistencia(ownerId, user, pass) { let scrapData = null; - // NAVEGACIÓN POR FRAMES (Soluciona el problema de campos vacíos) for (const frame of page.frames()) { try { scrapData = await frame.evaluate(() => { const clean = (t) => t ? t.replace(/\s+/g, ' ').trim() : ""; const body = document.body?.innerText || ""; - // Si el frame no contiene datos clave, pasamos al siguiente if (!body.includes("Nombre Cliente") && !body.includes("Asegurado")) return null; const allCells = Array.from(document.querySelectorAll('td, th, b, div')); - // Lógica Horizontal: Etiqueta -> Valor a la derecha const getH = (keys) => { const header = allCells.find(el => keys.some(k => el.innerText.toUpperCase().includes(k.toUpperCase()))); return header && header.nextElementSibling ? clean(header.nextElementSibling.innerText) : null; }; - // Lógica Vertical: Etiqueta -> Valor en la fila de abajo (usada para Dirección/Nombre) const getV = (keys) => { const header = allCells.find(el => keys.some(k => el.innerText.trim().toUpperCase() === k.toUpperCase())); if (!header) return null; const idx = header.cellIndex; const row = header.parentElement; - const nextRow = row.nextElementSibling; - // Manejo de THEAD a TBODY si es necesario + let nextRow = row.nextElementSibling; if (!nextRow) { const table = header.closest('table'); const tbody = table ? table.querySelector('tbody') : null; - const firstRow = tbody ? tbody.rows[0] : null; - return firstRow && firstRow.cells[idx] ? clean(firstRow.cells[idx].innerText) : null; + nextRow = tbody ? tbody.rows[0] : null; } return nextRow && nextRow.cells[idx] ? clean(nextRow.cells[idx].innerText) : null; }; + // Lógica específica para la descripción del código que funciona + const getDescription = () => { + let text = getH(["Descripción de la Reparación", "Descripción", "Daños"]) || ""; + // Limpieza de fechas al final del texto + const idxDate = text.search(/\b\d{2}\/\d{2}\/\d{4}\b/); + if (idxDate !== -1) text = text.substring(0, idxDate).trim(); + return clean(text); + }; + const d = {}; - // Extraemos usando los selectores que funcionan en tu código de éxito d['Expediente'] = getH(["Número Reparación", "Número de Servicio"]) || ""; d['Nombre Cliente'] = getV(["Nombre Cliente", "Asegurado"]) || ""; d['Dirección'] = getV(["Dirección", "Domicilio"]) || ""; d['Población_CP'] = getV(["Distrito Postal", "C.P", "Distrito"]) || ""; d['Compañía'] = getH(["Procedencia", "Compañía"]) || "MULTI - MULTIASISTENCIA"; - - // Limpieza de descripción (evita capturar fechas basura) - let rawDesc = getH(["Descripción de la Reparación", "Descripción"]) || ""; - const idxDate = rawDesc.search(/\b\d{2}\/\d{2}\/\d{4}\b/); - d['Descripción'] = idxDate !== -1 ? rawDesc.substring(0, idxDate).trim() : rawDesc; - + d['Descripción'] = getDescription(); d['Urgente'] = getH(["Urgente"]) || "No"; d['Fecha Cita'] = getH(["Fecha realización", "Fecha de Realización"]) || ""; - // Teléfono: Buscamos patrón de 9 dígitos const phoneMatch = body.match(/[6789]\d{8}/); d['Teléfono'] = phoneMatch ? phoneMatch[0] : ""; @@ -140,7 +133,6 @@ async function runMultiasistencia(ownerId, user, pass) { } if (scrapData && scrapData['Nombre Cliente']) { - // Sincronizamos con tu función de guardado en Postgres await saveServiceToDB(ownerId, 'multiasistencia', ref, scrapData); console.log(`✅ [Multi] Guardado: ${ref} - ${scrapData['Nombre Cliente']}`); } @@ -149,10 +141,6 @@ async function runMultiasistencia(ownerId, user, pass) { finally { await browser.close(); } } -// ... (Mantén el resto del archivo igual) -// ========================================== -// 🧹 HOMESERVE (MANTENIDO) -// ========================================== async function runHomeserve(ownerId, user, pass) { const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] }); const page = await browser.newPage();