您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
空投 - 实时重定向到chat页面
// ==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(); } }); })();