// ==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);
}
})();