ASIWeb Auto Click Button

Adds a button to asiweb that clicks elements in sequence when enabled

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name         ASIWeb Auto Click Button
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Adds a button to asiweb that clicks elements in sequence when enabled
// @author       ils94
// @match        https://asiweb.tre-rn.jus.br/asi/*
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {
    'use strict';

    const clickPaths = [
        "/html/body/div[2]/form/div[3]/div/div/div[1]/ul[2]/li[1]/h3/a",
        "/html/body/div[2]/form/div[3]/div/div/div[1]/ul[2]/li[1]/div/ul[1]/li/div[2]/a",
        "/html/body/div[2]/div[3]/form/div[1]/div[2]/div[2]/p/span[1]/button",
        "/html/body/div[2]/div[3]/form/div[1]/div[2]/div[2]/div[3]/p/span[2]/button[1]",
        "/html/body/div[2]/div[3]/form/div[1]/div[2]/div[2]/p/span/button[1]"
    ];

    function findElementByXPath(doc, xpath) {
        let element = null;
        try {
            element = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        } catch (e) {
            console.log(`Error evaluating XPath ${xpath}:`, e);
        }
        if (!element) {
            const iframes = doc.getElementsByTagName('iframe');
            for (let iframe of iframes) {
                try {
                    const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
                    element = iframeDoc.evaluate(xpath, iframeDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
                    if (element) break;
                    element = findElementByXPath(iframeDoc, xpath);
                    if (element) break;
                } catch (e) {
                    console.log('Error accessing iframe:', iframe.src, e);
                }
            }
        }
        return element;
    }

    function simulateClick(element) {
        if (element) {
            try {
                element.click();
                element.dispatchEvent(new Event('click', {
                    bubbles: true
                }));
                console.log(`Clicked element:`, element);
                return true;
            } catch (e) {
                console.log(`Error clicking element:`, e);
                return false;
            }
        }
        return false;
    }

    function performClickForStep(step) {
        const xpath = clickPaths[step];
        if (!xpath) {
            console.log('No more steps to execute.');
            GM_setValue('clickStep', 0);
            GM_setValue('clickEnabled', false); // Desativa após último passo
            return false;
        }

        const element = findElementByXPath(document, xpath);
        console.log(`Attempting step ${step} at XPath ${xpath}:`, element);

        if (element) {
            if (simulateClick(element)) {
                const nextStep = step + 1;
                GM_setValue('clickStep', nextStep);
                console.log(`Step ${step} done. Advancing to step ${nextStep}`);
                if (nextStep >= clickPaths.length) {
                    console.log('Last step reached. Disabling auto-click.');
                    GM_setValue('clickEnabled', false); // Desativa após último passo
                }
                return true;
            }
        } else {
            console.log(`Element not found for XPath ${xpath}. Will retry.`);
        }
        return false;
    }

    function addCustomButton() {
        const button = document.createElement('button');
        button.textContent = 'Relação para o DB'
        button.style.position = 'fixed';
        button.style.top = '10px';
        button.style.right = '10px';
        button.style.zIndex = '9999';
        button.style.padding = '10px 20px';
        button.style.backgroundColor = '#4CAF50';
        button.style.color = 'white';
        button.style.border = 'none';
        button.style.borderRadius = '5px';
        button.style.cursor = 'pointer';
        button.style.fontSize = '16px';

        button.onclick = function() {
            console.log('Botão ativado. Iniciando sequência...');
            GM_setValue('clickStep', 0);
            GM_setValue('clickEnabled', true);
            retryActions();
        };

        document.body.appendChild(button);
        console.log('Botão personalizado adicionado à página.');
    }

    function retryActions() {
        if (!GM_getValue('clickEnabled', false)) {
            return;
        }

        let attempts = 0;
        const maxAttempts = 60;

        const interval = setInterval(function() {
            if (attempts >= maxAttempts) {
                console.log('Número máximo de tentativas atingido.');
                clearInterval(interval);
                return;
            }

            if (!GM_getValue('clickEnabled', false)) {
                clearInterval(interval);
                return;
            }

            const currentStep = GM_getValue('clickStep', 0);
            if (currentStep >= clickPaths.length) {
                console.log('Todos os passos concluídos.');
                GM_setValue('clickStep', 0);
                GM_setValue('clickEnabled', false);
                clearInterval(interval);
                return;
            }

            if (performClickForStep(currentStep)) {
                clearInterval(interval);
            }

            attempts++;
        }, 500);
    }

    // MutationObserver para reagir a mudanças no DOM
    const observer = new MutationObserver(function() {
        if (GM_getValue('clickEnabled', false)) {
            retryActions();
        }
    });

    observer.observe(document, {
        childList: true,
        subtree: true
    });

    // Adiciona o botão na inicialização
    window.addEventListener('load', () => {
        addCustomButton();
    });
})();