Actualizar robot.js

This commit is contained in:
2026-02-13 20:53:27 +00:00
parent 890da83cab
commit bfed3ee8eb

View File

@@ -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,44 +77,40 @@ 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(' / ');
// Limpiar nulos
Object.keys(data).forEach(key => (data[key] === null || data[key] === "") && delete data[key]);
if (phones) data['phone_fixed'] = [...new Set(phones)].join(' / ');
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)