// ==UserScript== // @name 航天云课堂自动学习 // @namespace charles // @version 1.1 // @description 在页面中找到所有内容为"未完成"的元素,并按顺序每30分钟点击其最近的祖先
  • 元素(带悬浮窗启停按钮) // @author wuchao // @match https://train.casicloud.com/* // 替换为目标网站的URL // @connect train.casicloud.com // @include *://*.casicloud.com/* // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/480591/%E8%88%AA%E5%A4%A9%E4%BA%91%E8%AF%BE%E5%A0%82%E8%87%AA%E5%8A%A8%E5%AD%A6%E4%B9%A0.user.js // @updateURL https://update.greasyfork.icu/scripts/480591/%E8%88%AA%E5%A4%A9%E4%BA%91%E8%AF%BE%E5%A0%82%E8%87%AA%E5%8A%A8%E5%AD%A6%E4%B9%A0.meta.js // ==/UserScript== (function() { 'use strict'; // 定义点击间隔时间(25分钟) const clickInterval = 25 * 60 * 1000; // 获取所有class为"ms-train-state"且内容为"未完成"的元素 let unfinishedElements = Array.from(document.querySelectorAll('.ms-train-state')) .filter(element => element.textContent.includes('未完成')); // 定义当前点击索引 let currentIndex = 0; // 点击函数 function clickElement() { if(currentIndex==0){ unfinishedElements = Array.from(document.querySelectorAll('.ms-train-state')) .filter(element => element.textContent.includes('未完成')); } // 检查当前索引是否超出元素数量 if (currentIndex >= unfinishedElements.length) { // 所有元素都已点击完成,停止定时器 clearInterval(timer); console.log('所有元素点击完成'); return; } // 获取当前待点击的元素的兄弟节点中class为"title-row pointer"的子节点 const siblingNode = unfinishedElements[currentIndex].previousElementSibling.querySelector('.title-row.pointer'); siblingNode.click(); // 输出点击信息 console.log(`点击的元素:${siblingNode.textContent},当前点击第${currentIndex}个,剩余${unfinishedElements.length-currentIndex}个`); // 增加索引,准备点击下一个元素 currentIndex++; } // 切换开关状态 function toggleSwitch() { // 获取开关状态 let switchStatus = GM_getValue('switchStatus', false); let floatBtn=document.getElementById('as-floating-button'); const newSwitchStatus = !switchStatus; GM_setValue('switchStatus', newSwitchStatus); console.log(`脚本已${newSwitchStatus ? '启动' : '停止'}`); if (newSwitchStatus) { // 如果开关状态为启动,则立即执行点击函数 clickElement(); // 设置定时器,每30分钟执行一次点击函数 timer = setInterval(clickElement, clickInterval); } else { // 如果开关状态为停止,则清除定时器 clearInterval(timer); } floatBtn.textContent=newSwitchStatus ? '停止脚本' : '启动脚本'; } // 创建悬浮窗容器 const container = document.createElement('div'); container.className = 'floating-container'; // 创建启停按钮 let switchStatus = GM_getValue('switchStatus', false); const switchButton = document.createElement('button'); switchButton.textContent = switchStatus ? '停止脚本' : '启动脚本'; switchButton.className = 'floating-button'; switchButton.id = 'as-floating-button'; switchButton.addEventListener('click', toggleSwitch); container.appendChild(switchButton); // 添加悬浮窗容器到页面 document.body.appendChild(container); // 添加自定义CSS样式 GM_addStyle(` .floating-container { position: fixed; top: 20px; right: 20px; z-index: 9999; } .floating-button { padding: 10px; font-size: 16px; background-color: #fff; border: 1px solid #ccc; border-radius: 4px; } `); let timer; if (switchStatus) { // 如果开关状态为启动,则立即执行点击函数 clickElement(); // 设置定时器,每30分钟执行一次点击函数 timer = setInterval(clickElement, clickInterval); } })();