diff --git a/copy-deps.zip b/copy-deps.zip new file mode 100644 index 0000000..d72165a Binary files /dev/null and b/copy-deps.zip differ diff --git a/entry.js b/entry.js index 875386f..db3d88e 100644 --- a/entry.js +++ b/entry.js @@ -616,7 +616,7 @@ async function createNewWindow() { show: false, webPreferences: { nodeIntegration: true, - contextIsolation: false, + // contextIsolation: false, partition: 'nopersist' }, }); @@ -657,433 +657,11 @@ const mainIni = async () => { }; -async function openExternalBrowserForTYD075(webApp) { - console.log('>> Iniciando TYD075 en navegador externo'); - try { - const puppeteer = require('puppeteer'); - const browser = await puppeteer.launch({ - headless: false, - defaultViewport: null, - args: [ - `--app=${webApp.url}`, - '--start-maximized', - '--no-sandbox', - '--disable-setuid-sandbox' - ], - executablePath: process.platform === 'win32' - ? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' - : undefined - }); - const pages = await browser.pages(); - const page = pages[0]; - await new Promise(resolve => setTimeout(resolve, 5000)); - console.log('>> Rellenando credenciales para TYD075'); - - await page.waitForSelector('#username', { timeout: 10000 }); - const usernameField = await page.$('#username'); - if (usernameField) { - await usernameField.click({ clickCount: 3 }); - await usernameField.type(webApp.username, { delay: 5 }); - console.log('>> Campo usuario rellenado'); - } - - await page.waitForSelector('#password', { timeout: 5000 }); - const passwordField = await page.$('#password'); - if (passwordField) { - await passwordField.click({ clickCount: 3 }); - await passwordField.type(webApp.password, { delay: 5 }); - console.log('>> Campo contraseña rellenado'); - } - - await page.waitForSelector('#loginform fieldset button', { timeout: 5000 }); - const loginButton = await page.$('#loginform fieldset button'); - if (loginButton) { - await loginButton.click(); - console.log('>> Click en botón de login realizado'); - - try { - await page.waitForNavigation({ - waitUntil: 'networkidle0', - timeout: 1500 - }); - console.log('>> Navegación después del login completada'); - - await page.evaluate(() => { - document.addEventListener('contextmenu', event => event.preventDefault()); - - document.addEventListener('keydown', (e) => { - if ( - e.key === 'F12' || - (e.ctrlKey && e.shiftKey && e.key === 'I') || - (e.ctrlKey && e.shiftKey && e.key === 'J') || - (e.ctrlKey && e.key === 'U') - ) { - e.preventDefault(); - e.stopPropagation(); - return false; - } - }); - }); - - console.log('>> Medidas de seguridad aplicadas correctamente'); - - } catch (navError) { - console.log('>> No hubo navegación o ya estamos en la página correcta'); - - try { - await page.evaluate(() => { - document.addEventListener('contextmenu', event => event.preventDefault()); - - document.addEventListener('keydown', (e) => { - if ( - e.key === 'F12' || - (e.ctrlKey && e.shiftKey && e.key === 'I') || - (e.ctrlKey && e.shiftKey && e.key === 'J') || - (e.ctrlKey && e.key === 'U') - ) { - e.preventDefault(); - e.stopPropagation(); - return false; - } - }); - - const userField = document.querySelector('#username'); - const passField = document.querySelector('#password'); - const loginBtn = document.querySelector('#loginform fieldset button'); - - if (userField) { - userField.setAttribute('readonly', 'true'); - userField.style.pointerEvents = 'none'; - } - if (passField) { - passField.setAttribute('readonly', 'true'); - passField.style.pointerEvents = 'none'; - } - if (loginBtn) { - loginBtn.style.pointerEvents = 'none'; - } - }); - } catch (evalError) { - console.log('>> Error al aplicar medidas de seguridad:', evalError.message); - } - } - } - - await new Promise(resolve => setTimeout(resolve, 5000)); - - try { - const errorElements = await page.$x('//*[contains(text(), "incorrect") or contains(text(), "error") or contains(text(), "invalid")]'); - if (errorElements.length > 0) { - console.log('>> Error de credenciales detectado'); - dialog.showErrorBox('Error', 'Credenciales incorrectas para TYD075. Por favor, repórtalo al Coordinador'); - await browser.close(); - return false; - } - } catch (e) { - console.log('>> No se detectaron errores de login'); - } - - console.log('>> TYD075 iniciado exitosamente en navegador externo'); - - return true; - - } catch (error) { - console.error('>> Error al abrir TYD075 en navegador externo:', error); - dialog.showErrorBox('Error', `No se pudo abrir TYD075: ${error.message}`); - return false; - } -} - -async function openExternalBrowserForDIM072(webApp) { - console.log('>> Iniciando DIM072 en navegador externo'); - - try { - const puppeteer = require('puppeteer'); - - const browser = await puppeteer.launch({ - headless: false, - defaultViewport: null, - args: [ - `--app=${webApp.url}`, - '--start-maximized', - '--no-sandbox', - '--disable-setuid-sandbox' - ], - executablePath: process.platform === 'win32' - ? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' - : undefined - }); - - const pages = await browser.pages(); - const page = pages[0]; - - await new Promise(resolve => setTimeout(resolve, 1000)); - - console.log('>> Rellenando credenciales para DIM072'); - - await page.waitForSelector('#Usuario', { timeout: 5000 }); - const usernameField = await page.$('#Usuario'); - if (usernameField) { - await usernameField.click({ clickCount: 3 }); - await usernameField.type(webApp.username, { delay: 5 }); - console.log('>> Campo usuario rellenado'); - } - - await page.waitForSelector('#Contrase_a', { timeout: 5000 }); - const passwordField = await page.$('#Contrase_a'); - if (passwordField) { - await passwordField.click({ clickCount: 3 }); - await passwordField.type(webApp.password, { delay: 5 }); - console.log('>> Campo contraseña rellenado'); - } - - await new Promise(resolve => setTimeout(resolve, 250)); - - await page.waitForSelector('button[class="btn btn-lg red"]', { timeout: 5000 }); - const loginButton = await page.$('button[class="btn btn-lg red"]'); - if (loginButton) { - await loginButton.click(); - console.log('>> Click en botón de login realizado'); - - try { - await page.waitForNavigation({ - waitUntil: 'networkidle0', - timeout: 1500 - }); - console.log('>> Navegación después del login completada'); - - await page.evaluate(() => { - document.addEventListener('contextmenu', event => event.preventDefault()); - document.addEventListener('keydown', (e) => { - if ( - e.key === 'F12' || - (e.ctrlKey && e.shiftKey && e.key === 'I') || - (e.ctrlKey && e.shiftKey && e.key === 'J') || - (e.ctrlKey && e.key === 'U') - ) { - e.preventDefault(); - e.stopPropagation(); - return false; - } - }); - }); - - console.log('>> Medidas de seguridad aplicadas correctamente'); - - } catch (navError) { - console.log('>> No hubo navegación o ya estamos en la página correcta'); - - try { - await page.evaluate(() => { - document.addEventListener('contextmenu', event => event.preventDefault()); - - document.addEventListener('keydown', (e) => { - if ( - e.key === 'F12' || - (e.ctrlKey && e.shiftKey && e.key === 'I') || - (e.ctrlKey && e.shiftKey && e.key === 'J') || - (e.ctrlKey && e.key === 'U') - ) { - e.preventDefault(); - e.stopPropagation(); - return false; - } - }); - - const userField = document.querySelector('#Usuario'); - const passField = document.querySelector('#Contrase_a'); - const loginBtn = document.querySelector('button[class="btn btn-lg red"]'); - - if (userField) { - userField.setAttribute('readonly', 'true'); - userField.style.pointerEvents = 'none'; - } - if (passField) { - passField.setAttribute('readonly', 'true'); - passField.style.pointerEvents = 'none'; - } - if (loginBtn) { - loginBtn.style.pointerEvents = 'none'; - } - }); - } catch (evalError) { - console.log('>> Error al aplicar medidas de seguridad:', evalError.message); - } - } - } - - await new Promise(resolve => setTimeout(resolve, 5000)); - - try { - const errorElements = await page.$x('//*[contains(text(), "incorrect") or contains(text(), "error") or contains(text(), "invalid")]'); - if (errorElements.length > 0) { - console.log('>> Error de credenciales detectado'); - dialog.showErrorBox('Error', 'Credenciales incorrectas para DIM072. Por favor, repórtalo al Coordinador'); - await browser.close(); - return false; - } - } catch (e) { - console.log('>> No se detectaron errores de login'); - } - - console.log('>> DIM072 iniciado exitosamente en navegador externo'); - - return true; - - } catch (error) { - console.error('>> Error al abrir DIM072 en navegador externo:', error); - dialog.showErrorBox('Error', `No se pudo abrir DIM072: ${error.message}`); - return false; - } -} - -async function openExternalBrowserForTUN065(webApp) { - console.log('>> Iniciando TUN065 en navegador externo'); - - try { - const puppeteer = require('puppeteer'); - - const browser = await puppeteer.launch({ - headless: false, - defaultViewport: null, - args: [ - `--app=${webApp.url}`, - '--start-maximized', - '--no-sandbox', - '--disable-setuid-sandbox' - ], - executablePath: process.platform === 'win32' - ? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' - : undefined - }); - - const pages = await browser.pages(); - const page = pages[0]; - - await new Promise(resolve => setTimeout(resolve, 1000)); - - console.log('>> Rellenando credenciales para TUN065'); - - await page.waitForSelector('input[name="ctl00$cpC$dcLogin$txtUserId"]', { timeout: 5000 }); - const usernameField = await page.$('input[name="ctl00$cpC$dcLogin$txtUserId"]'); - if (usernameField) { - await usernameField.click({ clickCount: 3 }); - await usernameField.type(webApp.username, { delay: 5 }); - console.log('>> Campo usuario rellenado'); - } - - await page.waitForSelector('input[name="ctl00$cpC$dcLogin$txtPassword"]', { timeout: 5000 }); - const passwordField = await page.$('input[name="ctl00$cpC$dcLogin$txtPassword"]'); - if (passwordField) { - await passwordField.click({ clickCount: 3 }); - await passwordField.type(webApp.password, { delay: 5 }); - console.log('>> Campo contraseña rellenado'); - } - - await new Promise(resolve => setTimeout(resolve, 50)); - - await page.waitForSelector('div[class="button fs-bold text-center"]', { timeout: 5000 }); - const loginButton = await page.$('div[class="button fs-bold text-center"]'); - if (loginButton) { - await loginButton.click(); - console.log('>> Click en botón de login realizado'); - - try { - await page.waitForNavigation({ - waitUntil: 'networkidle0', - timeout: 1000 - }); - console.log('>> Navegación después del login completada'); - - await page.evaluate(() => { - document.addEventListener('contextmenu', event => event.preventDefault()); - document.addEventListener('keydown', (e) => { - if ( - e.key === 'F12' || - (e.ctrlKey && e.shiftKey && e.key === 'I') || - (e.ctrlKey && e.shiftKey && e.key === 'J') || - (e.ctrlKey && e.key === 'U') - ) { - e.preventDefault(); - e.stopPropagation(); - return false; - } - }); - }); - - console.log('>> Medidas de seguridad aplicadas correctamente'); - - } catch (navError) { - console.log('>> No hubo navegación o ya estamos en la página correcta'); - - try { - await page.evaluate(() => { - document.addEventListener('contextmenu', event => event.preventDefault()); - - document.addEventListener('keydown', (e) => { - if ( - e.key === 'F12' || - (e.ctrlKey && e.shiftKey && e.key === 'I') || - (e.ctrlKey && e.shiftKey && e.key === 'J') || - (e.ctrlKey && e.key === 'U') - ) { - e.preventDefault(); - e.stopPropagation(); - return false; - } - }); - - const userField = document.querySelector('input[name="ctl00$cpC$dcLogin$txtUserId"]'); - const passField = document.querySelector('input[name="ctl00$cpC$dcLogin$txtPassword"]'); - const loginBtn = document.querySelector('div[class="button fs-bold text-center"]'); - - if (userField) { - userField.setAttribute('readonly', 'true'); - userField.style.pointerEvents = 'none'; - } - if (passField) { - passField.setAttribute('readonly', 'true'); - passField.style.pointerEvents = 'none'; - } - if (loginBtn) { - loginBtn.style.pointerEvents = 'none'; - } - }); - } catch (evalError) { - console.log('>> Error al aplicar medidas de seguridad:', evalError.message); - } - } - } - - await new Promise(resolve => setTimeout(resolve, 5000)); - - try { - const errorElements = await page.$x('//*[contains(text(), "incorrect") or contains(text(), "error") or contains(text(), "invalid")]'); - if (errorElements.length > 0) { - console.log('>> Error de credenciales detectado'); - dialog.showErrorBox('Error', 'Credenciales incorrectas para TUN065. Por favor, repórtalo al Coordinador'); - await browser.close(); - return false; - } - } catch (e) { - console.log('>> No se detectaron errores de login'); - } - - console.log('>> TUN065 iniciado exitosamente en navegador externo'); - - return true; - - } catch (error) { - console.error('>> Error al abrir TUN065 en navegador externo:', error); - dialog.showErrorBox('Error', `No se pudo abrir IDV03: ${error.message}`); - return false; - } -} async function openExternalBrowserForPOL(webApp) { console.log('>> Iniciando POLIEDRO en navegador externo'); @@ -1118,10 +696,10 @@ async function openExternalBrowserForPOL(webApp) { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { console.log(`>> Intento ${attempt} para llenar ${fieldName}`); - + await page.waitForSelector(selector, { timeout: 10000 }); const field = await page.$(selector); - + if (!field) { throw new Error(`Campo ${fieldName} no encontrado`); } @@ -1141,7 +719,7 @@ async function openExternalBrowserForPOL(webApp) { // Verificar que el valor se escribió correctamente await new Promise(resolve => setTimeout(resolve, 500)); const currentValue = await page.$eval(selector, el => el.value); - + if (currentValue === value) { console.log(`>> ${fieldName} rellenado correctamente: `); return true; @@ -1186,7 +764,7 @@ async function openExternalBrowserForPOL(webApp) { await page.waitForSelector('input[name="ctl00$ContentPlaceHolder1$btnIngresarUsuarioContraseña"]', { timeout: 5000 }); const loginButton = await page.$('input[name="ctl00$ContentPlaceHolder1$btnIngresarUsuarioContraseña"]'); - + if (loginButton) { const isDisabled = await page.$eval('input[name="ctl00$ContentPlaceHolder1$btnIngresarUsuarioContraseña"]', el => el.disabled); if (isDisabled) { @@ -1209,7 +787,7 @@ async function openExternalBrowserForPOL(webApp) { for (let element of elements) { const text = element.textContent.toLowerCase(); if (text.includes('incorrect') || text.includes('error') || text.includes('invalid') || - text.includes('incorrecto') || text.includes('inválido') || + text.includes('incorrecto') || text.includes('inválido') || (text.includes('usuario') && text.includes('contraseña'))) { return true; } @@ -1282,7 +860,7 @@ async function openExternalBrowserForPOL(webApp) { if (!authCompleted && attempts >= maxAttempts) { console.log('>> Tiempo de espera agotado para autenticación OTP'); - dialog.showWarningBox('Tiempo Agotado', + dialog.showWarningBox('Tiempo Agotado', 'El tiempo de espera para la autenticación OTP ha expirado. La sesión seguirá activa, pero puede que necesite completar manualmente el proceso.'); } } @@ -1447,57 +1025,31 @@ async function rpa(data_code) { xpath_password = webApp.xpath_pass; xpath_button = webApp.btn_login; - if (data_code === 'TYD075') { - console.log('>> Detectado TYD075 - Usando navegador externo'); - const success = await openExternalBrowserForTYD075(webApp); - if (!success) { - console.log('>> Error al procesar TYD075'); - } - return; - } + // if (data_code === 'POL911' || data_code === 'POL912' || data_code === 'POL913' || data_code === 'POL914' || data_code === 'POL915' || data_code === 'POD911') { + // console.log('poliedro test'); + // await page.evaluateOnNewDocument(() => { + // const script = document.createElement('script'); + // script.src = 'https://code.jquery.com/jquery-3.6.0.min.js'; + // script.type = 'text/javascript'; + // document.head.appendChild(script); + // }) - if (data_code === 'DIM072') { - console.log('>> Detectado DIM072 - Usando navegador externo'); - const success = await openExternalBrowserForDIM072(webApp); - if (!success) { - console.log('>> Error al procesar DIM072'); - } - return; - } - if (data_code === 'TUN065') { - console.log('>> Detectado TUN065 - Usando navegador externo'); - const success = await openExternalBrowserForTUN065(webApp); - if (!success) { - console.log('>> Error al procesar TUN065'); - } - return; - } - - if (data_code === 'POL911' || data_code === 'POL912' || data_code === 'POL913' || data_code === 'POL914' || data_code === 'POL915' || data_code === 'POD911') { - console.log('>> Detectado POLIEDRO - Usando navegador externo'); - const success = await openExternalBrowserForPOL(webApp); - if (!success) { - console.log('>> Error al procesar POLIEDRO'); - } - return; - } - - if (!windowNew || windowNew.isDestroyed()) { - windowNew = new BrowserWindow({ - args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'], - ignoreHTTPSErrors: true, - width: 1200, - height: 650, - show: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - partition: 'nopersist' - }, - }); - } + // } + windowNew = new BrowserWindow({ + args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'], + ignoreHTTPSErrors: true, + width: 1200, + height: 650, + show: false, + webPreferences: { + nodeIntegration: true, + // contextIsolation: false, + partition: 'nopersist', + }, + }); + windowNew.setMenu(null); windowNew.on('closed', function () { windowNew = null; console.log('>> Ventana cerrada'); @@ -1509,6 +1061,8 @@ async function rpa(data_code) { webApp.url = 'https://poliedro.comcel.com.co/LoginPoliedro/Login.aspx'; } windowNew.loadURL(webApp.url); + + windowNew.show(); windowNew.maximize(); windowNew.setIgnoreMouseEvents(false); @@ -1684,78 +1238,45 @@ async function rpa(data_code) { // var page; var pageUrl; - // for (const pages_sel of pages) { - // const pageUrl = await pages_sel.url(); - // // console.log('la obtenida: ' + pageUrl + '_____' + 'la real: ' + url_mod); - // if (pageUrl == 'http://100.126.20.149:8080/sara/login') { - // url_mod = 'http://100.126.20.149:8080/sara/login'; - // } - // if (pageUrl == 'http://dime.claro.com.co/Portal/Produccion/Sesion/Inicio/Ingresar?ReturnUrl=%2FPortal%2FProduccion%2FFidelizacion%2FRetencion%2FRegistrarSolicitud%3Fdato%3D1007227477%26Cuenta%3D89715445%26Ticket%3D1%26Internet%3D1%26TV%3D1%26Telefonia%3D0') { - // url_mod = 'http://dime.claro.com.co/Portal/Produccion/Sesion/Inicio/Ingresar?ReturnUrl=%2FPortal%2FProduccion%2FFidelizacion%2FRetencion%2FRegistrarSolicitud%3Fdato%3D1007227477%26Cuenta%3D89715445%26Ticket%3D1%26Internet%3D1%26TV%3D1%26Telefonia%3D0'; - // } - // if (pageUrl === url_mod) { - // console.log(`Ok pagina`); - // page = pages_sel; - // break; // Detén el bucle cuando encuentras la coincidencia - // } - // } - if (page) { console.log(`Nombre de la pagina: ${await page.title()}`); - if (data_code == 'ASW049') { - console.log('avaya web'); - await new Promise(resolve => setTimeout(resolve, 5000)); - console.log('okan avaya'); - } + console.log('Debug - username:', username); + console.log('Debug - password:', password); + console.log('Debug - webApp.username:', webApp.username); + console.log('Debug - webApp.password:', webApp.password); + console.log('Debug - xpath_username:', xpath_username); + console.log('Debug - xpath_password:', xpath_password); - // await page.waitForLoad(); - if (xpath_username != 'na') { - // if (data_code == 'POL911' || data_code == 'POL912' || data_code == 'POL913' || data_code == 'POL914' || data_code == 'POL915' || data_code == 'POD911') { - // await page.waitForXPath('//input[@id="ctl00_ContentPlaceHolder1_BtnRegresarMensaje"]'); - // const backBtn = await page.$x('//input[@id="ctl00_ContentPlaceHolder1_BtnRegresarMensaje"]'); - // await backBtn[0].click(); - // } - if (!loginCodes.includes(data_code)) { - - if (data_code == 'CLU100') { - const elementHandleClu = await page.$('.sign-in-uclaro'); - if (elementHandleClu) { - await elementHandleClu.click(); - } - } - //empieza a llenar el campo de usuario - await page.waitForXPath(xpath_username); - const elementHandleUser = await page.$x(xpath_username); - await elementHandleUser[0].type('', { delay: 100 }); - await elementHandleUser[0].type(username); - console.log('>> Diligencio campo usuario'); - - if (data_code == 'ABS099') { - await page.keyboard.press("Enter"); - } else { - await page.keyboard.press("Tab"); - } - - if (data_code == 'AGE036') { - await page.waitForTimeout(4000); - - } else { - await page.waitForTimeout(1000); - } - - await page.waitForXPath(xpath_password); - const elementHandlePass = await page.$x(xpath_password); - await elementHandlePass[0].type('', { delay: 100 }); - await elementHandlePass[0].type(password); - console.log('>> Diligencio campo password'); - - await page.waitForTimeout(1000); - - // Manejo específico para MAP039 - if (data_code === 'MAP039') { + + const performLogin = async (page, appCode, username, password, webApp, xpath_username, xpath_password, xpath_button) => { + if (appCode === 'TYD075') { + console.log('>> Detectado TYD075 - Usando Puppeteer interno'); + await page.waitForSelector('#username', { timeout: 15000 }); + await page.type('#username', webApp.username, { delay: 5 }); + await page.waitForSelector('#password', { timeout: 15000 }); + await page.type('#password', webApp.password, { delay: 5 }); + await page.click('button[type="submit"]'); + } else if (appCode === 'DIM072') { + console.log('>> Detectado DIM072 - Usando Puppeteer interno'); + await page.waitForSelector('#Usuario', { timeout: 15000 }); + await page.type('#Usuario', webApp.username, { delay: 5 }); + await page.waitForSelector('#Contrase_a', { timeout: 15000 }); + await page.type('#Contrase_a', webApp.password, { delay: 5 }); + await page.click('button#btiniciar'); + } else if (appCode === 'TUN065') { + console.log('>> Detectado TUN065 - Usando Puppeteer interno'); + await page.waitForSelector('input[name="ctl00$cpC$dcLogin$txtUserId"]', { timeout: 15000 }); + await page.type('input[name="ctl00$cpC$dcLogin$txtUserId"]', webApp.username, { delay: 5 }); + await page.waitForSelector('input[name="ctl00$cpC$dcLogin$txtPassword"]', { timeout: 15000 }); + await page.type('input[name="ctl00$cpC$dcLogin$txtPassword"]', webApp.password, { delay: 5 }); + await page.click('div[class="button fs-bold text-center"]'); + } else if (appCode === 'ASW049') { + console.log('avaya web'); + await new Promise(resolve => setTimeout(resolve, 5000)); + console.log('okan avaya'); + } else if (appCode === 'MAP039') { console.log('>> Procesando botón de login para MAP039...'); - try { console.log('>> Intentando submit directo del formulario...'); const formSubmitted = await page.evaluate(() => { @@ -1766,7 +1287,6 @@ async function rpa(data_code) { } return false; }); - if (formSubmitted) { console.log('>> Formulario enviado con submit()'); } else { @@ -1783,10 +1303,8 @@ async function rpa(data_code) { }); console.log('>> Evento submit disparado'); } - } catch (error) { console.log('>> Error con submit:', error.message); - try { console.log('>> Intentando click forzado en div Entrar...'); await page.evaluate(() => { @@ -1803,45 +1321,86 @@ async function rpa(data_code) { console.log('>> Click forzado realizado'); } catch (clickError) { console.log('>> Click forzado falló:', clickError.message); - console.log('>> Intentando Enter en campo contraseña...'); await page.focus('#contra'); await page.keyboard.press('Enter'); } } - await page.waitForTimeout(2000); + } else if (xpath_username !== 'na') { + if (!loginCodes.includes(appCode)) { + if (appCode === 'CLU100') { + const elementHandleClu = await page.$('.sign-in-uclaro'); + if (elementHandleClu) { + await elementHandleClu.click(); + } + } + await page.waitForXPath(xpath_username); + const elementHandleUser = await page.$x(xpath_username); + await elementHandleUser[0].type('', { delay: 100 }); + await elementHandleUser[0].type(username); + console.log('>> Diligencio campo usuario'); - } else { - const xpathMap = { - 'DIM072': '//button[contains(@id, "btiniciar")]', - 'CLU100': '//button[contains(@class, "ingresarBoton")]', - 'CMC093': xpath_button, - 'MCA030': '//input[contains(@id, "login-button")]' - }; + if (appCode === 'ABS099') { + await page.keyboard.press("Enter"); + } else { + await page.keyboard.press("Tab"); + } - const xpath = xpathMap[data_code] || null; + if (appCode === 'AGE036') { + await page.waitForTimeout(4000); + } else { + await page.waitForTimeout(1000); + } - if (xpath) { - try { - await page.waitForXPath(xpath, { timeout: 5000 }); - const elementHandle = await page.$x(xpath); - if (elementHandle && elementHandle.length > 0) { - await elementHandle[0].click(); - console.log('>> Se dio click en boton'); - } else { - console.log('>> No encontro boton'); + await page.waitForXPath(xpath_password); + const elementHandlePass = await page.$x(xpath_password); + await elementHandlePass[0].type('', { delay: 100 }); + await elementHandlePass[0].type(password); + console.log('>> Diligencio campo password'); + + await page.waitForTimeout(1000); + + const xpathMap = { + 'DIM072': '//button[contains(@id, "btiniciar")]', + 'CLU100': '//button[contains(@class, "ingresarBoton")]', + 'CMC093': xpath_button, + 'MCA030': '//input[contains(@id, "login-button")]' + }; + + const xpath = xpathMap[appCode] || null; + + if (xpath) { + try { + await page.waitForXPath(xpath, { timeout: 5000 }); + const elementHandle = await page.$x(xpath); + if (elementHandle && elementHandle.length > 0) { + await elementHandle[0].click(); + console.log('>> Se dio click en boton'); + } else { + console.log('>> No encontro boton'); + await page.keyboard.press('Enter'); + } + } catch (error) { + console.log('>> Error esperando botón, usando Enter'); await page.keyboard.press('Enter'); } - } catch (error) { - console.log('>> Error esperando botón, usando Enter'); + } else { await page.keyboard.press('Enter'); } - } else { - await page.keyboard.press('Enter'); } } - } + }; + + console.log(`DEBUG: username = ${username}`); + console.log(`DEBUG: password = ${password}`); + console.log(`DEBUG: webApp.username = ${webApp.username}`); + console.log(`DEBUG: webApp.password = ${webApp.password}`); + await performLogin(page, data_code, username, password, webApp, xpath_username, xpath_password, xpath_button); + // await page.waitForNavigation({ waitUntil: 'networkidle0', timeout: 60000 }); + + console.log('>> Cargo la pagina'); + console.log('>> Formulario enviado'); // await page.waitForTimeout(70000); @@ -1854,57 +1413,57 @@ async function rpa(data_code) { console.log('>> Procesando aplicativo Poliedro'); try { console.log('>> Esperando campo de token...'); - + try { await page.waitForSelector('td[colspan="2"][class="auto-style1"]', { visible: true, timeout: 10000 }); - + const element = await page.$('td[colspan="2"][class="auto-style1"]'); const textContent = await page.evaluate(el => el.textContent, element); console.log(`>> Contenido encontrado: ${textContent.trim()}`); - + if (textContent.includes('token') && textContent.includes('SMS')) { console.log('>> Campo de token detectado - Habilitando interacción completa'); - + windowNew.setIgnoreMouseEvents(false); - + windowNew.show(); windowNew.focus(); windowNew.setAlwaysOnTop(true); setTimeout(() => { windowNew.setAlwaysOnTop(false); }, 1000); - + const notification = new Notification({ title: 'Acción requerida - Poliedro', body: 'Ingresa el código de verificación. La ventana ya está habilitada para uso.', icon: 'logo-claro.ico' }); notification.show(); - + console.log('>> Interacción habilitada permanentemente para Poliedro'); - return; - + return; + } else { throw new Error('Contenido no coincide con mensaje de token'); } - + } catch (tokenError) { console.log('>> No se encontró mensaje de token, verificando login exitoso...'); await page.waitForTimeout(3000); - + windowNew.setIgnoreMouseEvents(false); windowNew.show(); windowNew.focus(); - + console.log('>> Interacción habilitada para uso normal de Poliedro'); } - + } catch (e) { console.log('>> Error en Poliedro, habilitando interacción manual: ' + e); - + windowNew.setIgnoreMouseEvents(false); windowNew.show(); windowNew.focus(); @@ -1912,7 +1471,7 @@ async function rpa(data_code) { setTimeout(() => { windowNew.setAlwaysOnTop(false); }, 1000); - + const notification = new Notification({ title: 'Atención - Poliedro', body: 'Complete el proceso manualmente. La ventana está habilitada.', @@ -1920,7 +1479,7 @@ async function rpa(data_code) { }); notification.show(); } - + return; } else { const checkAndClose = async (message, text, xpath) => { @@ -1936,11 +1495,10 @@ async function rpa(data_code) { if (elementHandles && elementHandles.length > 0) { if (data_code == 'VIM059' && elementHandles.length <= 2) { // No hace nada para VIM059 con 2 elementos o menos - } else if (data_code == 'DIM072' && elementHandles.length <= 1) { - // No hace nada para DIM072 con 1 elemento o menos - } else if (data_code == '') { - // No hacer nada para TUN065 - permitir que continúe normalmente - console.log(`>> IDV033: Se encontró texto "${text}" pero se permite continuar`); + } else if (data_code == 'DIM072') { + // DIM072 will now follow general error handling. + } else if (data_code == 'TUN065') { + // TUN065 will now follow general error handling. } else if (data_code == 'ASC069') { // No hace nada para ASC069 console.log(`>> ASC069: Se encontró texto "${text}" pero se permite continuar`); @@ -1964,7 +1522,7 @@ async function rpa(data_code) { await checkAndClose('Could not log', 'could not log', false) || await checkAndClose('Form', xpath_username, true); } - } + windowNew.setIgnoreMouseEvents(false); // windowNew.setOpacity(1); // windowNew.maximize(); diff --git a/entry2.js b/entry2.js new file mode 100644 index 0000000..35829c7 --- /dev/null +++ b/entry2.js @@ -0,0 +1,2101 @@ +const { app, BrowserWindow, Menu, dialog, ipcMain, desktopCapturer, Notification, ipcRenderer, protocol, session } = require('electron'); +const { autoUpdater } = require('electron-updater'); +const os = require('os'); +const pie = require("puppeteer-in-electron"); +const puppeteer = require("puppeteer-core"); +const path = require('path'); +const https = require('https'); +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; +const axios = require('axios'); +const $ = require('jquery'); +const fs = require('fs'); +const argv = require('yargs').argv; +const { exec } = require('child_process'); +const { rr } = require('./rr'); +const { HttpsProxyAgent } = require('https-proxy-agent'); +const { spawn } = require('child_process'); + + +app.disableHardwareAcceleration(); + +const logsDir = 'C:/RpaClaro'; +const app_version = app.getVersion(); +let url_platform = ''; +let username = ''; +let password = ''; +let xpath_username = ''; +let xpath_password = ''; +let xpath_button = ''; +let data_apps; +let okanToken; +let splashWindow; +let mainWindow; +let windowNew; +let browser; +let page; +let data_apps_user = []; +let appsOkan; +let appHtml; +let userDataApps; +let from_okan = false; + + +const CONFIG = { + ENDPOINT_URL_APPS: 'https://rpa.okan.tools/users/apps/byUserAdOrDocument', + ENDPOINT_URL_APP: 'https://rpa.okan.tools/app', + ENDPOINT_OKAN_TOKEN: 'https://io.okan.tools/api/auth/electron', + TOKEN_OKAN_USER: 'HrZTvmBNyQaM6jPI7sHo5ywN35ht/cplIBFeE+4Ufx8=', + PROXY: 'http://proxyop.bop.local:8080', + ENDPOINT_GET_PROFILE: 'https://io.okan.tools/api/auth/users/electron', + ENDPOINT_GET_APPS: 'https://adm.okan.tools/wp-json/okanapiwp/v1/aplicativos/' +}; + +app.disableHardwareAcceleration(); + +pie.initialize(app); + +const setupLogging = async () => { + console.log(">> Iniciando configuracion de logs.."); + if (!fs.existsSync(logsDir)) { + fs.mkdirSync(logsDir, { recursive: true }); + } + const logFilePath = path.join(logsDir, 'console-log.txt'); + + // Limpia el archivo de logs al inicio + await fs.promises.writeFile(logFilePath, '', 'utf-8'); + // Helper para escribir logs en el archivo + const writeLogToFile = (message) => { + const now = new Date(); + const timestamp = now.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: true + }).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2'); + fs.appendFileSync(logFilePath, `[${timestamp}] ${message}\n`); + }; + // Sobrescribe métodos de console + ['log', 'info', 'warn', 'error'].forEach((method) => { + const originalMethod = console[method]; + console[method] = (...args) => { + const message = args + .map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg)) + .join(' '); + writeLogToFile(message); + originalMethod.apply(console, args); // Mantén la salida en la consola + }; + }); +}; + +// Función para manejar cookies en ASC069 +async function handleCookiesASC069(page, data_code) { + if (data_code === 'ASC069') { + console.log('>> Verificando popup de cookies para ASC069...'); + + try { + // Lista de selectores comunes para popups de cookies + const cookieSelectors = [ + // Selectores comunes para botones de aceptar cookies + 'button[id*="accept"]', + 'button[class*="accept"]', + 'button[id*="cookie"]', + 'button[class*="cookie"]', + '[data-cy*="accept"]', + '[data-testid*="accept"]', + // Selectores por texto + '//button[contains(text(), "Aceptar")]', + '//button[contains(text(), "Accept")]', + '//button[contains(text(), "Acepto")]', + '//button[contains(text(), "OK")]', + '//button[contains(text(), "Continuar")]', + '//a[contains(text(), "Aceptar")]', + '//a[contains(text(), "Accept")]', + // Selectores específicos de ASCard si los conoces + '#cookie-accept', + '.cookie-accept', + '[data-cookie="accept"]' + ]; + + let cookieHandled = false; + + // Intentar con selectores CSS primero + for (const selector of cookieSelectors.filter(s => !s.startsWith('//'))) { + try { + await page.waitForSelector(selector, { timeout: 2000 }); + const element = await page.$(selector); + if (element) { + await element.click(); + console.log(`>> Cookies aceptadas automáticamente usando selector: ${selector}`); + cookieHandled = true; + break; + } + } catch (e) { + // Continuar con el siguiente selector + } + } + + // Si no funcionó con CSS, intentar con XPath + if (!cookieHandled) { + for (const xpath of cookieSelectors.filter(s => s.startsWith('//'))) { + try { + await page.waitForXPath(xpath, { timeout: 2000 }); + const elements = await page.$x(xpath); + if (elements && elements.length > 0) { + await elements[0].click(); + console.log(`>> Cookies aceptadas automáticamente usando XPath: ${xpath}`); + cookieHandled = true; + break; + } + } catch (e) { + // Continuar con el siguiente XPath + } + } + } + + if (cookieHandled) { + // Esperar un momento para que se procese la aceptación + await page.waitForTimeout(2000); + console.log('>> Popup de cookies manejado correctamente'); + return true; + } else { + console.log('>> No se detectó popup de cookies o no se pudo manejar automáticamente'); + return false; + } + + } catch (error) { + console.log('>> Error al manejar cookies:', error.message); + return false; + } + } + return true; // Para otros códigos, continuar normalmente +} + + +async function getOkanToken() { + try { + const agent = new HttpsProxyAgent(CONFIG.PROXY); + const responseOkan = await axios.post(CONFIG.ENDPOINT_OKAN_TOKEN, { user: process.env.USUARIO }, { + headers: { 'Authorization': CONFIG.TOKEN_OKAN_USER }, + httpsAgent: agent + }); + if (responseOkan.data.cod == '0') { + console.log('>> Token de Okan obtenido.'); + return responseOkan.data.data; + } else { + console.log('>> Error al obtener el token de Okan.'); + return null; + } + } catch (error) { + console.log('>> Error en la petición del token de Okan:', error); + await dialog.showMessageBox({ + type: 'error', + defaultId: 0, + title: 'Error de acceso', + message: 'Error al comunicarse con Okan', + }); + app.quit(); + return null; + } +} + +const processArguments = async () => { + console.log(argv); + process.env.MODE = 'prod'; + let url_okan = argv['_']; + let code_okan_str = url_okan.toString(); + + console.log(code_okan_str); + + // Handle OKAN code from URL or direct argument + if (code_okan_str != '' && !argv.dev) { + console.log('sika desde okan'); + let code_okan = code_okan_str.split('&')[0].replace('rpaclaro:///?code=', ''); + let user_okan = code_okan_str.split('&')[1].replace('user=', ''); + process.env.OKAN = code_okan; + process.env.USUARIO = user_okan; + from_okan = true; + } else if (code_okan_str == '' && argv['$0'] && argv['$0'].includes('RpaClaro.exe')) { + console.log('sika desde exe'); + await dialog.showMessageBox({ + type: 'error', + defaultId: 0, + title: 'Error de acceso', + message: 'Debes abrir RpaClaro desde Okan', + }); + app.quit(); + return null; + } else { + console.log('sika desde cli'); + process.env.OKAN = argv.code; + process.env.USUARIO = argv.user; + } + + // Set environment mode + if (argv.dev) { + process.env.MODE = 'dev'; + } else { + process.env.MODE = 'prod'; + } + + console.log('>> Iniciando RpaClaro..'); + console.log('_____________________________'); + console.log('RPA CLARO'); + console.log('Usuario: ' + process.env.USUARIO); + console.log('Version: ' + app_version); + console.log('Modo: ' + process.env.MODE); + console.log('_____________________________'); +}; + +const setupProtocolClient = async () => { + // Get the path to the packaged executable + const exePath = process.env.PORTABLE_EXECUTABLE_FILE || app.getPath('exe'); + + try { + // For development environment + if (process.defaultApp) { + if (process.argv.length >= 2) { + app.setAsDefaultProtocolClient('RpaClaro', process.execPath, [path.resolve(process.argv[1])]); + } + } else { + // For packaged executable + // Remove any existing protocol registration first + app.removeAsDefaultProtocolClient('RpaClaro'); + + // Register the protocol with the packaged exe path + const success = app.setAsDefaultProtocolClient('RpaClaro', exePath); + + if (!success) { + throw new Error('Failed to register protocol handler'); + } + } + + console.log('>> Protocol configuration established successfully'); + console.log('>> Executable path:', exePath); + } catch (error) { + console.error('>> Error setting up protocol client:', error); + // Attempt to register without arguments as fallback + app.setAsDefaultProtocolClient('RpaClaro'); + } +} + +const copyFilesFromRR = () => { + const origen = path.join(__dirname, 'rr'); + fs.readdir(origen, (err, archivos) => { + if (err) { + console.error('Error al leer el directorio de origen:', err); + return; + } + archivos.forEach((archivo) => { + const archivoOrigen = path.join(origen, archivo); + const archivoDestino = path.join(logsDir, archivo); + + // Copia el archivo al directorio de destino + fs.copyFile(archivoOrigen, archivoDestino, (err) => { + if (err) { + console.error(`Error al copiar ${archivo}:`, err); + } else { + // console.log(`${archivo} copiado correctamente.`); + } + }); + }); + console.log('>> Archivos copiados correctamente.'); + }); +}; + +async function getOkanToken() { + try { + const agent = new HttpsProxyAgent(CONFIG.PROXY); + + const responseOkan = await axios.post(CONFIG.ENDPOINT_OKAN_TOKEN, { user: '45957768' }, { + headers: { 'Authorization': CONFIG.TOKEN_OKAN_USER }, + httpsAgent: agent + }); + if (responseOkan.data.cod == '0') { + console.log('>> Token de Okan obtenido.'); + return responseOkan.data.data; + } else { + console.log('>> Error al obtener el token de Okan.'); + return null; + } + } catch (error) { + console.log('>> Error en la petición del token de Okan:', error); + await dialog.showMessageBox({ + type: 'error', + defaultId: 0, + title: 'Error de acceso', + message: 'Error al comunicarse con Okan', + }); + app.quit(); + return null; + } +} + +async function getProfile(token) { + const token_okan = 'Bearer ' + token; + + try { + const agent_two = new HttpsProxyAgent(CONFIG.PROXY); + + const responseGetProfile = await axios.get(CONFIG.ENDPOINT_GET_PROFILE, { + headers: { 'Authorization': token_okan }, + httpsAgent: agent_two + }); + if (responseGetProfile.data.cod == '0') { + documento = responseGetProfile.data.data.document_number; + profile = responseGetProfile.data.data.profile.id; + console.log('>> Perfil: ' + profile); + return profile; + } + } catch (e) { + console.log('>> No se pudo obtener el perfil: ' + e); + } +} + +async function getApps(data_apps_user) { + try { + const agent_three = new HttpsProxyAgent(CONFIG.PROXY); + + // First attempt with proxy + try { + const urlAplicativos = CONFIG.ENDPOINT_GET_APPS + `${documento}/${profile}`; + const responseAplicativos = await axios.get(urlAplicativos, { + headers: { + "Accept": "*/*", + "Content-Type": "application/json" + }, + httpsAgent: agent_three, + timeout: 30000 + }); + + if (responseAplicativos.data['cod'] == '0') { + return processAppsResponse(responseAplicativos.data, data_apps_user); + } + } catch (proxyError) { + console.log('>> Attempting without proxy after proxy error:', proxyError.message); + + // Second attempt without proxy + const urlAplicativos = CONFIG.ENDPOINT_GET_APPS + `${documento}/${profile}`; + const responseAplicativos = await axios.get(urlAplicativos, { + headers: { + "Accept": "*/*", + "Content-Type": "application/json" + }, + timeout: 30000 + }); + + if (responseAplicativos.data['cod'] == '0') { + return processAppsResponse(responseAplicativos.data, data_apps_user); + } + } + } catch (e) { + console.log('>> Error al obtener aplicaciones: ' + e); + } +} + +// Helper function to process the apps response +function processAppsResponse(responseData, data_apps_user) { + var apps_okan = []; + const new_apps = responseData['data'] + .filter(element => element['nombre_app'].startsWith('RPA')) + .sort((a, b) => a.nombre_app.localeCompare(b.nombre_app)); + + console.log('>> Aplicativos Okan: ' + new_apps.length); + + // Process each app from new_apps + for (const app of new_apps) { + let code = app.url.replace('rpaclaro://?code=', ''); + code = code.replace('RpaClaro://?code=', ''); + code = code.replace('&user={user}', ''); + let appExists = data_apps_user.desk?.some(deskApp => deskApp.code === code) || + data_apps_user.web?.some(webApp => webApp.code === code); + + apps_okan.push({ + nombre_app: app.nombre_app, + code_app: code, + logo: app.logo, + status: appExists, + status_integrado: appExists ? 'integrado' : 'no_integrado', + }); + } + + // Generate HTML for all apps + return apps_okan.map(app => ` +
+
+
+ +
${app.nombre_app}
+
+
+
+ `).join(''); +} + +async function getNetworkInfo() { + const interfaces = os.networkInterfaces(); + let ipAddress = ''; + let macAddress = ''; + + // Buscar en todas las interfaces de red + for (const name of Object.keys(interfaces)) { + for (const net of interfaces[name]) { + // Buscar IPv4 y no localhost + if (net.family === 'IPv4' && !net.internal) { + ipAddress = net.address; + macAddress = net.mac; + break; + } + } + if (ipAddress && macAddress) break; + } + + return { ip: ipAddress, mac: macAddress }; +} + +async function getUserData(token) { + try { + const agent_four = new HttpsProxyAgent(CONFIG.PROXY); + const networkInfo = await getNetworkInfo(); + console.log('>> Usuario: ' + process.env.USUARIO); + console.log('>> IP: ' + networkInfo.ip); + console.log('>> MAC: ' + networkInfo.mac); + console.log('>> Hostname: ' + os.hostname()); + + const headersList = { + "Accept": "*/*", + "Content-Type": "application/json", + "X-Client-Mac": networkInfo.mac, + "X-Client-Host": os.hostname(), + "X-Client-Ip": networkInfo.ip, + "Authorization": "Bearer " + token + }; + + const bodyContent = JSON.stringify({ + "filtrar_por": "user_ad", + "valor": process.env.USUARIO, + }); + + const response = await axios.post(CONFIG.ENDPOINT_URL_APPS, bodyContent, { + headers: headersList, + httpsAgent: agent_four + }); + return response.data.apps; + } catch (error) { + console.error('Error en la solicitud:', error); + } +}; + +async function createMainWindow(appsOkan) { + mainWindow = new BrowserWindow({ + width: 1200, + height: 650, + show: true, + // frame: false, // Remove window frame/menu + webPreferences: { + nodeIntegration: true, + contextIsolation: false + }, + }); + + await mainWindow.loadFile('./views/main/index.html'); + const menuTemplate = [ + { + label: 'Archivo', + submenu: [ + { + label: 'Recargar', + accelerator: 'Ctrl+Shift+R', + icon: __dirname + '/views/assets/icons/reload.png', // Ruta al icono + click: () => { + mainWindow.webContents.reloadIgnoringCache(); + } + }, + { type: 'separator' }, // Separador en el menú + { + label: 'Salir', + accelerator: 'Ctrl+Q', + icon: __dirname + '/views/assets/icons/exit.png', // Ruta al icono + click: () => { + app.quit(); + } + } + ] + }, + { + label: 'Ayuda', + submenu: [ + // { + // label: 'Mostrar DevTools', + // accelerator: 'Ctrl+Shift+L', + // icon: __dirname + '/views/assets/icons/screenshot.png', // Ruta al icono + // click: () => { + + // mainWindow.openDevTools(); + // } + // }, + // { type: 'separator' }, + { + label: 'Acerca de', + accelerator: 'Ctrl+Shift+A', + icon: __dirname + '/views/assets/icons/reload.png', // Ruta al icono + click: () => { + const { version } = require('./package.json'); // Obtener la versión desde package.json + dialog.showMessageBox({ + type: 'info', + title: 'Acerca de Mi Aplicación', + message: `Versión ${version}`, + }); + } + } + ] + } + ]; + const menu = Menu.buildFromTemplate(menuTemplate); + mainWindow.setMenu(menu); + mainWindow.maximize(); + + if (process.env.MODE == 'dev') { + mainWindow.show(); + mainWindow.openDevTools(); + // mainWindow.setKiosk(true); + } + // const webContents = mainWindow.webContents; + // webContents.setMaxListeners(50); + + mainWindow.webContents.send('set-version', app_version); + mainWindow.webContents.send('set-userpc', process.env.USUARIO); + try { + mainWindow.webContents.send('data-apps', appsOkan); + } catch (e) { + console.log('>> Error al enviar datos:' + e); + } + + + // webContents.on('did-stop-loading', () => { + // console.log('>> Vista main cargada'); + // }); + + + + mainWindow.on('ready-to-show', () => { + + + // mainWindow.show(); + // mainWindow.setMenu(menu); + // mainWindow.maximize(); + }); + + mainWindow.on('closed', function () { + mainWindow = null; + app.quit(); + }); + + mainWindow.show(); + + return mainWindow; +} + +async function createNewWindow() { + browser = await pie.connect(app, puppeteer, { + defaultViewport: null, + ignoreHTTPSErrors: true, + }); + // const page = await browser.newPage(); + + windowNew = new BrowserWindow({ + args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'], + ignoreHTTPSErrors: true, + width: 1200, + height: 650, + show: false, + webPreferences: { + nodeIntegration: true, + // contextIsolation: false, + partition: 'nopersist' + }, + }); + + windowNew.setMenu(null); + + windowNew.loadURL('https://apps.okan.tools'); + + return 'test'; + +} + +const mainIni = async () => { + await setupProtocolClient(); + await setupLogging(); + await processArguments(); + copyFilesFromRR(); + let getOkanTokenVal = await getOkanToken(); + console.log('Okan token: ' + getOkanTokenVal); + await getProfile(getOkanTokenVal); + userDataApps = await getUserData(getOkanTokenVal); + console.log('>> Aplicaciones:' + userDataApps); + appsOkan = await getApps(userDataApps); + console.log('>> Html generado'); + + let mainWindowInstance = await createMainWindow(appsOkan); + console.log(mainWindowInstance); + await createNewWindow(); + // mainWindow.webContents.on('did-finish-load', async () => { + console.log('termino de cargar'); + // try { + await rpa(process.env.OKAN); + // } catch(e) { + // console.log('oka error: '+e); + // } + // }); + + +}; + +async function openExternalBrowserForTYD075(webApp) { + console.log('>> Iniciando TYD075 en navegador externo'); + + try { + const puppeteer = require('puppeteer'); + + const browser = await puppeteer.launch({ + headless: false, + defaultViewport: null, + args: [ + `--app=${webApp.url}`, + '--start-maximized', + '--no-sandbox', + '--disable-setuid-sandbox' + ], + executablePath: process.platform === 'win32' + ? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' + : undefined + }); + + const pages = await browser.pages(); + const page = pages[0]; + + await new Promise(resolve => setTimeout(resolve, 5000)); + + console.log('>> Rellenando credenciales para TYD075'); + + await page.waitForSelector('#username', { timeout: 10000 }); + const usernameField = await page.$('#username'); + if (usernameField) { + await usernameField.click({ clickCount: 3 }); + await usernameField.type(webApp.username, { delay: 5 }); + console.log('>> Campo usuario rellenado'); + } + + await page.waitForSelector('#password', { timeout: 5000 }); + const passwordField = await page.$('#password'); + if (passwordField) { + await passwordField.click({ clickCount: 3 }); + await passwordField.type(webApp.password, { delay: 5 }); + console.log('>> Campo contraseña rellenado'); + } + + await page.waitForSelector('#loginform fieldset button', { timeout: 5000 }); + const loginButton = await page.$('#loginform fieldset button'); + if (loginButton) { + await loginButton.click(); + console.log('>> Click en botón de login realizado'); + + try { + await page.waitForNavigation({ + waitUntil: 'networkidle0', + timeout: 1500 + }); + console.log('>> Navegación después del login completada'); + + await page.evaluate(() => { + document.addEventListener('contextmenu', event => event.preventDefault()); + + document.addEventListener('keydown', (e) => { + if ( + e.key === 'F12' || + (e.ctrlKey && e.shiftKey && e.key === 'I') || + (e.ctrlKey && e.shiftKey && e.key === 'J') || + (e.ctrlKey && e.key === 'U') + ) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); + }); + + console.log('>> Medidas de seguridad aplicadas correctamente'); + + } catch (navError) { + console.log('>> No hubo navegación o ya estamos en la página correcta'); + + try { + await page.evaluate(() => { + document.addEventListener('contextmenu', event => event.preventDefault()); + + document.addEventListener('keydown', (e) => { + if ( + e.key === 'F12' || + (e.ctrlKey && e.shiftKey && e.key === 'I') || + (e.ctrlKey && e.shiftKey && e.key === 'J') || + (e.ctrlKey && e.key === 'U') + ) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); + + const userField = document.querySelector('#username'); + const passField = document.querySelector('#password'); + const loginBtn = document.querySelector('#loginform fieldset button'); + + if (userField) { + userField.setAttribute('readonly', 'true'); + userField.style.pointerEvents = 'none'; + } + if (passField) { + passField.setAttribute('readonly', 'true'); + passField.style.pointerEvents = 'none'; + } + if (loginBtn) { + loginBtn.style.pointerEvents = 'none'; + } + }); + } catch (evalError) { + console.log('>> Error al aplicar medidas de seguridad:', evalError.message); + } + } + } + + await new Promise(resolve => setTimeout(resolve, 5000)); + + try { + const errorElements = await page.$x('//*[contains(text(), "incorrect") or contains(text(), "error") or contains(text(), "invalid")]'); + if (errorElements.length > 0) { + console.log('>> Error de credenciales detectado'); + dialog.showErrorBox('Error', 'Credenciales incorrectas para TYD075. Por favor, repórtalo al Coordinador'); + await browser.close(); + return false; + } + } catch (e) { + console.log('>> No se detectaron errores de login'); + } + + console.log('>> TYD075 iniciado exitosamente en navegador externo'); + + return true; + + } catch (error) { + console.error('>> Error al abrir TYD075 en navegador externo:', error); + dialog.showErrorBox('Error', `No se pudo abrir TYD075: ${error.message}`); + return false; + } +} + +async function openExternalBrowserForDIM072(webApp) { + console.log('>> Iniciando DIM072 en navegador externo'); + + try { + const puppeteer = require('puppeteer'); + + const browser = await puppeteer.launch({ + headless: false, + defaultViewport: null, + args: [ + `--app=${webApp.url}`, + '--start-maximized', + '--no-sandbox', + '--disable-setuid-sandbox' + ], + executablePath: process.platform === 'win32' + ? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' + : undefined + }); + + const pages = await browser.pages(); + const page = pages[0]; + + await new Promise(resolve => setTimeout(resolve, 1000)); + + console.log('>> Rellenando credenciales para DIM072'); + + await page.waitForSelector('#Usuario', { timeout: 5000 }); + const usernameField = await page.$('#Usuario'); + if (usernameField) { + await usernameField.click({ clickCount: 3 }); + await usernameField.type(webApp.username, { delay: 5 }); + console.log('>> Campo usuario rellenado'); + } + + await page.waitForSelector('#Contrase_a', { timeout: 5000 }); + const passwordField = await page.$('#Contrase_a'); + if (passwordField) { + await passwordField.click({ clickCount: 3 }); + await passwordField.type(webApp.password, { delay: 5 }); + console.log('>> Campo contraseña rellenado'); + } + + await new Promise(resolve => setTimeout(resolve, 250)); + + await page.waitForSelector('button[class="btn btn-lg red"]', { timeout: 5000 }); + const loginButton = await page.$('button[class="btn btn-lg red"]'); + if (loginButton) { + await loginButton.click(); + console.log('>> Click en botón de login realizado'); + + try { + await page.waitForNavigation({ + waitUntil: 'networkidle0', + timeout: 1500 + }); + console.log('>> Navegación después del login completada'); + + await page.evaluate(() => { + document.addEventListener('contextmenu', event => event.preventDefault()); + document.addEventListener('keydown', (e) => { + if ( + e.key === 'F12' || + (e.ctrlKey && e.shiftKey && e.key === 'I') || + (e.ctrlKey && e.shiftKey && e.key === 'J') || + (e.ctrlKey && e.key === 'U') + ) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); + }); + + console.log('>> Medidas de seguridad aplicadas correctamente'); + + } catch (navError) { + console.log('>> No hubo navegación o ya estamos en la página correcta'); + + try { + await page.evaluate(() => { + document.addEventListener('contextmenu', event => event.preventDefault()); + + document.addEventListener('keydown', (e) => { + if ( + e.key === 'F12' || + (e.ctrlKey && e.shiftKey && e.key === 'I') || + (e.ctrlKey && e.shiftKey && e.key === 'J') || + (e.ctrlKey && e.key === 'U') + ) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); + + const userField = document.querySelector('#Usuario'); + const passField = document.querySelector('#Contrase_a'); + const loginBtn = document.querySelector('button[class="btn btn-lg red"]'); + + if (userField) { + userField.setAttribute('readonly', 'true'); + userField.style.pointerEvents = 'none'; + } + if (passField) { + passField.setAttribute('readonly', 'true'); + passField.style.pointerEvents = 'none'; + } + if (loginBtn) { + loginBtn.style.pointerEvents = 'none'; + } + }); + } catch (evalError) { + console.log('>> Error al aplicar medidas de seguridad:', evalError.message); + } + } + } + + await new Promise(resolve => setTimeout(resolve, 5000)); + + try { + const errorElements = await page.$x('//*[contains(text(), "incorrect") or contains(text(), "error") or contains(text(), "invalid")]'); + if (errorElements.length > 0) { + console.log('>> Error de credenciales detectado'); + dialog.showErrorBox('Error', 'Credenciales incorrectas para DIM072. Por favor, repórtalo al Coordinador'); + await browser.close(); + return false; + } + } catch (e) { + console.log('>> No se detectaron errores de login'); + } + + console.log('>> DIM072 iniciado exitosamente en navegador externo'); + + return true; + + } catch (error) { + console.error('>> Error al abrir DIM072 en navegador externo:', error); + dialog.showErrorBox('Error', `No se pudo abrir DIM072: ${error.message}`); + return false; + } +} + +async function openExternalBrowserForTUN065(webApp) { + console.log('>> Iniciando TUN065 en navegador externo'); + + try { + const puppeteer = require('puppeteer'); + + const browser = await puppeteer.launch({ + headless: false, + defaultViewport: null, + args: [ + `--app=${webApp.url}`, + '--start-maximized', + '--no-sandbox', + '--disable-setuid-sandbox' + ], + executablePath: process.platform === 'win32' + ? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' + : undefined + }); + + const pages = await browser.pages(); + const page = pages[0]; + + await new Promise(resolve => setTimeout(resolve, 1000)); + + console.log('>> Rellenando credenciales para TUN065'); + + await page.waitForSelector('input[name="ctl00$cpC$dcLogin$txtUserId"]', { timeout: 5000 }); + const usernameField = await page.$('input[name="ctl00$cpC$dcLogin$txtUserId"]'); + if (usernameField) { + await usernameField.click({ clickCount: 3 }); + await usernameField.type(webApp.username, { delay: 5 }); + console.log('>> Campo usuario rellenado'); + } + + await page.waitForSelector('input[name="ctl00$cpC$dcLogin$txtPassword"]', { timeout: 5000 }); + const passwordField = await page.$('input[name="ctl00$cpC$dcLogin$txtPassword"]'); + if (passwordField) { + await passwordField.click({ clickCount: 3 }); + await passwordField.type(webApp.password, { delay: 5 }); + console.log('>> Campo contraseña rellenado'); + } + + await new Promise(resolve => setTimeout(resolve, 50)); + + await page.waitForSelector('div[class="button fs-bold text-center"]', { timeout: 5000 }); + const loginButton = await page.$('div[class="button fs-bold text-center"]'); + if (loginButton) { + await loginButton.click(); + console.log('>> Click en botón de login realizado'); + + try { + await page.waitForNavigation({ + waitUntil: 'networkidle0', + timeout: 1000 + }); + console.log('>> Navegación después del login completada'); + + await page.evaluate(() => { + document.addEventListener('contextmenu', event => event.preventDefault()); + document.addEventListener('keydown', (e) => { + if ( + e.key === 'F12' || + (e.ctrlKey && e.shiftKey && e.key === 'I') || + (e.ctrlKey && e.shiftKey && e.key === 'J') || + (e.ctrlKey && e.key === 'U') + ) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); + }); + + console.log('>> Medidas de seguridad aplicadas correctamente'); + + } catch (navError) { + console.log('>> No hubo navegación o ya estamos en la página correcta'); + + try { + await page.evaluate(() => { + document.addEventListener('contextmenu', event => event.preventDefault()); + + document.addEventListener('keydown', (e) => { + if ( + e.key === 'F12' || + (e.ctrlKey && e.shiftKey && e.key === 'I') || + (e.ctrlKey && e.shiftKey && e.key === 'J') || + (e.ctrlKey && e.key === 'U') + ) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); + + const userField = document.querySelector('input[name="ctl00$cpC$dcLogin$txtUserId"]'); + const passField = document.querySelector('input[name="ctl00$cpC$dcLogin$txtPassword"]'); + const loginBtn = document.querySelector('div[class="button fs-bold text-center"]'); + + if (userField) { + userField.setAttribute('readonly', 'true'); + userField.style.pointerEvents = 'none'; + } + if (passField) { + passField.setAttribute('readonly', 'true'); + passField.style.pointerEvents = 'none'; + } + if (loginBtn) { + loginBtn.style.pointerEvents = 'none'; + } + }); + } catch (evalError) { + console.log('>> Error al aplicar medidas de seguridad:', evalError.message); + } + } + } + + await new Promise(resolve => setTimeout(resolve, 5000)); + + try { + const errorElements = await page.$x('//*[contains(text(), "incorrect") or contains(text(), "error") or contains(text(), "invalid")]'); + if (errorElements.length > 0) { + console.log('>> Error de credenciales detectado'); + dialog.showErrorBox('Error', 'Credenciales incorrectas para TUN065. Por favor, repórtalo al Coordinador'); + await browser.close(); + return false; + } + } catch (e) { + console.log('>> No se detectaron errores de login'); + } + + console.log('>> TUN065 iniciado exitosamente en navegador externo'); + + return true; + + } catch (error) { + console.error('>> Error al abrir TUN065 en navegador externo:', error); + dialog.showErrorBox('Error', `No se pudo abrir IDV03: ${error.message}`); + return false; + } +} + +async function openExternalBrowserForPOL(webApp) { + console.log('>> Iniciando POLIEDRO en navegador externo'); + + try { + const puppeteer = require('puppeteer'); + + const browser = await puppeteer.launch({ + headless: false, + defaultViewport: null, + args: [ + `--app=${webApp.url}`, + '--start-maximized', + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-web-security', + '--disable-features=VizDisplayCompositor' + ], + executablePath: process.platform === 'win32' + ? 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe' + : undefined + }); + + const pages = await browser.pages(); + const page = pages[0]; + + await page.waitForLoadState?.('networkidle') || await new Promise(resolve => setTimeout(resolve, 2000)); + + console.log('>> Rellenando credenciales para POLIEDRO'); + + async function fillFieldRobustly(selector, value, fieldName, maxRetries = 3) { + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + console.log(`>> Intento ${attempt} para llenar ${fieldName}`); + + await page.waitForSelector(selector, { timeout: 10000 }); + const field = await page.$(selector); + + if (!field) { + throw new Error(`Campo ${fieldName} no encontrado`); + } + + // Limpiar el campo completamente + await field.click({ clickCount: 3 }); + await page.keyboard.press('Delete'); + await page.keyboard.press('Backspace'); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Escribir el valor caracter por caracter para mayor confiabilidad + for (const char of value) { + await page.keyboard.type(char, { delay: 20 }); + await new Promise(resolve => setTimeout(resolve, 10)); + } + + // Verificar que el valor se escribió correctamente + await new Promise(resolve => setTimeout(resolve, 500)); + const currentValue = await page.$eval(selector, el => el.value); + + if (currentValue === value) { + console.log(`>> ${fieldName} rellenado correctamente: `); + return true; + } else { + console.warn(`>> ${fieldName} no coincide. Esperado: , Actual:`); + if (attempt === maxRetries) { + throw new Error(`No se pudo llenar ${fieldName} después de ${maxRetries} intentos`); + } + } + } catch (error) { + console.error(`>> Error en intento ${attempt} para ${fieldName}:`, error.message); + if (attempt === maxRetries) { + throw error; + } + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + return false; + } + + await fillFieldRobustly('#ctl00_ContentPlaceHolder1_txtUsuario', webApp.username, 'usuario'); + + await new Promise(resolve => setTimeout(resolve, 500)); + + await fillFieldRobustly('#ctl00_ContentPlaceHolder1_txtContraseña', webApp.password, 'contraseña'); + + console.log('>> Realizando validación final de credenciales...'); + await new Promise(resolve => setTimeout(resolve, 250)); + + const finalUsernameCheck = await page.$eval('#ctl00_ContentPlaceHolder1_txtUsuario', el => el.value); + const finalPasswordCheck = await page.$eval('#ctl00_ContentPlaceHolder1_txtContraseña', el => el.value); + + if (finalUsernameCheck !== webApp.username) { + throw new Error(`Usuario final no coincide. Esperado: "${webApp.username}", Actual: "${finalUsernameCheck}"`); + } + + if (finalPasswordCheck !== webApp.password) { + throw new Error(`Contraseña final no coincide. Esperado: , Actual: "${finalPasswordCheck}"`); + } + + console.log('>> Validación final exitosa. Procediendo con el login...'); + + await page.waitForSelector('input[name="ctl00$ContentPlaceHolder1$btnIngresarUsuarioContraseña"]', { timeout: 5000 }); + const loginButton = await page.$('input[name="ctl00$ContentPlaceHolder1$btnIngresarUsuarioContraseña"]'); + + if (loginButton) { + const isDisabled = await page.$eval('input[name="ctl00$ContentPlaceHolder1$btnIngresarUsuarioContraseña"]', el => el.disabled); + if (isDisabled) { + console.warn('>> El botón de login está deshabilitado, esperando...'); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + await loginButton.click(); + console.log('>> Click en botón de login realizado'); + + try { + await new Promise(resolve => setTimeout(resolve, 3000)); + + try { + const hasTokenField = await page.$('td[colspan="2"].auto-style1'); + + if (!hasTokenField) { + const errorElements = await page.evaluate(() => { + const elements = document.querySelectorAll('*'); + for (let element of elements) { + const text = element.textContent.toLowerCase(); + if (text.includes('incorrect') || text.includes('error') || text.includes('invalid') || + text.includes('incorrecto') || text.includes('inválido') || + (text.includes('usuario') && text.includes('contraseña'))) { + return true; + } + } + return false; + }); + + if (errorElements) { + console.log('>> Error de credenciales detectado'); + dialog.showErrorBox('Error', 'Credenciales incorrectas para POLIEDRO. Por favor, repórtalo al Coordinador'); + await browser.close(); + return false; + } + } else { + console.log('>> Campo de token detectado. No se verifica error de login aún.'); + } + } catch (e) { + console.log('>> Error al verificar errores de credenciales:', e.message); + } + + try { + await page.waitForSelector('td[colspan="2"].auto-style1', { + visible: true, + timeout: 2000 + }); + + const element = await page.$('td[colspan="2"].auto-style1'); + const textContent = await page.evaluate(el => el.textContent, element); + console.log(`>> Contenido encontrado: ${textContent.trim()}`); + + if (textContent.includes('token') && textContent.includes('SMS')) { + console.log('>> Campo de token detectado - Habilitando interacción completa'); + + dialog.showMessageBox({ + type: 'info', + title: 'Token SMS Requerido', + message: 'Se ha detectado que se requiere un token SMS. Por favor, ingrese el código que recibió por SMS en la página web y complete el proceso de autenticación.', + buttons: ['Entendido'] + }); + + let authCompleted = false; + let attempts = 0; + const maxAttempts = 15; + + while (!authCompleted && attempts < maxAttempts) { + await new Promise(resolve => setTimeout(resolve, 5000)); + attempts++; + + try { + const tokenFieldStillExists = await page.$('td[colspan="2"].auto-style1'); + if (!tokenFieldStillExists) { + authCompleted = true; + console.log('>> Autenticación completada - Campo de token ya no presente'); + break; + } + + const currentUrl = page.url(); + const pageTitle = await page.title(); + if (!currentUrl.includes('/login') && !pageTitle.toLowerCase().includes('login')) { + authCompleted = true; + console.log('>> Autenticación completada - Navegación detectada'); + break; + } + + console.log(`>> Esperando autenticación... Intento ${attempts}/${maxAttempts}`); + } catch (e) { + console.log('>> Error al verificar estado de autenticación:', e.message); + } + } + + if (!authCompleted && attempts >= maxAttempts) { + console.log('>> Tiempo de espera agotado para autenticación OTP'); + dialog.showWarningBox('Tiempo Agotado', + 'El tiempo de espera para la autenticación OTP ha expirado. La sesión seguirá activa, pero puede que necesite completar manualmente el proceso.'); + } + } + } catch (otpError) { + console.log('>> No se detectó campo de token OTP, continuando...'); + } + + try { + await page.evaluate(() => { + document.addEventListener('contextmenu', event => event.preventDefault()); + document.addEventListener('keydown', (e) => { + if ( + e.key === 'F12' || + (e.ctrlKey && e.shiftKey && e.key === 'I') || + (e.ctrlKey && e.shiftKey && e.key === 'J') || + (e.ctrlKey && e.key === 'U') + ) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); + }); + + console.log('>> Medidas de seguridad aplicadas correctamente'); + } catch (securityError) { + console.log('>> Error al aplicar medidas de seguridad:', securityError.message); + } + + } catch (loginError) { + console.log('>> Error durante el proceso de login:', loginError.message); + dialog.showErrorBox('Error', `Error durante el proceso de login: ${loginError.message}`); + await browser.close(); + return false; + } + } + + await new Promise(resolve => setTimeout(resolve, 2000)); + console.log('>> POLIEDRO iniciado exitosamente en navegador externo'); + return true; + + } catch (error) { + console.error('>> Error al abrir POLIEDRO en navegador externo:', error); + dialog.showErrorBox('Error', `No se pudo abrir POLIEDRO: ${error.message}`); + return false; + } +} + +async function rpa(data_code) { + + console.log('>> Iniciando RPA'); + + if (userDataApps) { + const codeExists = userDataApps.desk.some(app => app.code === data_code) || + userDataApps.web.some(app => app.code === data_code); + + if (codeExists) { + console.log(`>> Aplicativo ${data_code} esta asociado`); + const deskApp = userDataApps.desk.find(app => app.code === data_code); + const webApp = userDataApps.web.find(app => app.code === data_code); + + if (deskApp) { + type = 'desktop'; + username = deskApp.username; + password = deskApp.password; + xpath_username = deskApp.xpath_username; + xpath_password = deskApp.xpath_password; + xpath_button = deskApp.btn_login; + + if (type == 'desktop') { + switch (data_code) { + case 'IRR123': + console.log('=== INICIANDO PROCESO IRR123 ==='); + console.log(`Timestamp: ${new Date().toISOString()}`); + console.log(`Usuario: ${username}`); + console.log('Ejecutando función rr() para automatización AS400...'); + + rrtest = rr(username, password); + console.log(`Resultado de rr(): ${rrtest}`); + console.log('=== PROCESO IRR123 COMPLETADO ==='); + break; + + case 'ACC098': + console.log('ACC098'); + + programa = '"C:\\Program Files (x86)\\AC Administración de Clientes\\AC Administrador de Clientes.exe"'; + exec(programa, (error, stdout, stderr) => { + if (error) { + console.error(`Error al abrir el programa: ${error.message}`); + return; + } + if (stderr) { + console.error(`Error en la salida estándar: ${stderr}`); + return; + } + console.log(`Salida del programa: ${stdout}`); + }); + + break; + + case 'AVY003': + console.log('AVY003'); + + programa = '"C:\\Program Files (x86)\\Avaya\\Avaya one-X Agent\\OneXAgentUI.exe"'; + exec(programa, (error, stdout, stderr) => { + // if (error) { + // console.error(`Error al abrir el programa: ${error.message}`); + // return; + // } + if (stderr) { + console.error(`Error en la salida estándar: ${stderr}`); + return; + } + console.log(`Salida del programa: ${stdout}`); + }); + + break; + + case 'XLT001': + console.log('XLT001'); + + programa = '"C:\\Program Files (x86)\\CounterPath\\X-Lite\\x-lite.exe"'; + exec(programa, (error, stdout, stderr) => { + if (error) { + console.error(`Error al abrir el programa: ${error.message}`); + return; + } + if (stderr) { + console.error(`Error en la salida estándar: ${stderr}`); + return; + } + console.log(`Salida del programa: ${stdout}`); + }); + + break; + + case 'CTB002': + console.log('CTB002'); + + programa = '"C:\\avaya\\CTIbar\\ctibar.exe"'; + exec(programa, (error, stdout, stderr) => { + if (error) { + console.error(`Error al abrir el programa: ${error.message}`); + return; + } + if (stderr) { + console.error(`Error en la salida estándar: ${stderr}`); + return; + } + console.log(`Salida del programa: ${stdout}`); + }); + + break; + } + } + } else if (webApp) { + type = 'web'; + url_platform = webApp.url; + username = webApp.username; + password = webApp.password; + xpath_username = webApp.xpath_user; + xpath_password = webApp.xpath_pass; + xpath_button = webApp.btn_login; + + // if (data_code === 'TYD075') { + // console.log('>> Detectado TYD075 - Usando navegador externo'); + // const success = await openExternalBrowserForTYD075(webApp); + // if (!success) { + // console.log('>> Error al procesar TYD075'); + // } + // return; + // } + + // if (data_code === 'DIM072') { + // console.log('>> Detectado DIM072 - Usando navegador externo'); + // const success = await openExternalBrowserForDIM072(webApp); + // if (!success) { + // console.log('>> Error al procesar DIM072'); + // } + // return; + // } + + // if (data_code === 'TUN065') { + // console.log('>> Detectado TUN065 - Usando navegador externo'); + // const success = await openExternalBrowserForTUN065(webApp); + // if (!success) { + // console.log('>> Error al procesar TUN065'); + // } + // return; + // } + + // if (data_code === 'POL911' || data_code === 'POL912' || data_code === 'POL913' || data_code === 'POL914' || data_code === 'POL915' || data_code === 'POD911') { + // console.log('>> Detectado POLIEDRO - Usando navegador externo'); + // const success = await openExternalBrowserForPOL(webApp); + // if (!success) { + // console.log('>> Error al procesar POLIEDRO'); + // } + // return; + // } + + // if (!windowNew || windowNew.isDestroyed()) { + windowNew = new BrowserWindow({ + args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'], + ignoreHTTPSErrors: true, + width: 1200, + height: 650, + show: false, + webPreferences: { + nodeIntegration: true, + // contextIsolation: false, + partition: 'nopersist' + }, + }); + // } + + windowNew.on('closed', function () { + windowNew = null; + console.log('>> Ventana cerrada'); + }); + + console.log('Esta es la url act: ' + webApp.url); + + if (data_code == 'POL911' || data_code == 'POL912' || data_code == 'POL913' || data_code == 'POL914' || data_code == 'POL915' || data_code == 'POD911') { + webApp.url = 'https://poliedro.comcel.com.co/LoginPoliedro/Login.aspx'; + } + windowNew.loadURL(webApp.url); + windowNew.show(); + windowNew.maximize(); + windowNew.setIgnoreMouseEvents(false); + + if (process.env.MODE != 'prod') { + windowNew.openDevTools(); + windowNew.setIgnoreMouseEvents(false); + } + + try { + await Promise.race([ + new Promise(resolve => { + windowNew.webContents.on('did-finish-load', resolve); + }), + new Promise((_, reject) => + setTimeout(() => reject(new Error('Timeout loading page')), 30000) + ) + ]); + + page = await pie.getPage(browser, windowNew); + if (!page) { + throw new Error('Failed to get page'); + } + console.log('>> URL cargada: ' + page.url()); + } catch (error) { + console.log('>> Error al cargar la página:', error.message); + if (windowNew && !windowNew.isDestroyed()) { + windowNew.close(); + } + throw error; + } + } + + console.log(`>> Tipo: ${type}`); + if (type != 'desktop') { + console.log(`>> URL: ${url_platform}`); + + console.log(`>> Username: ${username}`); + console.log(`>> Password: **********`); + console.log('>> Xpath username: ' + xpath_username); + console.log('>> Xpath password: ' + xpath_password); + console.log('>> Xpath button: ' + xpath_button); + + console.log('--------------------------'); + console.log('Abriendo aplicativo'); + console.log('--------------------------'); + try { + + app.on('login', (event, webContents, request, authInfo, callback) => { + console.log('______________________login___________________'); + event.preventDefault(); + callback(username, password); + }); + + windowNew.setOpacity(1); + windowNew.maximize(); + windowNew.setMenu(null); + windowNew.setIgnoreMouseEvents(true); + + if (process.env.MODE != 'prod') { + windowNew.openDevTools(); + windowNew.setIgnoreMouseEvents(false); + } + + console.log('>> Url aplicativo: ' + url_platform); + + let data_response_service = { + App: webApp.url || url_platform + }; + + const allowedCodes = ['SMO098', 'CTD094', 'SGC095', 'MAX096', 'CUP045']; + const specialCodes = ['MAP039']; + const loginCodes = ['ATB089', 'VTT046', 'DSC047', 'SMO098', 'CTD094', 'SGC095', 'MAX096', 'CUP045', 'BDC087']; + let url_mod; + + if (allowedCodes.includes(data_code)) { + url_mod = `http://${username}:${password}@${data_response_service.App.replace('http://', '')}`; + url_mod = url_platform; + } else { + url_mod = url_platform; + } + + + + try { + if (data_code == 'BDC087') { + url_mod = 'http://100.123.251.118:8082/componentes/ASP/consultabroadcast.aspx' + } + if (data_code == 'SRA074') { + url_mod = 'http://100.126.20.149:8080/sara/index.html' + } + + + await windowNew.loadURL(url_mod); + // Manejar casos especiales de tiempo de espera + if (data_code == 'POL911' || data_code == 'POL912' || data_code == 'POL913' || data_code == 'POL914' || data_code == 'POL915' || data_code == 'POD911') { + await new Promise(resolve => setTimeout(resolve, 5000)); + } + + // **NUEVO: Manejar cookies para ASC069** + if (data_code === 'ASC069') { + console.log('>> Procesando aplicativo ASC069 - Verificando cookies...'); + await new Promise(resolve => setTimeout(resolve, 3000)); // Esperar a que cargue completamente + + const cookiesHandled = await handleCookiesASC069(page, data_code); + + if (!cookiesHandled) { + console.log('>> No se pudieron manejar las cookies automáticamente'); + console.log('>> Permitiendo interacción manual del usuario'); + + // Habilitar interacción del usuario temporalmente + windowNew.setIgnoreMouseEvents(false); + + // Mostrar notificación al usuario + const notification = new Notification({ + title: 'Acción requerida - ASC069', + body: 'Por favor, acepta las cookies manualmente y el proceso continuará automáticamente', + icon: 'logo-claro.ico' + }); + notification.show(); + + // Esperar un tiempo razonable para que el usuario acepte las cookies + await new Promise(resolve => setTimeout(resolve, 10000)); + + // Verificar si la página cambió (indicando que se aceptaron las cookies) + try { + // Intentar detectar si el popup de cookies ya no está presente + const cookiePopupGone = await page.$eval('body', () => { + // Buscar indicadores comunes de que el popup se cerró + const commonCookieIndicators = [ + '[class*="cookie"]', + '[id*="cookie"]', + '[data-cookie]', + '.modal[style*="display: block"]' + ]; + + for (const selector of commonCookieIndicators) { + if (document.querySelector(selector)) { + return false; // Aún hay popup + } + } + return true; // Popup desapareció + }); + + if (cookiePopupGone) { + console.log('>> Cookies aparentemente aceptadas por el usuario'); + } else { + console.log('>> Continuando proceso - el usuario debe haber manejado las cookies'); + } + + } catch (e) { + console.log('>> Continuando con el proceso normal'); + } + + // Continuar con el proceso automático + windowNew.setIgnoreMouseEvents(true); + } + } + + console.log('>> Cargo la pagina'); + } catch (error) { + console.log('>> No se pudo cargar la pagina: ' + error); + dialog.showErrorBox('Error', 'No se pudo cargar la pagina. Por favor reporta al Helpdesk'); + windowNew.setOpacity(1); + windowNew.close(); + } + + + // const page = await pie.getPage(browser, windowNew); + try { + // const pages = await browser.pages().then(pages => pages).catch(err => console.error(err)); + // console.log(pages); + // var page; + var pageUrl; + + // for (const pages_sel of pages) { + // const pageUrl = await pages_sel.url(); + // // console.log('la obtenida: ' + pageUrl + '_____' + 'la real: ' + url_mod); + // if (pageUrl == 'http://100.126.20.149:8080/sara/login') { + // url_mod = 'http://100.126.20.149:8080/sara/login'; + // } + // if (pageUrl == 'http://dime.claro.com.co/Portal/Produccion/Sesion/Inicio/Ingresar?ReturnUrl=%2FPortal%2FProduccion%2FFidelizacion%2FRetencion%2FRegistrarSolicitud%3Fdato%3D1007227477%26Cuenta%3D89715445%26Ticket%3D1%26Internet%3D1%26TV%3D1%26Telefonia%3D0') { + // url_mod = 'http://dime.claro.com.co/Portal/Produccion/Sesion/Inicio/Ingresar?ReturnUrl=%2FPortal%2FProduccion%2FFidelizacion%2FRetencion%2FRegistrarSolicitud%3Fdato%3D1007227477%26Cuenta%3D89715445%26Ticket%3D1%26Internet%3D1%26TV%3D1%26Telefonia%3D0'; + // } + // if (pageUrl === url_mod) { + // console.log(`Ok pagina`); + // page = pages_sel; + // break; // Detén el bucle cuando encuentras la coincidencia + // } + // } + + if (page) { + console.log(`Nombre de la pagina: ${await page.title()}`); + + if (data_code == 'ASW049') { + console.log('avaya web'); + await new Promise(resolve => setTimeout(resolve, 5000)); + console.log('okan avaya'); + } + + // await page.waitForLoad(); + if (xpath_username != 'na') { + // if (data_code == 'POL911' || data_code == 'POL912' || data_code == 'POL913' || data_code == 'POL914' || data_code == 'POL915' || data_code == 'POD911') { + // await page.waitForXPath('//input[@id="ctl00_ContentPlaceHolder1_BtnRegresarMensaje"]'); + // const backBtn = await page.$x('//input[@id="ctl00_ContentPlaceHolder1_BtnRegresarMensaje"]'); + // await backBtn[0].click(); + // } + if (!loginCodes.includes(data_code)) { + + if (data_code == 'CLU100') { + const elementHandleClu = await page.$('.sign-in-uclaro'); + if (elementHandleClu) { + await elementHandleClu.click(); + } + } + //empieza a llenar el campo de usuario + await page.waitForXPath(xpath_username); + const elementHandleUser = await page.$x(xpath_username); + await elementHandleUser[0].type('', { delay: 100 }); + await elementHandleUser[0].type(username); + console.log('>> Diligencio campo usuario'); + + if (data_code == 'ABS099') { + await page.keyboard.press("Enter"); + } else { + await page.keyboard.press("Tab"); + } + + if (data_code == 'AGE036') { + await page.waitForTimeout(4000); + + } else { + await page.waitForTimeout(1000); + } + + await page.waitForXPath(xpath_password); + const elementHandlePass = await page.$x(xpath_password); + await elementHandlePass[0].type('', { delay: 100 }); + await elementHandlePass[0].type(password); + console.log('>> Diligencio campo password'); + + await page.waitForTimeout(1000); + + // Manejo específico para MAP039 + if (data_code === 'MAP039') { + console.log('>> Procesando botón de login para MAP039...'); + + try { + console.log('>> Intentando submit directo del formulario...'); + const formSubmitted = await page.evaluate(() => { + const form = document.querySelector('form.vc_menu-search'); + if (form) { + form.submit(); + return true; + } + return false; + }); + + if (formSubmitted) { + console.log('>> Formulario enviado con submit()'); + } else { + console.log('>> Intentando disparar evento submit...'); + await page.evaluate(() => { + const form = document.querySelector('form.vc_menu-search'); + if (form) { + const submitEvent = new Event('submit', { + bubbles: true, + cancelable: true + }); + form.dispatchEvent(submitEvent); + } + }); + console.log('>> Evento submit disparado'); + } + + } catch (error) { + console.log('>> Error con submit:', error.message); + + try { + console.log('>> Intentando click forzado en div Entrar...'); + await page.evaluate(() => { + const enterDiv = document.querySelector('.vc_menu-send'); + if (enterDiv) { + const clickEvent = new MouseEvent('click', { + bubbles: true, + cancelable: true, + view: window + }); + enterDiv.dispatchEvent(clickEvent); + } + }); + console.log('>> Click forzado realizado'); + } catch (clickError) { + console.log('>> Click forzado falló:', clickError.message); + + console.log('>> Intentando Enter en campo contraseña...'); + await page.focus('#contra'); + await page.keyboard.press('Enter'); + } + } + + await page.waitForTimeout(2000); + + } else { + const xpathMap = { + 'DIM072': '//button[contains(@id, "btiniciar")]', + 'CLU100': '//button[contains(@class, "ingresarBoton")]', + 'CMC093': xpath_button, + 'MCA030': '//input[contains(@id, "login-button")]' + }; + + const xpath = xpathMap[data_code] || null; + + if (xpath) { + try { + await page.waitForXPath(xpath, { timeout: 5000 }); + const elementHandle = await page.$x(xpath); + if (elementHandle && elementHandle.length > 0) { + await elementHandle[0].click(); + console.log('>> Se dio click en boton'); + } else { + console.log('>> No encontro boton'); + await page.keyboard.press('Enter'); + } + } catch (error) { + console.log('>> Error esperando botón, usando Enter'); + await page.keyboard.press('Enter'); + } + } else { + await page.keyboard.press('Enter'); + } + } + } + + // await page.waitForTimeout(70000); + + + console.log('>> Envio formulario'); + + await page.waitForTimeout(7000); + + if (data_code == 'POL911' || data_code == 'POL912' || data_code == 'POL913' || data_code == 'POL914' || data_code == 'POL915' || data_code == 'POD911') { + console.log('>> Procesando aplicativo Poliedro'); + try { + console.log('>> Esperando campo de token...'); + + try { + await page.waitForSelector('td[colspan="2"][class="auto-style1"]', { + visible: true, + timeout: 10000 + }); + + const element = await page.$('td[colspan="2"][class="auto-style1"]'); + const textContent = await page.evaluate(el => el.textContent, element); + console.log(`>> Contenido encontrado: ${textContent.trim()}`); + + if (textContent.includes('token') && textContent.includes('SMS')) { + console.log('>> Campo de token detectado - Habilitando interacción completa'); + + windowNew.setIgnoreMouseEvents(false); + + windowNew.show(); + windowNew.focus(); + windowNew.setAlwaysOnTop(true); + setTimeout(() => { + windowNew.setAlwaysOnTop(false); + }, 1000); + + const notification = new Notification({ + title: 'Acción requerida - Poliedro', + body: 'Ingresa el código de verificación. La ventana ya está habilitada para uso.', + icon: 'logo-claro.ico' + }); + notification.show(); + + console.log('>> Interacción habilitada permanentemente para Poliedro'); + return; + + } else { + throw new Error('Contenido no coincide con mensaje de token'); + } + + } catch (tokenError) { + console.log('>> No se encontró mensaje de token, verificando login exitoso...'); + await page.waitForTimeout(3000); + + windowNew.setIgnoreMouseEvents(false); + windowNew.show(); + windowNew.focus(); + + console.log('>> Interacción habilitada para uso normal de Poliedro'); + } + + } catch (e) { + console.log('>> Error en Poliedro, habilitando interacción manual: ' + e); + + windowNew.setIgnoreMouseEvents(false); + windowNew.show(); + windowNew.focus(); + windowNew.setAlwaysOnTop(true); + setTimeout(() => { + windowNew.setAlwaysOnTop(false); + }, 1000); + + const notification = new Notification({ + title: 'Atención - Poliedro', + body: 'Complete el proceso manualmente. La ventana está habilitada.', + icon: 'logo-claro.ico' + }); + notification.show(); + } + + return; + } else { + const checkAndClose = async (message, text, xpath) => { + var elementHandles; + if (xpath) { + elementHandles = await page.$x(text, { timeout: 1000 }); + } else { + if (data_code != 'SRA074' && text != 'valid') { + elementHandles = await page.$x(`//*[contains(text(), "${text}")]`, { timeout: 1000 }); + } + } + + if (elementHandles && elementHandles.length > 0) { + if (data_code == 'VIM059' && elementHandles.length <= 2) { + // No hace nada para VIM059 con 2 elementos o menos + } else if (data_code == 'DIM072' && elementHandles.length <= 1) { + // No hace nada para DIM072 con 1 elemento o menos + } else if (data_code == '') { + // No hacer nada para TUN065 - permitir que continúe normalmente + console.log(`>> IDV033: Se encontró texto "${text}" pero se permite continuar`); + } else if (data_code == 'ASC069') { + // No hace nada para ASC069 + console.log(`>> ASC069: Se encontró texto "${text}" pero se permite continuar`); + } else { + console.log(`Se encontró mensaje de error de credenciales: ${message}`); + dialog.showErrorBox('Error', 'Parece que hubo un problema con el ingreso. Por favor, repórtalo al Coordinador'); + windowNew.close(); + } + } else { + console.log(`>> No se encontró mensaje de error de credenciales: ${message}`); + } + }; + + await checkAndClose('Incorrect', 'incorrect', false) || + await checkAndClose('Incorrectos', 'INCORRECTOS', false) || + await checkAndClose('Error', 'error', false) || + await checkAndClose('Error', 'Error', false) || + await checkAndClose('Errada', 'errad', false) || + await checkAndClose('Valid', 'valid', false) || + await checkAndClose('no se encuentra habilitado para', 'no se encuentra habilitado para', false) || + await checkAndClose('Could not log', 'could not log', false) || + await checkAndClose('Form', xpath_username, true); + } + } + windowNew.setIgnoreMouseEvents(false); + // windowNew.setOpacity(1); + // windowNew.maximize(); + // windowNew.focus(); + } else { + console.log('>> No se encontro ninguna pagina con la URL proporcionada.'); + } + + + } catch (error) { + console.log(error); + } + + } catch (error) { + windowNew.setOpacity(1); + windowNew.close(); + console.error('Ha ocurrido un error ', data_code, error); + dialog.showErrorBox('Error', 'Ha ocurrido un error ' + error); + } + } + + + + } else { + console.log(`>> Aplicativo ${data_code} no esta asociado`); + await dialog.showMessageBox({ + type: 'error', + defaultId: 0, + title: 'Error de acceso', + message: 'Lo siento, no tienes acceso a este aplicativo', + }); + } + } + +}; + +// Ensure mainIni is called after app is ready +app.on('ready', mainIni); + +const gotTheLock = app.requestSingleInstanceLock(); + +if (!gotTheLock) { + app.quit(); +} else { + app.on('second-instance', async (event, argv, workingDirectory) => { + console.log('>> Segunda instancia'); + console.log(argv); + // Focus the main window if a second instance is detected + if (mainWindow) { + if (mainWindow.isMinimized()) mainWindow.restore(); + mainWindow.focus(); + } + + process.env.MODE = 'prod'; + let url_okan = argv[3]; + let code_okan_str = url_okan.toString(); + + // Handle OKAN code from URL or direct argument + if (argv[3] && !argv.dev) { + + let code_okan = code_okan_str.split('&')[0].replace('rpaclaro:///?code=', ''); + let user_okan = code_okan_str.split('&')[1].replace('user=', ''); + process.env.OKAN = code_okan; + process.env.USUARIO = user_okan; + console.log('>> Sgundos instancia code: ' + process.env.OKAN); + await rpa(process.env.OKAN); + } else { + process.env.OKAN = argv.code; + process.env.USUARIO = argv.user; + } + + // Set environment mode + if (argv.dev) { + process.env.MODE = 'dev'; + } else { + process.env.MODE = 'prod'; + } + + console.log('>> Iniciando RpaClaro..'); + console.log('_____________________________'); + console.log('RPA CLARO'); + console.log('Usuario: ' + process.env.USUARIO); + console.log('Version: ' + app_version); + console.log('Modo: ' + process.env.MODE); + console.log('_____________________________'); + + }); + + // app.on('ready', mainIni); +} + +// ... existing code ... + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.commandLine.appendSwitch('ignore-certificate-errors'); + +app.on('certificate-error', (event, webContents, url, error, certificate, callback) => { + event.preventDefault(); + callback(true); +}); + +ipcMain.on('openNewWindow', (event, data_code) => { + rpa(data_code); +}); + +ipcMain.on('newNotification', (event, message) => { + const notification = new Notification({ + title: message.title, + body: message.body, + icon: 'logo-claro.ico' + }); + notification.show(); +}); + +ipcMain.on('show-help', () => { + dialog.showMessageBox({ + type: 'info', + title: 'Acerca de Mi Aplicación', + message: `Versión ` + app.getVersion(), + }); +}); + +ipcMain.on('reload-app', () => { + mainWindow.webContents.reloadIgnoringCache(); // Reload main window ignoring cache +}); + +ipcMain.on('close-app', () => { + app.quit(); // Cierra la aplicación +}); diff --git a/package.json b/package.json index 0bbdf35..0c6d717 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "rpa-claro", "productName": "RpaClaro", - "version": "4.1.5", + "version": "4.1.6", "description": "RPA Claro", "author": "TARS", "license": "MIT", - "main": "entry.js", + "main": "entry2.js", "scripts": { - "start": "electron . --user='46286506' --dev --log --code=POL911", + "start": "electron . --user='45957768' --dev --log --code=TYD075", "postinstall": "electron-builder install-app-deps", "pack": "electron-builder --dir", "build": "electron-builder --win && node copy-deps.js",