From 2c0a1d02c30018fffa4eb54b0fb1212c5796e49c Mon Sep 17 00:00:00 2001 From: marsalva Date: Thu, 25 Dec 2025 23:12:34 +0000 Subject: [PATCH] =?UTF-8?q?A=C3=B1adir=20index.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..b284bbb --- /dev/null +++ b/index.js @@ -0,0 +1,124 @@ +// robot-multiasistencia/index.js +const { chromium } = require('playwright'); +const admin = require('firebase-admin'); + +if (process.env.FIREBASE_PRIVATE_KEY) { + try { + admin.initializeApp({ + credential: admin.credential.cert({ + projectId: process.env.FIREBASE_PROJECT_ID, + clientEmail: process.env.FIREBASE_CLIENT_EMAIL, + privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'), + }), + }); + console.log("βœ… Firebase inicializado correctamente"); + } catch (err) { + console.error("❌ Error inicializando Firebase:", err); + process.exit(1); + } +} else { + console.error("❌ Falta FIREBASE_PRIVATE_KEY en las variables de entorno"); + process.exit(1); +} + +const db = admin.firestore(); + +const MULTI_USER = process.env.MULTI_USER; +const MULTI_PASS = process.env.MULTI_PASS; + +if (!MULTI_USER || !MULTI_PASS) { + console.error("❌ Faltan MULTI_USER o MULTI_PASS en ENV"); + process.exit(1); +} + +async function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +async function main() { + const browser = await chromium.launch({ + headless: true, + args: ['--no-sandbox', '--disable-setuid-sandbox'], + }); + + const context = await browser.newContext(); + const page = await context.newPage(); + + try { + console.log("🌐 Entrando a Multiasistencia..."); + await page.goto('https://web.multiasistencia.com/', { waitUntil: 'domcontentloaded', timeout: 120000 }); + + console.log("πŸ” Login..."); + await page.waitForSelector('input[type="text"]', { timeout: 60000 }); + await page.fill('input[type="text"]', MULTI_USER); + + await page.waitForSelector('input[type="password"]', { timeout: 60000 }); + await page.fill('input[type="password"]', MULTI_PASS); + + const btn = await page.$('button[type="submit"]'); + if (btn) { + await btn.click(); + } else { + await page.keyboard.press('Enter'); + } + + await page.waitForLoadState('networkidle', { timeout: 120000 }); + console.log("βœ… Logueado"); + await delay(3000); + + // Ir a servicios / pendientes (segΓΊn portal) + const pendientesLink = await page.$('text=Pendientes'); + if (pendientesLink) { + await pendientesLink.click(); + await page.waitForLoadState('networkidle', { timeout: 120000 }); + await delay(2000); + } + + console.log("πŸ“₯ Extrayendo servicios..."); + const servicios = await page.evaluate(() => { + const rows = + Array.from(document.querySelectorAll('table tbody tr')) || + Array.from(document.querySelectorAll('tbody tr')); + + return rows.map(r => { + const cells = Array.from(r.querySelectorAll('td')).map(td => td.innerText.trim()); + return { cells }; + }).filter(x => x && x.cells && x.cells.length > 0); + }); + + console.log(`🧾 Encontrados ${servicios.length} servicios (filas)`); + + const batch = db.batch(); + const col = db.collection('multiasistencia_pendientes'); + + let saved = 0; + for (const item of servicios) { + const ref = col.doc(); + batch.set(ref, { + raw: item, + createdAt: admin.firestore.FieldValue.serverTimestamp(), + source: 'multiasistencia', + }); + saved++; + if (saved % 450 === 0) { + await batch.commit(); + } + } + await batch.commit(); + + console.log(`βœ… Guardados ${saved} registros en Firestore (multiasistencia_pendientes)`); + + } catch (err) { + console.error("❌ Error en robot Multiasistencia:", err); + try { + await page.screenshot({ path: '/tmp/error-multiasistencia.png', fullPage: true }); + console.log("πŸ“Έ Screenshot guardada en /tmp/error-multiasistencia.png"); + } catch (e) {} + process.exitCode = 1; + } finally { + await browser.close(); + console.log("🧹 Browser cerrado"); + } +} + +main(); \ No newline at end of file