// ==UserScript== // @name U校园刷时长-强化版 // @namespace https://blog.1think2program.cn/ // @version 0.7 // @description 改编了《U校园刷时长》这个脚本(原作者貌似停止维护) // @author DaXue(原作者) - 盧瞳 // @ // @match https://ucontent.unipus.cn/_pc_default/pc.html?cid=* // @grant none // @license GPL-3.0 // @downloadURL https://update.greasyfork.icu/scripts/480178/U%E6%A0%A1%E5%9B%AD%E5%88%B7%E6%97%B6%E9%95%BF-%E5%BC%BA%E5%8C%96%E7%89%88.user.js // @updateURL https://update.greasyfork.icu/scripts/480178/U%E6%A0%A1%E5%9B%AD%E5%88%B7%E6%97%B6%E9%95%BF-%E5%BC%BA%E5%8C%96%E7%89%88.meta.js // ==/UserScript== var minTime = [8, 30]; //最短停留时间,默认是3分30秒 var maxTime = [15, 30]; //最大停留时间,默认为5分30秒 var unitInterval = [1, 5]; //循环的单元区间,默认为1-5单元 var maxTestTime = [10, 30]; //单元测试最短停留时间,默认是8分30秒 var minTestTime = [15, 30]; //单元测试最大停留时间,默认为10分30秒 var autojump = 1; //是否开启自动跳过非必修章节功能,0为关闭,1为开启 var feibixiuWaitTime = 15000; //跳过非必修等待的时间,单位毫秒 var jumpTimeOut = 0; //是否开启自动跳过已过截止时间的必修章节 var unitTestStay = 0; //是否单独设置单元测试的时间 var feibixiu = document.getElementsByClassName( "taskTipStyle--disrequired-1ZUIG" ); var bixiu = document.getElementsByClassName("taskTipStyle--required-23n0J"); let waitTime = realTime(minTime[0], minTime[1], maxTime[0], maxTime[1]); // 本次停留时间 let currentUnit = 0; // 当前单元 const timer = creatPanel(); function switch_next(selector, classFlag) { let flag = false; for (let [index, unit] of document.querySelectorAll(selector).entries()) { if (flag) { unit.click(); //防止必修弹窗失效,跳转便刷新页面,1000表示跳转1秒后刷新页面 setTimeout(() => { location.reload(); }, 1000); flag = false; break; } if (unit.classList.contains(classFlag)) { flag = true; } } } const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay)); function jumpToNextSection() { switch_next(".layoutHeaderStyle--circleTabsBox-jQdMo a", "selected"); switch_next("#header .TabsBox li", "active"); switch_next("#sidemenu li.group", "active"); } // 跳转到开头的第一单元 function jumpToFirstSection() { console.log("jumpToFirstSection,跳转到第一个单元"); let items = document.querySelectorAll("#sidemenu li.group"); for (let item of items) { if (getUnitNum(item.textContent) == unitInterval[0]) { item.click(); break; } } } if (autojump == 1) { setTimeout(async () => { if (feibixiu[0].innerText == "非必修") { // debugger; // 三十秒后切换,防止检测异常 waitTime = feibixiuWaitTime; await sleep(feibixiuWaitTime); jumpToNextSection(); } else if (bixiu[0].innerText == "必修") { return 0; } }, 3000); } // 自动跳过已过截止时间的必修章节 setTimeout(() => { try { var isTestTimeOut = document.getElementsByClassName( "taskTipStyle--warningheadertext-1ch9A" ); if ( isTestTimeOut[0].innerText == "学习截止时间已过,你可以继续学习,但本次提交得分不计入学习成绩" && jumpTimeOut == 1 ) { jumpToNextSection(); } } catch (a) { return 0; } }, 3000); //计算实际停留时间,防止每个页面停留时间相同 function realTime(minMinutes, minSeconds, maxMinutes, maxSeconds) { let rate = Math.random(); return ( (minMinutes * 60 + minSeconds + ((maxMinutes - minMinutes) * 60 + maxSeconds - minSeconds) * rate) * 1000 ); } //自动点击必修弹窗和麦克风弹窗 3000表示延迟3秒,因为弹窗有延迟,主要看反应速度。 setTimeout(() => { var x = document.getElementsByClassName("dialog-header-pc--close-yD7oN"); x[0].click(); document .querySelector("div.dialog-header-pc--dialog-header-2qsXD") .parentElement.querySelector("button") .click(); }, 3000); // 如果不是在单元区间内,跳转到第一个单元 setTimeout(() => { // 如果不是在单元区间内,跳转到第一个单元 let unitStr = document.querySelectorAll("#sidemenu li.group.active")[0] .textContent; currentUnit = getUnitNum(unitStr); if (currentUnit < unitInterval[0] || currentUnit > unitInterval[1]) { // 不在单元区间内,跳转到第一个单元 console.log("跳转到第一个单元"); let items = document.querySelectorAll("#sidemenu li.group"); for (let item of items) { if (getUnitNum(item.textContent) == unitInterval[0]) { console.log("找到第一个单元"); item.click(); break; } } } }, 3000); setTimeout(() => { try { // 单独设置单元测试的时间 var unitTest = document.getElementsByClassName( "utButtonStyle--toDoButton-1S89L" ); if (unitTestStay == 1 && unitTest[0].innerText == "开始做题") { setTimeout(() => { jumpToNextSection(); }, realTime(minTestTime[0], minTestTime[1], maxTestTime[0], maxTestTime[1])); } } catch (e) { setTimeout(() => { jumpToNextSection(); }, realTime(minTime[0], minTime[1], maxTime[0], maxTime[1])); } setInterval(() => { waitTime -= 1000; updatePanel(); }, 1000); setTimeout(() => { jumpToNextSection(); }, waitTime); }, 4000); function creatPanel() { let timerPanel = document.createElement("div"); timerPanel.id = "timerPanel"; timerPanel.innerHTML = `