Automatiza el login en AFIP y marca los últimos 5 cambios en expedientes
Size
8.2 KB
Version
1.0.1
Created
Mar 11, 2026
Updated
10 days ago
1// ==UserScript==
2// @name AFIP Auto Login y Marcador de Expedientes
3// @description Automatiza el login en AFIP y marca los últimos 5 cambios en expedientes
4// @version 1.0.1
5// @match https://*.tramitesadistancia.gob.ar/*
6// @icon https://tramitesadistancia.gob.ar/tramitesadistancia/images/favicon.ico
7// ==/UserScript==
8(function() {
9 'use strict';
10
11 console.log('AFIP Auto Login Extension iniciada');
12
13 // Función para esperar a que un elemento aparezca en el DOM
14 function waitForElement(selector, timeout = 10000) {
15 return new Promise((resolve, reject) => {
16 const element = document.querySelector(selector);
17 if (element) {
18 console.log('Elemento encontrado inmediatamente:', selector);
19 return resolve(element);
20 }
21
22 const observer = new MutationObserver((mutations, obs) => {
23 const element = document.querySelector(selector);
24 if (element) {
25 console.log('Elemento encontrado por observer:', selector);
26 obs.disconnect();
27 resolve(element);
28 }
29 });
30
31 observer.observe(document.body, {
32 childList: true,
33 subtree: true
34 });
35
36 setTimeout(() => {
37 observer.disconnect();
38 reject(new Error(`Timeout esperando elemento: ${selector}`));
39 }, timeout);
40 });
41 }
42
43 // Función para hacer clic en el botón AFIP
44 async function clickAFIPButton() {
45 try {
46 console.log('Buscando botón AFIP...');
47 const afipButton = document.querySelector('a.btn.btn-primary.btn-sm[href*="tad-afip"]');
48
49 if (afipButton) {
50 console.log('Botón AFIP encontrado, haciendo clic...');
51 afipButton.click();
52 return true;
53 } else {
54 console.log('Botón AFIP no encontrado en esta página');
55 return false;
56 }
57 } catch (error) {
58 console.error('Error al hacer clic en botón AFIP:', error);
59 return false;
60 }
61 }
62
63 // Función para manejar el login automático
64 async function handleAutoLogin() {
65 try {
66 console.log('Esperando formulario de login...');
67
68 // Esperar a que aparezca el campo de contraseña
69 await waitForElement('input[type="password"]', 15000);
70 console.log('Campo de contraseña encontrado');
71
72 // Esperar un poco para que Chrome cargue las sugerencias
73 await new Promise(resolve => setTimeout(resolve, 1000));
74
75 // Buscar el campo de contraseña
76 const passwordField = document.querySelector('input[type="password"]');
77
78 if (passwordField) {
79 console.log('Intentando usar contraseña autocompletada...');
80
81 // Simular clic en el campo para activar autocompletado
82 passwordField.click();
83 passwordField.focus();
84
85 // Esperar a que Chrome autocomplete
86 await new Promise(resolve => setTimeout(resolve, 1500));
87
88 // Buscar el botón de submit
89 const submitButton = document.querySelector('button[type="submit"], input[type="submit"], button[name="login"]');
90
91 if (submitButton) {
92 console.log('Botón de submit encontrado, enviando formulario...');
93 submitButton.click();
94 } else {
95 // Intentar enviar el formulario directamente
96 const form = passwordField.closest('form');
97 if (form) {
98 console.log('Enviando formulario directamente...');
99 form.submit();
100 }
101 }
102 }
103 } catch (error) {
104 console.error('Error en auto login:', error);
105 }
106 }
107
108 // Función para buscar y marcar expedientes con cambios
109 async function markRecentChanges() {
110 try {
111 console.log('Buscando sección de expedientes...');
112
113 // Esperar a que la página cargue completamente
114 await new Promise(resolve => setTimeout(resolve, 3000));
115
116 // Buscar el enlace o botón de "Ver" expedientes
117 const verExpedientesLink = document.querySelector('a[href*="expediente"], a:contains("Ver"), button:contains("Expediente")');
118
119 if (verExpedientesLink) {
120 console.log('Enlace de expedientes encontrado, haciendo clic...');
121 verExpedientesLink.click();
122
123 // Esperar a que cargue la lista de expedientes
124 await new Promise(resolve => setTimeout(resolve, 3000));
125
126 // Buscar elementos de expedientes (ajustar selector según la estructura real)
127 const expedientes = document.querySelectorAll('.expediente-item, tr[data-expediente], .lista-expedientes > div, tbody tr');
128
129 console.log(`Encontrados ${expedientes.length} expedientes`);
130
131 if (expedientes.length > 0) {
132 // Marcar los últimos 5
133 const cantidadAMarcar = Math.min(5, expedientes.length);
134
135 for (let i = 0; i < cantidadAMarcar; i++) {
136 const expediente = expedientes[i];
137
138 // Agregar estilo de marcado
139 expediente.style.backgroundColor = '#fff3cd';
140 expediente.style.borderLeft = '5px solid #ffc107';
141 expediente.style.fontWeight = 'bold';
142
143 // Agregar badge de "NUEVO"
144 const badge = document.createElement('span');
145 badge.textContent = '🔔 CAMBIO RECIENTE';
146 badge.style.cssText = `
147 background-color: #ffc107;
148 color: #000;
149 padding: 3px 8px;
150 border-radius: 3px;
151 font-size: 11px;
152 font-weight: bold;
153 margin-left: 10px;
154 `;
155
156 expediente.insertBefore(badge, expediente.firstChild);
157
158 console.log(`Expediente ${i + 1} marcado`);
159 }
160
161 console.log(`Se marcaron ${cantidadAMarcar} expedientes con cambios recientes`);
162 }
163 } else {
164 console.log('No se encontró el enlace de expedientes');
165 }
166 } catch (error) {
167 console.error('Error al marcar expedientes:', error);
168 }
169 }
170
171 // Función principal
172 async function init() {
173 const currentUrl = window.location.href;
174 console.log('URL actual:', currentUrl);
175
176 // Si estamos en la página principal, hacer clic en AFIP
177 if (currentUrl.includes('inicio-publico')) {
178 console.log('En página principal, buscando botón AFIP...');
179 await new Promise(resolve => setTimeout(resolve, 2000));
180 await clickAFIPButton();
181 }
182 // Si estamos en la página de autenticación
183 else if (currentUrl.includes('autenticar.gob.ar')) {
184 console.log('En página de autenticación, iniciando auto login...');
185 await handleAutoLogin();
186 }
187 // Si estamos en la página de trámites (después del login)
188 else if (currentUrl.includes('tramitesadistancia.gob.ar') && !currentUrl.includes('inicio-publico')) {
189 console.log('En página de trámites, buscando expedientes...');
190 await markRecentChanges();
191 }
192 }
193
194 // Ejecutar cuando el DOM esté listo
195 if (document.readyState === 'loading') {
196 document.addEventListener('DOMContentLoaded', init);
197 } else {
198 init();
199 }
200
201 console.log('Extension AFIP cargada y lista');
202})();