AContinuar - Sequência de cliques Ctrl+Alt+A

Simula hover, clica em botões e confirma no modal ao pressionar Ctrl+Alt+A.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         AContinuar - Sequência de cliques Ctrl+Alt+A
// @namespace    http://tampermonkey.net/
// @version      2.5
// @description  Simula hover, clica em botões e confirma no modal ao pressionar Ctrl+Alt+A.
// @author       Guilherme
// @match        *://*/*
// @grant        none
// @run-at       document-idle
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    /** 🔍 Busca elemento via XPath */
    function getElementByXpath(xpath) {
        return document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    }

    /** ⏳ Espera o elemento aparecer (até o tempo limite) */
    async function waitForElement(xpath, timeout = 5000) {
        const start = Date.now();
        while (Date.now() - start < timeout) {
            const el = getElementByXpath(xpath);
            if (el) return el;
            await new Promise(r => setTimeout(r, 200));
        }
        return null;
    }

    /** 🖱️ Simula um evento real de mouse */
    function simulateMouseEvent(element, eventType = 'click') {
        const event = new MouseEvent(eventType, {
            bubbles: true,
            cancelable: true,
            view: window
        });
        element.dispatchEvent(event);
    }

    /** 🧠 Aguarda um pequeno delay */
    const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

    /** 🏁 Sequência principal */
    async function executarSequencia() {
        try {
            console.log('🚀 Iniciando sequência de cliques...');

            // 🔹 1. Simula hover no botão de ações
            const botaoAcoesXPath = '//*[@id="infinite-scroller"]/section/main/section/div[1]/header/aside/button[2]';
            const botaoAcoes = await waitForElement(botaoAcoesXPath, 5000);
            if (!botaoAcoes) {
                console.warn('⚠️ Botão de ações não encontrado.');
                return;
            }

            simulateMouseEvent(botaoAcoes, 'mouseover');
            console.log('🖱️ Hover simulado no botão de ações.');

            // Aguarda menu abrir
            await sleep(800);

            // 🔹 2. Clica no botão "Continuar"
            const continuarXPath = '/html/body/div[3]/div/div/button[3]';
            const continuar = await waitForElement(continuarXPath, 5000);
            if (!continuar) {
                console.warn('⚠️ Botão "Continuar" não encontrado.');
                return;
            }

            simulateMouseEvent(continuar, 'mousedown');
            simulateMouseEvent(continuar, 'mouseup');
            simulateMouseEvent(continuar, 'click');
            console.log('✅ Botão "Continuar" clicado.');

            // Aguarda modal aparecer
            await sleep(1000);

            // 🔹 3. Clica no botão dentro do modal
            const modalBotaoXPath = '/html/body/div[4]/div/div[2]/div/div[1]/div/div[2]/button[2]';
            const modalBotao = await waitForElement(modalBotaoXPath, 5000);
            if (!modalBotao) {
                console.warn('⚠️ Botão dentro do modal não encontrado.');
                return;
            }

            simulateMouseEvent(modalBotao, 'mousedown');
            simulateMouseEvent(modalBotao, 'mouseup');
            simulateMouseEvent(modalBotao, 'click');
            console.log('🎯 Botão dentro do modal clicado com sucesso.');

        } catch (error) {
            console.error('❌ Erro na execução da sequência:', error);
        }
    }

    /** ⌨️ Atalho global Ctrl + Alt + A */
    window.addEventListener('keydown', function (event) {
        // ignora se estiver digitando num input
        if (['INPUT', 'TEXTAREA'].includes(document.activeElement.tagName)) return;

        if (event.ctrlKey && event.altKey && event.key.toLowerCase() === 'a') {
            event.preventDefault();
            console.log('⌨️ Atalho Ctrl+Alt+A detectado.');
            executarSequencia();
        }
    }, true); // <- “true” captura o evento antes que o site o consuma
})();