gaianet

空投 - 实时重定向到chat页面

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         gaianet
// @namespace    http://tampermonkey.net/
// @version      1.6
// @description  空投 - 实时重定向到chat页面
// @author       开启数字空投财富的发掘之旅
// @match        https://www.gaianet.ai/*
// ==/UserScript==

(function() {
    const targetUrl = 'https://www.gaianet.ai/chat';

    // 日志函数
    function log(message) {
        console.log(`[GaiaNet Chat AutoClicker] ${message}`);
    }

    // 实时监测 URL 变化并重定向
    function checkAndRedirect() {
        if (window.location.hostname === 'www.gaianet.ai') {
            if (window.location.href !== targetUrl) {
                log(`当前页面不是目标页面,正在重定向到: ${targetUrl}`);
                window.location.href = targetUrl;
                return false;
            }
            return true;
        } else {
            log('不在 www.gaianet.ai 域名下,脚本停止执行');
            return false;
        }
    }

    // 使用 MutationObserver 实时监测页面变化
    function setupUrlWatcher() {
        let lastUrl = window.location.href;

        // 检查 History API 变化
        window.addEventListener('popstate', () => {
            if (!checkAndRedirect()) {
                return;
            }
        });

        // 监测页面 DOM 变化,可能包含 SPA 路由变化
        const observer = new MutationObserver(() => {
            if (window.location.href !== lastUrl) {
                lastUrl = window.location.href;
                if (!checkAndRedirect()) {
                    return;
                }
            }
        });

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

        // 初始检查
        checkAndRedirect();
    }

    // 以下是原有的工具函数,未作改动
    function getElementByXPath(path) {
        try {
            const element = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
            return element;
        } catch (error) {
            log(`[调试] XPath错误: ${path} - ${error.message}`);
            return null;
        }
    }

    function isElementClickable(element) {
        if (!element) {
            log('[调试] 元素不存在');
            return false;
        }
        try {
            const style = window.getComputedStyle(element);
            const clickable = style.display !== 'none' &&
                            style.visibility !== 'hidden' &&
                            style.opacity !== '0' &&
                            !element.disabled;
            log('[调试] 元素样式 - display:', style.display || '未知',
                'visibility:', style.visibility || '未知',
                'opacity:', style.opacity || '未知',
                'disabled:', element.disabled || '未知');
            log('[调试] 元素可点击:', clickable);
            return clickable;
        } catch (error) {
            log('[调试] 检查元素可点击性时出错:', error.message);
            return false;
        }
    }

    async function getRandomElementFromXPathRange(basePath, startIdx, endIdx, timeout = 30000) {
        const maxAttempts = 3;
        for (let attempt = 0; attempt < maxAttempts; attempt++) {
            const index = Math.floor(Math.random() * (endIdx - startIdx + 1)) + startIdx;
            const path = basePath.replace(/\[1~[0-9]+\]$/, `[${index}]`);
            log(`[调试] 尝试 ${attempt + 1}/${maxAttempts} - 选择元素,XPath: ${path}`);
            const startTime = Date.now();
            while (Date.now() - startTime < timeout) {
                const element = getElementByXPath(path);
                if (element && isElementClickable(element)) {
                    log(`[调试] 找到可点击元素,XPath: ${path}`);
                    return element;
                }
                await sleep(500);
            }
            log(`[调试] 未找到可点击元素,XPath: ${path}`);
        }
        return null;
    }

    async function waitForElementWithText(identifier, text = '', isXPath = false, timeout = 30000, infiniteWait = false) {
        log(`[调试] 等待元素: ${identifier}${text ? ` 包含文本 "${text}"` : ''}${infiniteWait ? '(无限等待)' : ''}`);
        const startTime = Date.now();
        while (infiniteWait || (Date.now() - startTime < timeout)) {
            let element = isXPath ? getElementByXPath(identifier) : document.querySelector(identifier);
            if (element && isElementClickable(element)) {
                const elementText = element.textContent.trim().toUpperCase();
                if (!text || elementText === text.toUpperCase()) {
                    log('[调试] 元素已找到:', element.outerHTML);
                    return element;
                }
            }
            await sleep(500);
        }
        log('[调试] 等待超时,未找到匹配文本的可点击元素');
        return null;
    }

    function simulateClick(element) {
        try {
            const event = new MouseEvent('click', {
                bubbles: true,
                cancelable: true,
                view: window
            });
            element.dispatchEvent(event);
            log('[调试] 已模拟点击事件');
            return true;
        } catch (error) {
            log('[调试] 模拟点击失败:', error.message);
            return false;
        }
    }

    function getRandomDelay() {
        return Math.floor(Math.random() * (3000 - 1000 + 1)) + 1000;
    }

    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    // 实时监测元素0并点击,统计点击次数,添加超时恢复
    let element0ClickCount = 0;
    let pauseMainLoop = false;
    async function monitorElement0() {
        const element0XPath = '/html/body/div[2]/div[3]/div/div[2]/div/button';
        log('[Element0] 开始实时监测元素0');
        while (true) {
            const element0 = getElementByXPath(element0XPath);
            if (element0 && isElementClickable(element0)) {
                element0.click();
                element0ClickCount++;
                log(`[Element0] 元素0已点击,第 ${element0ClickCount} 次:`, element0.outerHTML);

                if (element0ClickCount > 20) {
                    log('[Element0] 点击次数超过20次,暂停主循环并执行额外点击');
                    pauseMainLoop = true;

                    const timeoutPromise = new Promise(resolve => setTimeout(() => {
                        log('[Element0] 额外点击超时(10秒),强制恢复主循环');
                        pauseMainLoop = false;
                        element0ClickCount = 0;
                        resolve(false);
                    }, 10000));

                    const extraClickPromise = (async () => {
                        const extraElement1 = await waitForElementWithText('#nav > div.hidden.lg\\:flex.flex-1.flex-crossCenter.justify-end.wow.animate__.animate__fadeIn > div.flex-crossCenter.gap-6.xl\\:gap-8 > a:nth-child(4)', '', false, 5000);
                        if (extraElement1) {
                            extraElement1.click();
                            log('[Element0] 额外元素1已点击:', extraElement1.outerHTML);
                        }
                        await sleep(getRandomDelay());

                        const extraElement2 = await waitForElementWithText('#nav > div.hidden.lg\\:flex.flex-1.flex-crossCenter.justify-end.wow.animate__.animate__fadeIn.animated > div.flex-crossCenter.gap-6.xl\\:gap-8 > a:nth-child(6)', '', false, 5000);
                        if (extraElement2) {
                            extraElement2.click();
                            log('[Element0] 额外元素2已点击:', extraElement2.outerHTML);
                        }

                        element0ClickCount = 0;
                        pauseMainLoop = false;
                        log('[Element0] 额外点击完成,恢复主循环');
                        return true;
                    })();

                    await Promise.race([extraClickPromise, timeoutPromise]);
                }
                await sleep(1000);
            }
            await sleep(500);
        }
    }

    let shouldJumpToNextCycle = false;
    function startElementCheck() {
        setInterval(async () => {
            try {
                const checkElementSelector = '#__next > div > div > div.gaia-container.pt-12.md\\:pt-20.pb-\\[96px\\].md\\:pb-\\[150px\\] > div > div.flex-1 > div.MuiTableContainer-root.min-h-\\[380px\\].overflow-auto.hiddenScrollBar.css-kge0eu > table > thead > tr > th:nth-child(3)';
                const checkElement = document.querySelector(checkElementSelector);
                if (checkElement) {
                    log('[ElementCheck] 检测到特定元素:', checkElement.outerHTML);
                    const extraElement2 = await waitForElementWithText('#nav > div.hidden.lg\\:flex.flex-1.flex-crossCenter.justify-end.wow.animate__.animate__fadeIn.animated > div.flex-crossCenter.gap-6.xl\\:gap-8 > a:nth-child(6)', '', false, 5000);
                    if (extraElement2) {
                        extraElement2.click();
                        log('[ElementCheck] 额外元素2已点击,准备跳到下次循环:', extraElement2.outerHTML);
                        shouldJumpToNextCycle = true;
                    }
                }
            } catch (error) {
                log('[ElementCheck] 检测特定元素时出错:', error.message);
            }
        }, 20000);
    }

    async function performClickSequence(cycle) {
        log(`[Cycle ${cycle}/300] 开始执行`);

        while (pauseMainLoop) {
            log(`[Cycle ${cycle}/300] 主循环已暂停,等待恢复`);
            await sleep(1000);
        }

        const element1XPath = '//*[@id="__next"]/div/div/div[2]/div[3]/div/div/div/div[1]/div/div[2]';
        const element1 = await waitForElementWithText(element1XPath, '', true);
        if (element1) {
            element1.click();
            log('元素1已点击');
        } else {
            log('未找到元素1或不可点击,跳过此循环');
            return false;
        }
        await sleep(getRandomDelay());

        const element2BaseXPath = '/html/body/div[2]/div[3]/div/div/div[3]/div[2]/div/div/div[1~32]';
        const element2Initial = await waitForElementWithText(element2BaseXPath.replace(/\[1~32\]$/, '[1]'), '', true, 30000, true);
        if (element2Initial) {
            const randomElement2 = await getRandomElementFromXPathRange(element2BaseXPath, 1, 32, 30000);
            if (randomElement2) {
                randomElement2.click();
                log('随机选择的元素2已点击:', randomElement2.outerHTML);
            } else {
                log('未找到可点击的随机元素2,跳过此循环');
                return false;
            }
        } else {
            log('未找到元素2基础实例,跳过此循环');
            return false;
        }
        await sleep(getRandomDelay());

        const element3XPath = '//*[@id="__next"]/div/div/div[2]/div[3]/div/div/div/div[2]/div/button';
        const element3 = await waitForElementWithText(element3XPath, '', true, 5000);
        if (element3) {
            element3.click();
            log('元素3已点击');
        } else {
            log('未找到元素3或5秒内不可点击,继续下一步');
        }
        await sleep(getRandomDelay());

        const element4BaseXPath = '//*[@id="__next"]/div/div/div[2]/div[3]/div/div/div/div[2]/div/div[1]/div/div[1~4]';
        const element4 = await getRandomElementFromXPathRange(element4BaseXPath, 1, 4, 5000);
        if (element4) {
            if (isElementClickable(element4)) {
                element4.click();
                log('随机选择的元素4已点击:', element4.outerHTML);
            } else {
                log('元素4不可点击,跳过此循环');
                return false;
            }
        } else {
            log('未找到元素4或5秒内不可点击,执行元素6和7后跳到下个循环');
            const element6XPath = '//*[@id="__next"]/div/div/div[2]/div[1]/div/div[3]/button[1]';
            const element6 = await waitForElementWithText(element6XPath, '', true);
            if (element6) {
                element6.click();
                log('元素6已点击(元素4超时回退)');
            }
            await sleep(getRandomDelay());

            const element7Selector = 'svg.tabler-icon.tabler-icon-check';
            const element7 = await waitForElementWithText(element7Selector, '');
            if (element7) {
                simulateClick(element7);
                log('元素7已点击(元素4超时回退):', element7.outerHTML);
            }
            return false;
        }
        await sleep(getRandomDelay());

        const element5Selector = 'button.absolute.min-w-\\[94px\\].h-10.bg-primaryOnyx.rounded-\\[8px\\]';
        const element5 = await waitForElementWithText(element5Selector, 'SEND', false, 60000);
        if (element5) {
            log('元素5已出现且文本为"SEND"');
        } else {
            log('1分钟内未出现文本为"SEND"的元素5,尝试点击文本为"STOP"的元素');
            const element5Stop = await waitForElementWithText(element5Selector, 'STOP', false, 5000);
            if (element5Stop) {
                element5Stop.click();
                log('元素5(文本为"STOP")已点击(超时回退)');
            }
        }
        await sleep(getRandomDelay());

        const element6XPath = '//*[@id="__next"]/div/div/div[2]/div[1]/div/div[3]/button[1]';
        const element6 = await waitForElementWithText(element6XPath, '', true);
        if (element6) {
            element6.click();
            log('元素6已点击');
        } else {
            log('未找到元素6或不可点击,跳过此循环');
            return false;
        }
        await sleep(getRandomDelay());

        const element7Selector = 'svg.tabler-icon.tabler-icon-check';
        const element7 = await waitForElementWithText(element7Selector, '');
        if (element7) {
            simulateClick(element7);
            log('元素7已点击:', element7.outerHTML);
        } else {
            log('未找到元素7或不可点击,跳过此循环');
            return false;
        }

        log(`[Cycle ${cycle}/300] 完成`);
        return true;
    }

    // 主流程
    async function mainFlow() {
        log('脚本开始执行 - 当前页面: https://www.gaianet.ai/chat');
        const maxCycles = 300;

        setTimeout(monitorElement0, 0);
        startElementCheck();

        for (let cycle = 1; cycle <= maxCycles; cycle++) {
            try {
                const success = await performClickSequence(cycle);
                if (!success) {
                    log(`循环 ${cycle} 未完成,继续下一个循环`);
                }
                if (shouldJumpToNextCycle) {
                    log(`[Cycle ${cycle}/300] 因额外元素2点击,跳到下次循环`);
                    shouldJumpToNextCycle = false;
                    continue;
                }
                if (cycle < maxCycles) {
                    log('等待3秒后开始下一次循环');
                    await sleep(3000);
                }
            } catch (error) {
                log(`循环 ${cycle} 执行过程中发生错误: ${error.message}`);
            }
        }
    }

    // 页面加载后启动
    window.addEventListener('load', async function() {
        setupUrlWatcher(); // 启动实时监测
        if (window.location.href === targetUrl) {
            log('页面加载完成,位于目标页面,启动主流程');
            await sleep(2000);
            mainFlow();
        }
    });
})();