Actualizar robot.js
This commit is contained in:
68
robot.js
68
robot.js
@@ -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();
|
||||
Reference in New Issue
Block a user