AFIP Auto Login y Marcador de Expedientes

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})();
AFIP Auto Login y Marcador de Expedientes | Robomonkey