Actualizar robot.js
This commit is contained in:
72
robot.js
72
robot.js
@@ -90,6 +90,15 @@ async function main() {
|
|||||||
const gremiosRes = await client.query("SELECT id, name FROM guilds");
|
const gremiosRes = await client.query("SELECT id, name FROM guilds");
|
||||||
const gremiosDB = gremiosRes.rows;
|
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'");
|
const res = await client.query("SELECT * FROM provider_credentials WHERE status = 'active'");
|
||||||
for (const cred of res.rows) {
|
for (const cred of res.rows) {
|
||||||
let password = Buffer.from(cred.password_hash, 'base64').toString('utf-8');
|
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) {
|
async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
|
||||||
const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] });
|
const browser = await chromium.launch({ headless: HEADLESS, args: ['--no-sandbox'] });
|
||||||
@@ -127,10 +136,48 @@ async function runMultiasistencia(ownerId, user, pass, gremiosDB) {
|
|||||||
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(2000);
|
||||||
const expedientes = await page.evaluate(() => {
|
|
||||||
const links = Array.from(document.querySelectorAll('a[href*="reparacion="]'));
|
// --- BUCLE DE PAGINACIÓN INTELIGENTE ---
|
||||||
return Array.from(new Set(links.map(a => a.href.match(/reparacion=(\d+)/)?.[1]).filter(Boolean)));
|
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 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 ---
|
// --- MEJORA: ARCHIVADO ---
|
||||||
if (expedientes.length > 0) {
|
if (expedientes.length > 0) {
|
||||||
@@ -310,24 +357,23 @@ async function syncAndArchive(ownerId, provider, currentWebRefs) {
|
|||||||
async function saveServiceToDB(ownerId, provider, ref, data) {
|
async function saveServiceToDB(ownerId, provider, ref, data) {
|
||||||
console.log(`💾 Guardando/Actualizando ${provider.toUpperCase()} ${ref}...`);
|
console.log(`💾 Guardando/Actualizando ${provider.toUpperCase()} ${ref}...`);
|
||||||
|
|
||||||
// Utilizamos el operador || de JSONB en Postgres para fusionar los datos.
|
// CORRECCIÓN URGENCIA: Miramos en el JSON y convertimos a booleano real
|
||||||
// EXCLUDED.raw_data contiene lo nuevo del scraper.
|
const isUrgent = (data['Urgente'] && data['Urgente'].toLowerCase() === 'sí') ? true : false;
|
||||||
// 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.
|
|
||||||
|
|
||||||
|
// Al añadir is_urgent en la consulta, sincronizamos la columna física de la base de datos
|
||||||
await pool.query(`
|
await pool.query(`
|
||||||
INSERT INTO scraped_services (owner_id, provider, service_ref, raw_data, status)
|
INSERT INTO scraped_services (owner_id, provider, service_ref, raw_data, status, is_urgent)
|
||||||
VALUES ($1, $2, $3, $4, 'pending')
|
VALUES ($1, $2, $3, $4, 'pending', $5)
|
||||||
ON CONFLICT (owner_id, provider, service_ref)
|
ON CONFLICT (owner_id, provider, service_ref)
|
||||||
DO UPDATE SET
|
DO UPDATE SET
|
||||||
raw_data = EXCLUDED.raw_data || scraped_services.raw_data,
|
raw_data = EXCLUDED.raw_data || scraped_services.raw_data,
|
||||||
|
is_urgent = EXCLUDED.is_urgent,
|
||||||
status = CASE
|
status = CASE
|
||||||
WHEN scraped_services.status = 'archived' THEN 'archived'
|
WHEN scraped_services.status = 'archived' THEN 'archived'
|
||||||
WHEN scraped_services.status = 'imported' THEN 'imported'
|
WHEN scraped_services.status = 'imported' THEN 'imported'
|
||||||
ELSE 'pending'
|
ELSE 'pending'
|
||||||
END
|
END
|
||||||
`, [ownerId, provider, ref, JSON.stringify(data)]);
|
`, [ownerId, provider, ref, JSON.stringify(data), isUrgent]);
|
||||||
}
|
}
|
||||||
|
|
||||||
main();
|
main();
|
||||||
Reference in New Issue
Block a user