Aggiunti file javascript
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
// ==UserScript==
|
||||
// @name Automazione DATI COC
|
||||
// @namespace http://tampermonkey.net/
|
||||
// @version 7.0
|
||||
// @description Polling 2.5s, Nessun refresh dopo upload, Dati persistenti in memoria
|
||||
// @match *://www.ilportaledellautomobilista.it/immatricolazioni/*
|
||||
// @grant GM_xmlhttpRequest
|
||||
// @grant GM_setValue
|
||||
// @grant GM_getValue
|
||||
// @grant GM_addStyle
|
||||
// @connect localhost
|
||||
// ==/UserScript==
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// --- CONFIGURAZIONE ---
|
||||
const SEARCH_URL = "https://www.ilportaledellautomobilista.it/immatricolazioni/certificatoConformitaDatiTecniciVE/Read_initAction.action?pageStatus=SEARCH";
|
||||
const LOCAL_GET_URL = "https://localhost/hook/dati4.php";
|
||||
const LOCAL_POST_URL = "https://localhost/hook/ans4.php";
|
||||
const POLLING_MS = 2500;
|
||||
|
||||
const clean = (val) => (val === "." || val === undefined || val === null) ? "" : val;
|
||||
|
||||
// --- STILE UI (Allineato a Destra) ---
|
||||
GM_addStyle(`
|
||||
#m-container { position: fixed; right: 3cm; top: 5cm; z-index: 9999; display: flex; flex-direction: column; gap: 10px; }
|
||||
.m-btn { padding: 12px 18px; border: none; border-radius: 5px; color: white; font-weight: bold; cursor: pointer; box-shadow: 2px 2px 5px rgba(0,0,0,0.3); font-family: sans-serif; min-width: 220px; }
|
||||
#btn-compila { background-color: #ffc107; color: #000; }
|
||||
#btn-upload { background-color: #dc3545; cursor: not-allowed; opacity: 0.6; }
|
||||
#btn-upload.active { background-color: #28a745; cursor: pointer; opacity: 1; }
|
||||
#status-info { background: white; padding: 5px; font-size: 10px; border: 1px solid #ccc; text-align: center; border-radius: 3px; }
|
||||
`);
|
||||
|
||||
// --- CREAZIONE MENU ---
|
||||
const container = document.createElement('div');
|
||||
container.id = 'm-container';
|
||||
|
||||
const infoBox = document.createElement('div');
|
||||
infoBox.id = 'status-info';
|
||||
infoBox.innerText = 'In attesa di dati...';
|
||||
|
||||
const btnCompila = document.createElement('button');
|
||||
btnCompila.className = 'm-btn';
|
||||
btnCompila.id = 'btn-compila';
|
||||
btnCompila.innerText = '1. CERCA VEICOLI';
|
||||
|
||||
const btnUpload = document.createElement('button');
|
||||
btnUpload.className = 'm-btn';
|
||||
btnUpload.id = 'btn-upload';
|
||||
btnUpload.innerText = '2. ATTESA TABELLA...';
|
||||
btnUpload.disabled = true;
|
||||
|
||||
container.appendChild(infoBox);
|
||||
container.appendChild(btnCompila);
|
||||
container.appendChild(btnUpload);
|
||||
document.body.appendChild(container);
|
||||
|
||||
// Aggiorna l'etichetta info se ci sono dati salvati
|
||||
const aggiornaInfoUI = () => {
|
||||
const d = GM_getValue("lastTaskData");
|
||||
if(d) infoBox.innerText = "Dati pronti: " + (d.valore1 || "Caricati");
|
||||
};
|
||||
aggiornaInfoUI();
|
||||
|
||||
// --- CONTROLLO TABELLA REAL-TIME ---
|
||||
setInterval(() => {
|
||||
const table = document.getElementById('listTable');
|
||||
const rows = table ? table.querySelectorAll('tbody tr') : [];
|
||||
if (table && rows.length > 0) {
|
||||
btnUpload.classList.add('active');
|
||||
btnUpload.disabled = false;
|
||||
btnUpload.innerText = '2. INVIA DATI (Pronto)';
|
||||
} else {
|
||||
btnUpload.classList.remove('active');
|
||||
btnUpload.disabled = true;
|
||||
btnUpload.innerText = '2. ATTESA TABELLA...';
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
// --- FUNZIONE POLLING ---
|
||||
function startPolling() {
|
||||
GM_xmlhttpRequest({
|
||||
method: "GET",
|
||||
url: LOCAL_GET_URL,
|
||||
nocache: true,
|
||||
onload: function(response) {
|
||||
try {
|
||||
const data = JSON.parse(response.responseText);
|
||||
if (data.tipo === "DATI-COC" && data.task === "fare") {
|
||||
console.log("Nuovo task ricevuto:", data);
|
||||
|
||||
// Salviamo i dati (sovrascrivendo i precedenti)
|
||||
GM_setValue("lastTaskData", data);
|
||||
aggiornaInfoUI();
|
||||
|
||||
// Comunichiamo al server che il task è stato preso in carico
|
||||
aggiornaStatoTask(data);
|
||||
|
||||
// Esecuzione automatica solo se siamo nella pagina corretta
|
||||
if (window.location.href.includes("pageStatus=SEARCH")) {
|
||||
eseguiAutomazione(data);
|
||||
} else {
|
||||
window.location.href = SEARCH_URL;
|
||||
}
|
||||
}
|
||||
} catch (e) { }
|
||||
setTimeout(startPolling, POLLING_MS);
|
||||
},
|
||||
onerror: () => setTimeout(startPolling, POLLING_MS)
|
||||
});
|
||||
}
|
||||
|
||||
function aggiornaStatoTask(originalData) {
|
||||
let updateData = {...originalData};
|
||||
updateData.task = "COMPLETATO";
|
||||
GM_xmlhttpRequest({
|
||||
method: "POST",
|
||||
url: LOCAL_GET_URL,
|
||||
headers: { "Content-Type": "application/json" },
|
||||
data: JSON.stringify(updateData)
|
||||
});
|
||||
}
|
||||
|
||||
function eseguiAutomazione(params) {
|
||||
const familyInput = document.querySelector('input[name*="VEFrom.descrizioneFamigliaVeicolo"]');
|
||||
if (familyInput) {
|
||||
const inputs = document.querySelectorAll('input');
|
||||
inputs.forEach(input => {
|
||||
if (input.name.includes("VEFrom.descrizioneFamigliaVeicolo")) input.value = clean(params.valore1);
|
||||
if (input.name.includes("VEFrom.descrizioneVarianteVeicolo")) input.value = clean(params.valore2);
|
||||
if (input.name.includes("VE.codiceOmologazioneEuropea")) input.value = clean(params.valore3);
|
||||
if (input.name.includes("VE.codiceMarchioVeicolo")) input.value = clean(params.valore4);
|
||||
if (input.name.includes("progressivoCostruttoreVeicolo")) input.value = clean(params.valore5);
|
||||
});
|
||||
|
||||
const btnSearch = document.getElementById('RicercaCertificatoConformitaDatiTecniciVE_button_value_searchElement');
|
||||
if (btnSearch) btnSearch.click();
|
||||
}
|
||||
}
|
||||
|
||||
function validaELeggiTabella() {
|
||||
const table = document.getElementById('listTable');
|
||||
if (!table) return;
|
||||
|
||||
const rows = table.querySelectorAll('tbody tr');
|
||||
let records = [];
|
||||
rows.forEach(row => {
|
||||
const cells = Array.from(row.querySelectorAll('td'))
|
||||
.filter(td => !td.querySelector('input[type="radio"]'))
|
||||
.map(td => td.innerText.trim());
|
||||
if (cells.length > 0) records.push(cells);
|
||||
});
|
||||
|
||||
GM_xmlhttpRequest({
|
||||
method: "POST",
|
||||
url: LOCAL_POST_URL,
|
||||
headers: { "Content-Type": "application/json" },
|
||||
data: JSON.stringify({ tabella_dati: records }),
|
||||
onload: function(response) {
|
||||
try {
|
||||
const res = JSON.parse(response.responseText);
|
||||
if (res.status === "ok") {
|
||||
// alert("INVIO RIUSCITO: " + res.messaggio);
|
||||
// NOTA: Non cancelliamo GM_setValue né ricarichiamo la pagina qui.
|
||||
} else {
|
||||
alert("ERRORE PHP: " + res.messaggio);
|
||||
}
|
||||
} catch (e) {
|
||||
alert("Dati inviati al server.");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
btnCompila.addEventListener('click', () => {
|
||||
const d = GM_getValue("lastTaskData");
|
||||
if(d) {
|
||||
eseguiAutomazione(d);
|
||||
} else {
|
||||
alert("Nessun dato in memoria. Attendi il caricamento automatico dal server.");
|
||||
}
|
||||
});
|
||||
|
||||
btnUpload.addEventListener('click', validaELeggiTabella);
|
||||
|
||||
startPolling();
|
||||
|
||||
})();
|
||||
Reference in New Issue
Block a user