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
// ==========================================
const REGLAS_GREMIOS = [
// 1. LOS MANITAS ESPECÍFICOS PRIMERO (Prioridad Alta)
{
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"]
@@ -24,7 +23,6 @@ const REGLAS_GREMIOS = [
nombres_db: ["MANITAS PERSIANAS", "MANITAS PERSIANISTA"],
keywords: ["manitas persian", "cambiar cinta", "cuerda persiana", "recogedor", "atasco persiana", "lamas rotas", "persiana descolgada"]
},
// 2. GREMIOS OFICIALES (Prioridad Media)
{
nombres_db: ["ELECTRICISTA", "ELECTRICIDAD"],
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"],
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"],
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)
// ==========================================
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 page = await context.newPage();
try {
@@ -135,19 +142,22 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
await page.click('input[type="submit"]');
await page.waitForTimeout(4000);
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 ---
console.log("🔄 [Multi] Dando al botón de 'Recargar' para destapar todos los expedientes...");
for (let i = 0; i < 2; i++) {
// --- NUEVO: FORZAR RECARGA DE FORMA SEGURA (SIN HACER CLIC FÍSICO) ---
console.log("🔄 [Multi] Forzando recarga segura mediante script interno...");
try {
if (await page.$('#recargar')) {
await page.click('#recargar');
await page.waitForTimeout(4000); // Esperar a que recargue la página tras el submit
await page.evaluate(() => {
// Llamamos a la función nativa de la web para recargar sin reventar el motor gráfico
if (typeof refrescar === 'function') {
refrescar();
}
});
// Esperamos a que la red deje de cargar datos
await page.waitForLoadState('networkidle');
await page.waitForTimeout(3000);
} catch (e) {
// ignorar si no está
}
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));
// 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 links = Array.from(document.querySelectorAll('a.lnkheader'));
const nextBtn = links.find(a => a.innerText.trim() === 'Página siguiente');
@@ -180,26 +189,24 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
});
if (hasNextPage) {
// Esperamos a que la red se calme tras el submit del formulario
await page.waitForLoadState('networkidle');
await page.waitForTimeout(2000); // Margen extra por si acaso
await page.waitForTimeout(2500);
paginaActual++;
// Medida de seguridad antibucle
if(paginaActual > 15) {
console.log("⚠️ [Multi] Límite de 15 páginas alcanzado por seguridad.");
break;
}
} else {
console.log("🛑 [Multi] No hay más páginas.");
break; // Se acabó la paginación
break;
}
}
const expedientes = Array.from(todosExpedientes);
console.log(`✅ [Multi] Total expedientes detectados: ${expedientes.length}`);
// --- MEJORA: ARCHIVADO ---
// --- ARCHIVADO ---
if (expedientes.length > 0) {
await syncAndArchive(ownerId, 'multiasistencia', expedientes);
}
@@ -252,7 +259,6 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
}
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);
if (idGremioDetectado) {
scrapData['guild_id'] = idGremioDetectado;
@@ -271,7 +277,16 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
// 🧹 HOMESERVE (CON INTELIGENCIA)
// ==========================================
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();
try {
console.log("🌍 [HomeServe] Entrando...");
@@ -297,7 +312,6 @@ async function runHomeserve(ownerId, user, pass, gremiosDB) {
return [...new Set(found)];
});
// --- MEJORA: ARCHIVADO ---
if (refs.length > 0) {
await syncAndArchive(ownerId, 'homeserve', refs);
}
@@ -339,7 +353,6 @@ async function runHomeserve(ownerId, user, pass, gremiosDB) {
});
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);
if (idGremioDetectado) {
scrapData['guild_id'] = idGremioDetectado;