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

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

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

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

您需要先安裝使用者腳本管理器擴充功能,如 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
})();