From bfed3ee8eb52c2486c70aa98ccd7775992e008d9 Mon Sep 17 00:00:00 2001 From: marsalva Date: Fri, 13 Feb 2026 20:53:27 +0000 Subject: [PATCH] Actualizar robot.js --- robot.js | 73 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/robot.js b/robot.js index 3be47f1..c237d97 100644 --- a/robot.js +++ b/robot.js @@ -44,15 +44,15 @@ async function main() { // ... (Mantén tus imports y la función main igual) // ========================================== -// 🏥 MULTIASISTENCIA V5 (EXTRACCIÓN QUIRÚRGICA) +// 🏥 MULTIASISTENCIA V6 (LÓGICA DE REBOTE) // ========================================== async function runMultiasistencia(ownerId, user, pass) { - const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] }); + const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] }); const context = await browser.newContext(); const page = await context.newPage(); try { - console.log("🌍 [Multi] Conectando..."); + console.log("🌍 [Multi] Iniciando extracción..."); await page.goto('https://web.multiasistencia.com/w3multi/acceso.php', { timeout: 60000 }); const userInput = await page.$('input[name="usuario"]') || await page.$('input[type="text"]'); @@ -60,7 +60,7 @@ async function runMultiasistencia(ownerId, user, pass) { await userInput.fill(user); await page.fill('input[type="password"]', pass); await page.click('input[type="submit"]'); - await page.waitForTimeout(4000); + await page.waitForTimeout(5000); } await page.goto('https://web.multiasistencia.com/w3multi/frepasos_new.php?refresh=1', { waitUntil: 'domcontentloaded' }); @@ -77,45 +77,41 @@ async function runMultiasistencia(ownerId, user, pass) { const fullData = await page.evaluate(() => { const data = {}; - const allElements = Array.from(document.querySelectorAll('td, b, span, div, font')); + // Cogemos todos los elementos que suelen contener texto en Multi + const all = Array.from(document.querySelectorAll('td, b, span, div, font, strong')); - // Función interna para buscar el valor que está JUSTO después de un texto - const findValueAfter = (label) => { - const found = allElements.find(el => el.innerText.trim().replace(':', '') === label); - if (!found) return null; + const labelsToFind = [ + "Número Reparación", "Número de Póliza", "Nombre Cliente", + "Dirección", "Distrito Postal", "Procedencia", + "Descripción de la Reparación", "Tramitador", "Urgente", "Fecha realización" + ]; - // 1. Probar con el siguiente elemento hermano - if (found.nextElementSibling) return found.nextElementSibling.innerText.trim(); + labelsToFind.forEach(label => { + // Buscamos el elemento que contiene EXACTAMENTE el texto de la etiqueta + const foundIndex = all.findIndex(el => el.innerText.trim().replace(':', '') === label); - // 2. Probar con la celda de al lado (si es una tabla) - if (found.tagName === 'TD' && found.parentElement) { - const cells = Array.from(found.parentElement.children); - const index = cells.indexOf(found); - if (cells[index + 1]) return cells[index + 1].innerText.trim(); + if (foundIndex !== -1) { + // Multiasistencia a veces pone el valor en el siguiente TD o en el siguiente elemento + // Vamos a saltar hasta 3 posiciones adelante buscando un valor que NO sea otra etiqueta + for (let i = 1; i <= 3; i++) { + const candidate = all[foundIndex + i]; + if (candidate) { + const val = candidate.innerText.trim(); + // Si el valor no es una de nuestras etiquetas y no está vacío, es el dato real + if (val && val.length > 0 && !labelsToFind.includes(val.replace(':', ''))) { + data[label] = val; + break; + } + } + } } - return null; - }; + }); - // Mapeo directo de etiquetas reales de la web - data['Número Reparación'] = findValueAfter('Número Reparación'); - data['Número de Póliza'] = findValueAfter('Número de Póliza'); - data['Nombre Cliente'] = findValueAfter('Nombre Cliente'); - data['Dirección'] = findValueAfter('Dirección'); - data['Distrito Postal'] = findValueAfter('Distrito Postal'); - data['Procedencia'] = findValueAfter('Procedencia'); - data['Descripción'] = findValueAfter('Descripción de la Reparación'); - data['Tramitador'] = findValueAfter('Tramitador'); - data['Urgente'] = findValueAfter('Urgente'); - data['Fecha realización'] = findValueAfter('Fecha realización'); - - // Teléfonos (Busca cualquier número de 9 cifras que empiece por 6, 7, 8 o 9) + // Extracción de teléfonos (buscando patrones numéricos en todo el texto) const bodyText = document.body.innerText; const phones = bodyText.match(/[6789]\d{8}/g); - if (phones) data['Teléfono Detectado'] = [...new Set(phones)].join(' / '); + if (phones) data['phone_fixed'] = [...new Set(phones)].join(' / '); - // Limpiar nulos - Object.keys(data).forEach(key => (data[key] === null || data[key] === "") && delete data[key]); - return data; }); @@ -123,9 +119,12 @@ async function runMultiasistencia(ownerId, user, pass) { await saveServiceToDB(ownerId, 'multiasistencia', ref, fullData); } } - } catch (e) { console.error("❌ [Multi]", e.message); } finally { await browser.close(); } + } catch (e) { + console.error("❌ [Multi] Error:", e.message); + } finally { + await browser.close(); + } } - // ... (Mantén el resto del archivo igual) // ========================================== // 🧹 HOMESERVE (MANTENIDO)