// ==UserScript== // @name 济南专业技术人员继续教育 // @namespace Violentmonkey Scripts // @match *://*.ghlearning.com/* // @match http://221.214.69.254:9091/* // @grant none // @version 0.1.5 // @author aliha // @description 继续教育公需科目专业科目辅助|自动答题| // @run-at document-end // @downloadURL none // ==/UserScript== (function() { // 延迟s秒 function delay(s) { return new Promise(resolve => setTimeout(resolve, s * 1000)); } // 检测答题元素,获取选项 function getItems() { if (document.querySelector(".pv-ask-modal")) { let qusCard = document.querySelector(".pv-ask-modal") let inputs = qusCard.querySelectorAll("input") return inputs } return null } // 生成数组所有的穷举组合并剔除空数组 function generateCombinations(arr) { const combinations = [ [] ]; // 遍历数组元素 for (let i = 0; i < arr.length; i++) { const currentLength = combinations.length; // 遍历当前已生成的组合 for (let j = 0; j < currentLength; j++) { const currentCombination = combinations[j]; // 生成新的组合,包含当前数组元素 const newCombination = currentCombination.concat(arr[i]); // 如果组合不为空,则将新组合添加到二维数组中 if (newCombination.length > 0) { combinations.push(newCombination); } } } // 剔除空数组 return combinations.filter(combination => combination.length > 1); } // 判断是否暂停 function isPuased() { var elements = document.getElementsByClassName("pv-icon-btn-play"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var computedStyle = window.getComputedStyle(element); if (computedStyle.getPropertyValue("display") === "block") { // 这是你要找的元素 // console.log(element); return true; } } } // 获取进度,自动播放 function getProcess() { let jindu = document.querySelector("#a span[du-html=sumschedule]"); // 获取总进度 if (jindu) { if (jindu.innerText === "100.00") { console.info("本课程已完成") } else { console.info("本课程未完成,继续播放") // 获取当前进度,如果播放完毕或者未开始,点击播放按钮开始播放,(因为系统播放完一节会自动切换下一节,所以光点击播放按钮就可以了,不用手动切换小节) let dangqian = document.querySelector(".videoLi.active"); let ispaused = isPuased(); if (dangqian.innerText.match(/[0-9]+%/)[0] == "100%" || dangqian.innerText.match(/[0-9]+%/)[0] == "0%" || ispaused) { const pauseBtn = document.querySelector('button[type="button"].pv-playpause.pv-iconfont.pv-icon-btn-play'); if (pauseBtn) { console.info("尝试点击播放按钮") pauseBtn.click(); } } } } } // 挨个尝试,检测到回答错误继续,检测到回答正确跳出,同时清空答案 async function answer(res_ls) { let flag = false; for (let i = res_ls.length - 1; i != 0; i--) { await delay(6) if (flag) { console.log("回答正确") break; } let inputs = getItems() console.log(`尝试第${res_ls.length - i}次作答`) console.log(res_ls[i]) for (let j = 0; j < res_ls[i].length; j++) { try { inputs[res_ls[i][j]].checked = true } catch (err) { flag = true; break } } // 提交答案,正确跳出循环,错误继续尝试 let button = document.querySelector('button.pv-ask-submit[data-type="pvSubmit"]'); await delay(1) if (button) { button.click() } } } // 主函数 async function main() { console.info("开始答题") await getProcess() // 自动答题 if (getItems()) { let inputs = getItems() const array = Array.from({ length: inputs.length }, (_, index) => index); let num = generateCombinations(array) await answer(num) console.info("答题脚本执行完毕") } else { console.info("未检测到答题卡,答题脚本执行完毕") } } setTimeout(main, 15000) ;// 15秒后执行一次先 setInterval(main, 180000); // 定时3分钟运行一次 })();