// ==UserScript== // @name Portaledeltrasporto WORKING2- Full Automation v3.2 // @namespace http://tampermonkey.net/ // @version 3.2 // @description Automazione completa con filtro duplicati e selettore classe documenti // @author Tu // @match *://www.ilportaledeltrasporto.it/nove/gestioneistanzanove/spa/* // @grant none // @run-at document-end // ==/UserScript== (function() { 'use strict'; const TELAIO = 'VF1RJB00675897644'; let downloadInCorso = false; function clickReactSafe(element) { if (!element) return; const opts = { bubbles: true, cancelable: true, view: window }; element.dispatchEvent(new MouseEvent('mousedown', opts)); element.dispatchEvent(new MouseEvent('mouseup', opts)); element.click(); } function setInputReactSafe(input, value) { const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set; input.focus(); setter.call(input, value); input.dispatchEvent(new Event('input', { bubbles: true })); input.dispatchEvent(new Event('change', { bubbles: true })); } function avviaDownloadDocumenti() { if (downloadInCorso) return; // Seleziona i bottoni con la classe specifica indicata const tuttiIBottoni = Array.from(document.querySelectorAll('button.DocumentsSection__file-btn')); if (tuttiIBottoni.length === 0) return; downloadInCorso = true; const titoliGiaVisti = new Set(); let delayDoc = 0; console.log(`[TM] Analisi documenti per classe DocumentsSection__file-btn...`); tuttiIBottoni.forEach((btn) => { // Risaliamo alla riga o al contenitore per leggere il testo descrittivo // Solitamente il testo รจ nel primo elemento della riga (td) o in un elemento precedente const riga = btn.closest('tr'); const titolo = riga ? riga.innerText.trim().split('\t')[0] : btn.innerText.trim(); if (!titoliGiaVisti.has(titolo)) { titoliGiaVisti.add(titolo); setTimeout(() => { console.log(`[TM] Scaricamento unico: ${titolo}`); clickReactSafe(btn); }, delayDoc); delayDoc += 2500; // 2.5 secondi tra un download e l'altro } else { console.log(`[TM] Salto duplicato: ${titolo}`); } }); } function eseguiAutomazione() { const url = window.location.href; // FASE 1: RICERCA if (url.includes('le-mie-istanze')) { const input = document.getElementById('numeroTelaio'); const btnCerca = Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('Cerca')); const btnTabella = document.querySelector('button.action-button-table'); if (input && input.value !== TELAIO) { setInputReactSafe(input, TELAIO); setTimeout(() => { if(btnCerca) clickReactSafe(btnCerca); }, 800); } if (btnTabella) setTimeout(() => clickReactSafe(btnTabella), 1200); } // FASE 2: PROCEDI if (url.includes('/abilitazione/') && !url.includes('dettaglio-istanza')) { const btnProcedi = Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === 'Procedi'); if (btnProcedi && !btnProcedi.disabled) setTimeout(() => clickReactSafe(btnProcedi), 1000); } // FASE 3: DOWNLOAD (Dettaglio) if (url.includes('dettaglio-istanza')) { // Verifichiamo che i bottoni siano effettivamente presenti nel DOM if (document.querySelector('button.DocumentsSection__file-btn')) { avviaDownloadDocumenti(); } } } const observer = new MutationObserver(() => eseguiAutomazione()); observer.observe(document.body, { childList: true, subtree: true }); setTimeout(eseguiAutomazione, 2000); })();