// ==UserScript== // @name 篡改猴脚本 - 点击未完成元素的最近祖先
  • 元素(带开关) // @namespace your-namespace // @version 1.0 // @description 在页面中找到所有内容为"未完成"的元素,并按顺序每30分钟点击其最近的祖先
  • 元素(带手动启停开关) // @author Your Name // @match https://train.casicloud.com/* // 替换为目标网站的URL // @grant GM_setValue // @grant GM_getValue // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 定义点击间隔时间(30分钟) const clickInterval = 30 * 60 * 1000; // 获取所有内容为"未完成"的元素 const unfinishedElements = document.querySelectorAll(":contains('未完成')"); // 定义当前点击索引 let currentIndex = 0; // 获取开关状态 const switchStatus = GM_getValue('switchStatus', false); // 点击函数 function clickElement() { // 检查开关状态 if (!switchStatus) { console.log("脚本已停止"); return; } // 检查当前索引是否超出元素数量 if (currentIndex >= unfinishedElements.length) { // 所有元素都已点击完成,停止定时器 clearInterval(timer); console.log("所有元素点击完成"); return; } // 获取当前待点击的元素的最近祖先
  • 元素 const element = unfinishedElements[currentIndex].closest('li'); // 模拟点击事件 const clickEvent = new MouseEvent("click", { bubbles: true, cancelable: true, view: window }); element.dispatchEvent(clickEvent); // 输出点击信息 console.log(`点击元素的最近祖先
  • 元素:${element.textContent}`); // 增加索引,准备点击下一个元素 currentIndex++; } // 切换开关状态 function toggleSwitch() { const newSwitchStatus = !switchStatus; GM_setValue('switchStatus', newSwitchStatus); console.log(`脚本已${newSwitchStatus ? '启动' : '停止'}`); if (newSwitchStatus) { // 如果开关状态为启动,则立即执行点击函数 clickElement(); // 设置定时器,每30分钟执行一次点击函数 timer = setInterval(clickElement, clickInterval); } else { // 如果开关状态为停止,则清除定时器 clearInterval(timer); } } // 创建手动启停开关按钮 const switchButton = document.createElement('button'); switchButton.textContent = switchStatus ? '停止脚本' : '启动脚本'; switchButton.addEventListener('click', toggleSwitch); document.body.appendChild(switchButton); let timer; if (switchStatus) { // 如果开关状态为启动,则立即执行点击函数 clickElement(); // 设置定时器,每30分钟执行一次点击函数 timer = setInterval(clickElement, clickInterval); } })();