Greasy Fork is available in English.
继续教育公需科目专业科目辅助|自动答题|
当前为
// ==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
// ==/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分钟运行一次
})();