Actualizar robot.js

This commit is contained in:
2026-02-19 08:14:21 +00:00
parent c52bb8416b
commit 031479e741

View File

@@ -90,6 +90,15 @@ async function main() {
const gremiosRes = await client.query("SELECT id, name FROM guilds");
const gremiosDB = gremiosRes.rows;
// ACTUALIZACIÓN DE ESTRUCTURA: Aseguramos que exista is_urgent
await client.query(`
DO $$ BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='scraped_services' AND column_name='is_urgent') THEN
ALTER TABLE scraped_services ADD COLUMN is_urgent BOOLEAN DEFAULT FALSE;
END IF;
END $$;
`);
const res = await client.query("SELECT * FROM provider_credentials WHERE status = 'active'");
for (const cred of res.rows) {
let password = Buffer.from(cred.password_hash, 'base64').toString('utf-8');
@@ -113,7 +122,7 @@ async function main() {
}
// ==========================================
// 🏥 MULTIASISTENCIA (CON INTELIGENCIA)
// 🏥 MULTIASISTENCIA (CON INTELIGENCIA Y PAGINACIÓN)
// ==========================================
async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] });
@@ -127,11 +136,49 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
await page.waitForTimeout(4000);
await page.goto('https://web.multiasistencia.com/w3multi/frepasos_new.php?refresh=1');
await page.waitForTimeout(2000);
const expedientes = await page.evaluate(() => {
// --- BUCLE DE PAGINACIÓN INTELIGENTE ---
let todosExpedientes = new Set();
let paginaActual = 1;
while (true) {
console.log(`📄 [Multi] Escaneando página ${paginaActual}...`);
// Extraer expedientes de esta página
const expedientesPagina = await page.evaluate(() => {
const links = Array.from(document.querySelectorAll('a[href*="reparacion="]'));
return Array.from(new Set(links.map(a => a.href.match(/reparacion=(\d+)/)?.[1]).filter(Boolean)));
return links.map(a => a.href.match(/reparacion=(\d+)/)?.[1]).filter(Boolean);
});
expedientesPagina.forEach(ref => todosExpedientes.add(ref));
// Buscar botón de siguiente página y hacer clic si existe
const clickedNext = await page.evaluate(() => {
const links = Array.from(document.querySelectorAll('a'));
const nextBtn = links.find(a => {
const txt = a.innerText.trim();
const title = (a.title || "").toLowerCase();
return txt === '>' || txt.toLowerCase() === 'siguiente' || title.includes('siguient') || a.querySelector('img[alt*="iguient"]');
});
if (nextBtn) {
nextBtn.click();
return true;
}
return false;
});
if (clickedNext) {
await page.waitForTimeout(3000); // Dar tiempo a que cargue la siguiente página
paginaActual++;
} else {
break; // Se acabaron las páginas
}
}
const expedientes = Array.from(todosExpedientes);
console.log(`✅ [Multi] Total expedientes detectados: ${expedientes.length}`);
// --- MEJORA: ARCHIVADO ---
if (expedientes.length > 0) {
await syncAndArchive(ownerId, 'multiasistencia', expedientes);
@@ -310,24 +357,23 @@ async function syncAndArchive(ownerId, provider, currentWebRefs) {
async function saveServiceToDB(ownerId, provider, ref, data) {
console.log(`💾 Guardando/Actualizando ${provider.toUpperCase()} ${ref}...`);
// Utilizamos el operador || de JSONB en Postgres para fusionar los datos.
// EXCLUDED.raw_data contiene lo nuevo del scraper.
// scraped_services.raw_data contiene lo que ya estaba (incluyendo assigned_to, etc).
// Al poner EXCLUDED primero y concatenar lo existente después, preservamos los campos internos
// que el scraper no conoce, y solo actualizamos lo que viene de fuera.
// CORRECCIÓN URGENCIA: Miramos en el JSON y convertimos a booleano real
const isUrgent = (data['Urgente'] && data['Urgente'].toLowerCase() === 'sí') ? true : false;
// Al añadir is_urgent en la consulta, sincronizamos la columna física de la base de datos
await pool.query(`
INSERT INTO scraped_services (owner_id, provider, service_ref, raw_data, status)
VALUES ($1, $2, $3, $4, 'pending')
INSERT INTO scraped_services (owner_id, provider, service_ref, raw_data, status, is_urgent)
VALUES ($1, $2, $3, $4, 'pending', $5)
ON CONFLICT (owner_id, provider, service_ref)
DO UPDATE SET
raw_data = EXCLUDED.raw_data || scraped_services.raw_data,
is_urgent = EXCLUDED.is_urgent,
status = CASE
WHEN scraped_services.status = 'archived' THEN 'archived'
WHEN scraped_services.status = 'imported' THEN 'imported'
ELSE 'pending'
END
`, [ownerId, provider, ref, JSON.stringify(data)]);
`, [ownerId, provider, ref, JSON.stringify(data), isUrgent]);
}
main();