This commit is contained in:
2025-08-08 14:35:41 -05:00
parent 18c1df3bd5
commit 0a9583d388
3 changed files with 178 additions and 333 deletions
+94 -41
View File
@@ -79,7 +79,7 @@ async function actualizarCelda(spreadsheetId, range, values) {
});
await new Promise(resolve => setTimeout(resolve, 1000));
} catch (error) {
console.error('Error al actualizar celda:', error.message);
console.error('>> Error al actualizar celda:', error.message);
throw error;
}
}
@@ -90,9 +90,9 @@ async function cerrarChromeDebugging() {
if (process.platform === 'win32') {
exec('wmic process where "commandline like \'%--remote-debugging-port=9224%\'" call terminate', (error) => {
if (error) {
console.log('⚠️ No se encontraron instancias de Chrome debugging');
console.log('>> No se encontraron instancias de Chrome debugging');
} else {
console.log('🔒 Chrome debugging cerrado correctamente');
console.log('>> Chrome debugging cerrado correctamente');
}
resolve();
});
@@ -118,7 +118,7 @@ async function iniciarChrome(url) {
+ `"${url}"`,
(error) => {
if (error) {
console.log('⚠️ Error al iniciar Chrome:', error);
console.log('>> Error al iniciar Chrome:', error);
}
resolve();
}
@@ -133,20 +133,20 @@ async function initBrowser(url) {
await cerrarChromeDebugging();
await new Promise(resolve => setTimeout(resolve, 2000));
console.log('🌐 Iniciando Chrome con debugging...');
console.log('>> Iniciando Chrome con debugging...');
await iniciarChrome(url);
await new Promise(resolve => setTimeout(resolve, 8000)); // Aumentado a 8 segundos
console.log('🔍 Intentando conectar con Chrome...');
console.log('>> Intentando conectar con Chrome...');
const webSocketDebuggerUrl = await getWebSocketUrl();
console.log(' Conexión establecida con Chrome');
console.log('>> Conexión establecida con Chrome');
return await puppeteer.connect({
browserWSEndpoint: webSocketDebuggerUrl,
defaultViewport: null
});
} catch (error) {
console.error(' Error al inicializar el navegador:', error);
console.error('>> Error al inicializar el navegador:', error);
throw error;
}
}
@@ -163,7 +163,7 @@ async function getWebSocketUrl() {
}
throw new Error('URL de WebSocket no encontrada');
} catch (err) {
console.log(`🔄 Reintentando conexión a Chrome... (intentos restantes: ${retries})`);
console.log(`>> Reintentando conexión a Chrome... (intentos restantes: ${retries})`);
await new Promise(resolve => setTimeout(resolve, 2000)); // Aumentado a 4 segundos
retries--;
}
@@ -179,16 +179,26 @@ async function delay(ms) {
// Funciones de procesamiento CORTE
async function procesarCasoCorte(page, element, spreadsheetId, intentos = 1) {
const MAX_INTENTOS = 3;
// Validate that case number has 9 digits
if (element.valor.length !== 9) {
console.log('>> Invalid case number - must be 9 digits');
await actualizarCelda(
spreadsheetId,
`C${element.fila}`,
['Invalid case number - must contain exactly 9 digits']
);
return true;
}
try {
console.log(` Consultando caso Corte... (Intento ${intentos}/${MAX_INTENTOS})`);
console.log(`>> Consultando caso Corte... (Intento ${intentos}/${MAX_INTENTOS})`);
try {
await page.goto(CONFIG.PLATFORMS.CORTE.URL, {
waitUntil: 'domcontentloaded',
timeout: 20000
});
} catch (navigationError) {
console.log(' ⚠️ Error de navegación o campo no encontrado, reintentando...');
console.log('>> Error de navegación o campo no encontrado, reintentando...');
if (intentos < MAX_INTENTOS) {
return await procesarCasoCorte(page, element, spreadsheetId, intentos + 1);
} else {
@@ -201,7 +211,7 @@ async function procesarCasoCorte(page, element, spreadsheetId, intentos = 1) {
await delay(2000);
await page.click('button.btn');
} catch (error) {
console.log(' No se pudo encontrar el botón de caso Corte.');
console.log('>> No se pudo encontrar el botón de caso Corte.');
}
try {
@@ -209,7 +219,7 @@ async function procesarCasoCorte(page, element, spreadsheetId, intentos = 1) {
await delay(2000);
await page.type('.codeInput > input:nth-child(1)', element.valor);
} catch (error) {
console.log(' No se pudo encontrar el campo de entrada de caso Corte.');
console.log('>> No se pudo encontrar el campo de entrada de caso Corte.');
}
await delay(2000);
@@ -218,33 +228,74 @@ async function procesarCasoCorte(page, element, spreadsheetId, intentos = 1) {
await page.waitForSelector('#btn_submit', { visible: true, timeout: 10000 });
await page.click('#btn_submit');
} catch (error) {
console.log(' No se pudo encontrar el botón de consulta Corte.');
console.log('>> No se pudo encontrar el botón de consulta Corte.');
}
await delay(1000);
await delay(3000);
try {
await delay(2000);
const noResultsElement = await page.$x("//div[contains(text(), 'No case found for this A-Number.')]");
if (noResultsElement.length > 0) {
console.log("⚠️ No case found for this A-Number");
await delay(3000);
// Wait for the 'No case found' message
// Check for "No case found" message
const result = await page.evaluate(() => {
const elements = document.querySelectorAll('div');
for (const el of elements) {
if (el.textContent.includes('No case found for this A-Number.') || el.textContent.includes('Case information is unavailable.')) {
return true;
}
}
return false;
}).catch(() => false);
if (result) {
console.log(">> No case found for this A-Number");
await actualizarCelda(
spreadsheetId,
`C${element.fila}`,
['No case found for this A-Number']
);
return true;
} else {
console.log('>> No error found');
try {
const isCaptchaPresent = await page.evaluate(() => {
const captchaFrames = document.querySelectorAll('iframe[src*="hcaptcha"]');
return Array.from(captchaFrames).some(frame => {
return frame !== null && getComputedStyle(frame).display !== 'none';
});
});
if (isCaptchaPresent) {
await delay(5000);
console.log('>> hCaptcha detected');
await actualizarCelda(
spreadsheetId,
`C${element.fila}`,
['Captcha detected - Please try again later']
);
await delay(5000);
return false;
} else {
console.log('>> No captcha detected');
}
} catch (error) {
console.error('>> Error checking for captcha:', error);
}
}
} catch (error) {
console.log('️ Case found, continuing with data extraction...');
console.error('Error during case processing:', error);
// Check for hCaptcha presence
}
try {
// Esperar a que aparezca la tarjeta de información
await page.waitForSelector('.caseInfoCard', { timeout: 8000 });
console.log(" Información encontrada");
console.log(">> Información encontrada");
// Obtener todos los elementos de información
const elements = await page.$$eval('div.caseInfoCard', nodes =>
@@ -253,7 +304,7 @@ async function procesarCasoCorte(page, element, spreadsheetId, intentos = 1) {
// Extraer la información relevante
const [box1, box2, box3, box4] = elements;
console.log(' 📋 Información obtenida:');
console.log('>> Información obtenida:');
console.log(' Box 1:', box1);
console.log(' Box 2:', box2);
console.log(' Box 3:', box3);
@@ -266,18 +317,18 @@ async function procesarCasoCorte(page, element, spreadsheetId, intentos = 1) {
);
} catch (error) {
console.log(' No se pudo encontrar la información de la tarjeta.');
console.log('>> No se pudo encontrar la información de la tarjeta.');
}
return true; // Indica que el proceso fue exitoso
} catch (error) {
console.error(' Error procesando caso CORTE:', error);
console.error('>> Error procesando caso CORTE:', error);
if (intentos < MAX_INTENTOS) {
console.log(` 🔄 Reintentando... (${intentos}/${MAX_INTENTOS})`);
console.log(`>> Reintentando... (${intentos}/${MAX_INTENTOS})`);
return await procesarCasoCorte(page, element, spreadsheetId, intentos + 1);
} else {
console.log(' ⚠️ Se agotaron los intentos o error no recuperable');
console.log('>> Se agotaron los intentos o error no recuperable');
await actualizarCelda(
spreadsheetId,
`C${element.fila}`,
@@ -290,7 +341,7 @@ async function procesarCasoCorte(page, element, spreadsheetId, intentos = 1) {
// Modificar la función procesarArchivo para manejar mejor la reconexión de Chrome
async function procesarArchivo(archivo) {
console.log('\n🔍 Analizando archivo:', archivo.name);
console.log('\n>> Analizando archivo:', archivo.name);
const platform_type = 'corte';
const platform = CONFIG.PLATFORMS[platform_type.toUpperCase()].URL;
@@ -308,6 +359,8 @@ async function procesarArchivo(archivo) {
// Separate rows into three groups based on priority
const filasVaciasC = todasLasFilas.filter(row => !row.columnaC);
const filasConCaptcha = todasLasFilas.filter(row => row.columnaC && row.columnaC.includes('Captcha detected - Please try again later'));
const filasConFechaB = todasLasFilas.filter(row => {
if (!row.columnaC && !row.ultimaConsulta) return false; // Already handled by filasVaciasC or filasVaciasB
if (!row.ultimaConsulta) return false; // Handled by filasVaciasB
@@ -346,14 +399,14 @@ async function procesarArchivo(archivo) {
});
// Combine the arrays in the specified priority order
const filasOrdenadas = [...filasVaciasC, ...filasConFechaB, ...filasVaciasB];
const filasOrdenadas = [...filasVaciasC, ...filasConCaptcha, ...filasConFechaB, ...filasVaciasB];
console.log(filasOrdenadas);
console.log(`📊 Total de filas a procesar: ${filasOrdenadas.length}`);
console.log(`>> Total de filas a procesar: ${filasOrdenadas.length}`);
if (filasOrdenadas.length > 0) {
console.log('🌐 Iniciando navegador...');
console.log('>> Iniciando navegador...');
let browser = await initBrowser(platform);
let page = (await browser.pages())[0];
let fallosConsecutivos = 0;
@@ -362,8 +415,8 @@ async function procesarArchivo(archivo) {
let procesadas = 0;
for (const element of filasOrdenadas) {
procesadas++;
console.log(`\n Procesando fila ${element.fila} (${procesadas}/${filasOrdenadas.length})`);
console.log(`📝 Valor a consultar: ${element.valor}`);
console.log(`\n>> Procesando fila ${element.fila} (${procesadas}/${filasOrdenadas.length})`);
console.log(`>> Valor a consultar: ${element.valor}`);
// Guardar la fecha y hora actual
const fechaHoraActual = new Date().toLocaleString('es-ES', {
@@ -394,7 +447,7 @@ async function procesarArchivo(archivo) {
if (!resultado) {
fallosConsecutivos++;
if (fallosConsecutivos >= MAX_FALLOS_CONSECUTIVOS) {
console.log('🔄 Reiniciando navegador debido a fallos consecutivos...');
console.log('>> Reiniciando navegador debido a fallos consecutivos...');
await browser.close();
await cerrarChromeDebugging();
await delay(2000);
@@ -408,10 +461,10 @@ async function procesarArchivo(archivo) {
}
}
console.log('\n Proceso completado para el archivo:', archivo.name);
console.log('\n>> Proceso completado para el archivo:', archivo.name);
await browser.close();
} else {
console.log(' No hay filas para procesar en este archivo');
console.log('>> No hay filas para procesar en este archivo');
}
}
@@ -420,7 +473,7 @@ async function cerrarTodo() {
if (browser) {
await browser.close(); // Cerrar el navegador si está abierto
}
console.log('🔄 Cerrando Chrome debugging y finalizando...');
console.log('>> Cerrando Chrome debugging y finalizando...');
await cerrarChromeDebugging();
process.exit();
}
@@ -434,19 +487,19 @@ process.on('SIGINT', async () => {
// Función principal
async function procesarArchivos() {
try {
console.log('🚀 Iniciando proceso...');
console.log('>> Iniciando proceso...');
const archivos = await listarArchivosEnCarpeta(CONFIG.DRIVE.FOLDER_ID);
console.log(`📁 Total de archivos encontrados: ${archivos.length}`);
console.log(`>> Total de archivos encontrados: ${archivos.length}`);
let procesados = 0;
for (const archivo of archivos) {
procesados++;
console.log(`\n📌 Procesando archivo ${procesados}/${archivos.length}: ${archivo.name}`);
console.log(`\n>> Procesando archivo ${procesados}/${archivos.length}: ${archivo.name}`);
await procesarArchivo(archivo);
}
console.log('\n🎉 Proceso completado exitosamente!');
console.log('\n>> Proceso completado exitosamente!');
} catch (error) {
console.error(' Error en el proceso:', error);
console.error('>> Error en el proceso:', error);
} finally {
await cerrarTodo(); // Asegúrate de cerrar todo al final
}