Files
script/Portaledeltrasporto WORKING2- Full Automation v3.2.user.js
T
2026-05-12 21:05:35 +02:00

104 lines
4.0 KiB
JavaScript

// ==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);
})();