Actualizar robot.js

This commit is contained in:
2026-02-19 08:40:16 +00:00
parent f499dbbd43
commit d206645c4d

View File

@@ -11,7 +11,6 @@ const HEADLESS = true;
// 🧠 MOTOR DE CLASIFICACIÓN DE GREMIOS PRO // 🧠 MOTOR DE CLASIFICACIÓN DE GREMIOS PRO
// ========================================== // ==========================================
const REGLAS_GREMIOS = [ const REGLAS_GREMIOS = [
// 1. LOS MANITAS ESPECÍFICOS PRIMERO (Prioridad Alta)
{ {
nombres_db: ["MANITAS ELECTRICISTA", "MANITAS ELECTRICO", "MANITAS ELECTRICIDAD"], nombres_db: ["MANITAS ELECTRICISTA", "MANITAS ELECTRICO", "MANITAS ELECTRICIDAD"],
keywords: ["manitas electric", "cambiar bombilla", "colgar lampara", "instalar foco", "fluorescente", "casquillo", "lampara del dormitorio", "cambiar enchufe", "embellecedor"] keywords: ["manitas electric", "cambiar bombilla", "colgar lampara", "instalar foco", "fluorescente", "casquillo", "lampara del dormitorio", "cambiar enchufe", "embellecedor"]
@@ -24,7 +23,6 @@ const REGLAS_GREMIOS = [
nombres_db: ["MANITAS PERSIANAS", "MANITAS PERSIANISTA"], nombres_db: ["MANITAS PERSIANAS", "MANITAS PERSIANISTA"],
keywords: ["manitas persian", "cambiar cinta", "cuerda persiana", "recogedor", "atasco persiana", "lamas rotas", "persiana descolgada"] keywords: ["manitas persian", "cambiar cinta", "cuerda persiana", "recogedor", "atasco persiana", "lamas rotas", "persiana descolgada"]
}, },
// 2. GREMIOS OFICIALES (Prioridad Media)
{ {
nombres_db: ["ELECTRICISTA", "ELECTRICIDAD"], nombres_db: ["ELECTRICISTA", "ELECTRICIDAD"],
keywords: ["electric", "cortocircuito", "cuadro electrico", "salto de plomos", "apagon", "diferencial", "icp", "magnetotermico", "chispazo", "sin luz", "cableado", "derivacion"] keywords: ["electric", "cortocircuito", "cuadro electrico", "salto de plomos", "apagon", "diferencial", "icp", "magnetotermico", "chispazo", "sin luz", "cableado", "derivacion"]
@@ -45,7 +43,6 @@ const REGLAS_GREMIOS = [
nombres_db: ["CARPINTERO", "CARPINTERIA", "MADERA"], nombres_db: ["CARPINTERO", "CARPINTERIA", "MADERA"],
keywords: ["carpinter", "puerta de madera", "bisagra", "marco", "rodapie", "tarima", "armario", "cepillar puerta", "cajon", "encimera", "madera hinchada"] keywords: ["carpinter", "puerta de madera", "bisagra", "marco", "rodapie", "tarima", "armario", "cepillar puerta", "cajon", "encimera", "madera hinchada"]
}, },
// 3. EL COMODÍN (Prioridad Baja)
{ {
nombres_db: ["MANITAS GENERAL", "MANITAS", "BRICOLAJE"], nombres_db: ["MANITAS GENERAL", "MANITAS", "BRICOLAJE"],
keywords: ["manitas general", "colgar cuadro", "soporte tv", "estanteria", "montar mueble", "ikea", "cortina", "riel", "estor", "agujero", "taladro", "picaporte", "colgar espejo"] keywords: ["manitas general", "colgar cuadro", "soporte tv", "estanteria", "montar mueble", "ikea", "cortina", "riel", "estor", "agujero", "taladro", "picaporte", "colgar espejo"]
@@ -125,7 +122,17 @@ async function main() {
// 🏥 MULTIASISTENCIA (CON INTELIGENCIA Y PAGINACIÓN REAL) // 🏥 MULTIASISTENCIA (CON INTELIGENCIA Y PAGINACIÓN REAL)
// ========================================== // ==========================================
async function runMultiasistencia(ownerId, user, pass, gremiosDB) { async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] }); // ARGUMENTOS DE SEGURIDAD CONTRA CRASHEOS EN LINUX/DOCKER
const browser = await chromium.launch({
headless: HEADLESS,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage', // Evita que se quede sin memoria compartida (causa del SIGSEGV)
'--disable-gpu'
]
});
const context = await browser.newContext(); const context = await browser.newContext();
const page = await context.newPage(); const page = await context.newPage();
try { try {
@@ -135,19 +142,22 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
await page.click('input[type="submit"]'); await page.click('input[type="submit"]');
await page.waitForTimeout(4000); await page.waitForTimeout(4000);
await page.goto('https://web.multiasistencia.com/w3multi/frepasos_new.php?refresh=1'); await page.goto('https://web.multiasistencia.com/w3multi/frepasos_new.php?refresh=1');
await page.waitForTimeout(2000); await page.waitForTimeout(3000);
// --- NUEVO: FORZAR RECARGA PARA VER TODOS LOS SERVICIOS --- // --- NUEVO: FORZAR RECARGA DE FORMA SEGURA (SIN HACER CLIC FÍSICO) ---
console.log("🔄 [Multi] Dando al botón de 'Recargar' para destapar todos los expedientes..."); console.log("🔄 [Multi] Forzando recarga segura mediante script interno...");
for (let i = 0; i < 2; i++) { try {
try { await page.evaluate(() => {
if (await page.$('#recargar')) { // Llamamos a la función nativa de la web para recargar sin reventar el motor gráfico
await page.click('#recargar'); if (typeof refrescar === 'function') {
await page.waitForTimeout(4000); // Esperar a que recargue la página tras el submit refrescar();
} }
} catch (e) { });
// ignorar si no está // Esperamos a que la red deje de cargar datos
} await page.waitForLoadState('networkidle');
await page.waitForTimeout(3000);
} catch (e) {
console.log("⚠️ [Multi] No se pudo ejecutar la recarga (puede que ya estuvieran cargados).");
} }
// ---------------------------------------------------------- // ----------------------------------------------------------
@@ -167,7 +177,6 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
expedientesPagina.forEach(ref => todosExpedientes.add(ref)); expedientesPagina.forEach(ref => todosExpedientes.add(ref));
// 2. Buscar el botón "Página siguiente" // 2. Buscar el botón "Página siguiente"
// Ejecutamos exactamente la lógica que usa la web (document.filtros.submit())
const hasNextPage = await page.evaluate(() => { const hasNextPage = await page.evaluate(() => {
const links = Array.from(document.querySelectorAll('a.lnkheader')); const links = Array.from(document.querySelectorAll('a.lnkheader'));
const nextBtn = links.find(a => a.innerText.trim() === 'Página siguiente'); const nextBtn = links.find(a => a.innerText.trim() === 'Página siguiente');
@@ -180,26 +189,24 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
}); });
if (hasNextPage) { if (hasNextPage) {
// Esperamos a que la red se calme tras el submit del formulario
await page.waitForLoadState('networkidle'); await page.waitForLoadState('networkidle');
await page.waitForTimeout(2000); // Margen extra por si acaso await page.waitForTimeout(2500);
paginaActual++; paginaActual++;
// Medida de seguridad antibucle
if(paginaActual > 15) { if(paginaActual > 15) {
console.log("⚠️ [Multi] Límite de 15 páginas alcanzado por seguridad."); console.log("⚠️ [Multi] Límite de 15 páginas alcanzado por seguridad.");
break; break;
} }
} else { } else {
console.log("🛑 [Multi] No hay más páginas."); console.log("🛑 [Multi] No hay más páginas.");
break; // Se acabó la paginación break;
} }
} }
const expedientes = Array.from(todosExpedientes); const expedientes = Array.from(todosExpedientes);
console.log(`✅ [Multi] Total expedientes detectados: ${expedientes.length}`); console.log(`✅ [Multi] Total expedientes detectados: ${expedientes.length}`);
// --- MEJORA: ARCHIVADO --- // --- ARCHIVADO ---
if (expedientes.length > 0) { if (expedientes.length > 0) {
await syncAndArchive(ownerId, 'multiasistencia', expedientes); await syncAndArchive(ownerId, 'multiasistencia', expedientes);
} }
@@ -252,7 +259,6 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
} }
if (scrapData && scrapData['Nombre Cliente']) { if (scrapData && scrapData['Nombre Cliente']) {
// 🪄 MAGIA: Clasificamos el gremio basándonos en la descripción leída de la web
const idGremioDetectado = clasificarGremio(scrapData['Descripción'], gremiosDB); const idGremioDetectado = clasificarGremio(scrapData['Descripción'], gremiosDB);
if (idGremioDetectado) { if (idGremioDetectado) {
scrapData['guild_id'] = idGremioDetectado; scrapData['guild_id'] = idGremioDetectado;
@@ -271,7 +277,16 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
// 🧹 HOMESERVE (CON INTELIGENCIA) // 🧹 HOMESERVE (CON INTELIGENCIA)
// ========================================== // ==========================================
async function runHomeserve(ownerId, user, pass, gremiosDB) { async function runHomeserve(ownerId, user, pass, gremiosDB) {
const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] }); // MISMOS ARGUMENTOS DE SEGURIDAD AQUÍ PARA EVITAR CRASHES
const browser = await chromium.launch({
headless: HEADLESS,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-gpu'
]
});
const page = await browser.newPage(); const page = await browser.newPage();
try { try {
console.log("🌍 [HomeServe] Entrando..."); console.log("🌍 [HomeServe] Entrando...");
@@ -297,7 +312,6 @@ async function runHomeserve(ownerId, user, pass, gremiosDB) {
return [...new Set(found)]; return [...new Set(found)];
}); });
// --- MEJORA: ARCHIVADO ---
if (refs.length > 0) { if (refs.length > 0) {
await syncAndArchive(ownerId, 'homeserve', refs); await syncAndArchive(ownerId, 'homeserve', refs);
} }
@@ -339,7 +353,6 @@ async function runHomeserve(ownerId, user, pass, gremiosDB) {
}); });
if (scrapData && scrapData['Nombre Cliente']) { if (scrapData && scrapData['Nombre Cliente']) {
// 🪄 MAGIA: Clasificamos el gremio basándonos en la descripción leída de la web
const idGremioDetectado = clasificarGremio(scrapData['Descripción'], gremiosDB); const idGremioDetectado = clasificarGremio(scrapData['Descripción'], gremiosDB);
if (idGremioDetectado) { if (idGremioDetectado) {
scrapData['guild_id'] = idGremioDetectado; scrapData['guild_id'] = idGremioDetectado;