// ==UserScript== // @name 强国学习 // @namespace 雪导. // @version 2.1.1 // @description 问题反馈位置: https://github.com/TechXueXi/techxuexi-js/issues 。 强国学习自动答题,目前实现 每日答题,每周答题,专项答题(操作方法更新为:打开答题页面后,手动刷新下自动开启) // @author 雪导、天幽 // @require https://greasyfork.org/scripts/423313-utils%E7%8E%AF%E5%A2%83/code/Utils%E7%8E%AF%E5%A2%83.js?version=911306 // @require http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js // @match https://www.xuexi.cn // @match https://www.xuexi.cn/* // @match https://pc.xuexi.cn/points/exam-practice.html* // @match https://pc.xuexi.cn/points/exam-weekly-detail.html* // @match https://pc.xuexi.cn/points/exam-paper-detail.html* // @match https://pc.xuexi.cn/points/my-study.html* // @match https://pc.xuexi.cn/points/exam-index.html* // @match https://pc-api.xuexi.cn/open/api/score/today/queryrate // @grant none // ==/UserScript== window.onload = async function () { const $X = new Utils("学习强国"); //移除顶部 const header = document.querySelector("#app > div > div.layout-header"); if (header != null) { header.parentNode.removeChild(header); console.log("移除header乱七八糟的dom"); } //移除底部 const footer = document.querySelector("#app > div > div.layout-footer"); if (footer != null) { footer.parentNode.removeChild(footer); console.log("移除footer乱七八糟的dom"); } // 创建问题反馈 const startQuestionBtn = () => { var div = document.createElement("div"); div.innerHTML = "问题反馈"; //为div创建属性class = "test" var divattr = document.createAttribute("class"); divattr.value = "question-btn"; //把属性class = "test"添加到div div.setAttributeNode(divattr); //为div添加样式 var style = document.createAttribute("style"); div.setAttributeNode(style); div.style.backgroundColor = "green"; div.style.color = "#fff"; div.style.textAlign = "center"; div.style.width = "80px"; div.style.borderColor = "#000"; div.style.marginLeft = "0%"; div.style.marginTop = "1%"; document.querySelector(".ant-breadcrumb").appendChild(div); $(".question-btn").click(() => { window.open("https://gitee.com/qq34347476/tampermonkey/issues"); }); }; // 创建每日答题 const startDayBtn = () => { var div = document.createElement("div"); div.innerHTML = "每日答题"; //为div创建属性class = "test" var divattr = document.createAttribute("class"); divattr.value = "start-btn"; //把属性class = "test"添加到div div.setAttributeNode(divattr); //为div添加样式 var style = document.createAttribute("style"); div.setAttributeNode(style); div.style.backgroundColor = "#F00"; div.style.color = "#fff"; div.style.textAlign = "center"; div.style.width = "80px"; div.style.borderColor = "#000"; div.style.marginLeft = "0%"; div.style.marginTop = "1%"; document.querySelector(".ant-breadcrumb").appendChild(div); $(".start-btn").click(() => { window.open("https://pc.xuexi.cn/points/exam-practice.html"); }); }; // 创建专项答题 const startExamBtn = () => { var div = document.createElement("div"); div.innerHTML = "专项答题"; //为div创建属性class = "test" var divattr = document.createAttribute("class"); divattr.value = "start-btn3"; //把属性class = "test"添加到div div.setAttributeNode(divattr); //为div添加样式 var style = document.createAttribute("style"); div.setAttributeNode(style); div.style.backgroundColor = "#F00"; div.style.color = "#fff"; div.style.textAlign = "center"; div.style.width = "80px"; div.style.borderColor = "#000"; div.style.marginLeft = "0%"; div.style.marginTop = "1%"; document.querySelector(".ant-breadcrumb").appendChild(div); $(".start-btn3").click(() => { window.open("https://pc.xuexi.cn/points/exam-paper-list.html"); }); }; // 创建每周答题 const startWeekBtn = () => { var div = document.createElement("div"); div.innerHTML = "每周答题"; //为div创建属性class = "test" var divattr = document.createAttribute("class"); divattr.value = "start-btn2"; //把属性class = "test"添加到div div.setAttributeNode(divattr); //为div添加样式 var style = document.createAttribute("style"); div.setAttributeNode(style); div.style.backgroundColor = "#F00"; div.style.color = "#fff"; div.style.textAlign = "center"; div.style.width = "80px"; div.style.borderColor = "#000"; div.style.marginLeft = "0%"; div.style.marginTop = "1%"; document.querySelector(".ant-breadcrumb").appendChild(div); $(".start-btn2").click(() => { window.open("https://pc.xuexi.cn/points/exam-weekly-list.html"); }); }; const getBtnDom = async () => { return new Promise((resolve) => { setTimeout(() => { let nextAll = document.querySelectorAll(".ant-btn"); let next = nextAll[0]; if (nextAll.length == 2) { //俩按钮,说明有个按钮是交卷。 next = nextAll[1]; } console.log("btn按钮状态", next); resolve(next); }, 2000); }); }; const doit = async () => { console.log("===========开始答题==========="); console.log("延时500ms"); await $X.wait(500); const next = await getBtnDom(); console.log("next", next); if (next.disabled) { document.querySelector(".tips").click(); console.log("延时500ms"); await $X.wait(500); if ( document.querySelector(".ant-popover-inner-content").textContent === "请观看视频" ) { console.log("需要观看视频"); alert("请手动作答"); // window.location.reload() return; } //所有提示 let allTips = document.querySelectorAll("font[color=red]"); //单选多选时候的按钮 let buttons = document.querySelectorAll(".q-answer"); //填空时候的那个textbox,这里假设只有一个填空 let textboxs = document.querySelectorAll("input"); //问题类型 let qType = document.querySelector(".q-header").textContent; console.log("问题类型qType", qType); qType = qType.substr(0, 3); switch (qType) { case "填空题": //第几个填空 let mevent = new Event("input", { bubbles: true }); if (textboxs.length > 1) { //若不止是一个空 //填空数量和提示数量是否一致 if (allTips.length == textboxs.length) { for ( let i = 0; i < allTips.length; i++ //数量一致,则一一对应。 ) { let tip = allTips[i]; let tipText = tip.textContent; if (tipText.length > 0) { //通过设置属性,然后立即让他冒泡这个input事件. //否则1,setattr后,内容消失. //否则2,element.value=124后,属性值value不会改变,所以冒泡也不管用. textboxs[i].setAttribute("value", tipText); textboxs[i].dispatchEvent(mevent); } } } else { //若填空数量和提示数量不一致,那么,应该都是提示数量多。 if (allTips.length > textboxs.length) { let lineFeed = document.querySelector(".line-feed").textContent; //这个是提示的所有内容,不仅包含红色答案部分。 let n = 0; //计数,第几个tip。 for ( let j = 0; j < textboxs.length; j++ //多个填空 ) { let tipText = allTips[n].textContent; let nextTipText = ""; do { tipText += nextTipText; if (n < textboxs.length - 1) { n++; nextTipText = allTips[n].textContent; } else { nextTipText = "结束了,没有了。"; } } while (lineFeed.indexOf(tipText + nextTipText)); textboxs[j].setAttribute("value", tipText); textboxs[j].dispatchEvent(mevent); } } else { //提示数量少于填空数量,则我无法分析, 回头研究,暂时放弃作答,刷新题库浏览器 // location.reload() } return doit(); } } else if (textboxs.length == 1) { //只有一个空,直接把所有tips合并。 let tipText = ""; for (let i = 0; i < allTips.length; i++) { tipText += allTips[i].textContent; } textboxs[0].setAttribute("value", tipText); textboxs[0].dispatchEvent(mevent); await $X.wait(500); // return doit() } else { //怕有没空白的情况。 看视频。。 console.log("填空题,看视频?"); window.location.href = "http://www.baidu.com"; } return doit(); case "多选题": //循环选项列表。用来点击 for (let js = 0; js < buttons.length; js++) { let cButton = buttons[js]; for ( let i = 0; i < allTips.length; i++ //循环提示列表。 ) { let tip = allTips[i]; let tipText = tip.textContent; if (tipText.length > 0) { //提示内容长度大于0 let cButtonText = cButton.textContent; //选项按钮的内容 console.log("cButtonText", cButtonText); console.log("tipText", tipText); //循环对比点击 if ( cButtonText.indexOf(tipText) > -1 || tipText.indexOf(cButtonText) > -1 ) { cButton.click(); } } } } return doit(); case "单选题": //单选,所以所有的提示,其实是同一个。有时候,对方提示会分成多个部分。 //case 块里不能直接用let。所以增加了个if。 if (true) { //把红色提示组合为一条 let tipText = ""; for (let i = 0; i < allTips.length; i++) { tipText += allTips[i].textContent; } if (tipText.length > 0) { //循环对比后点击 答案是否包含正确答案 for (let js = 0; js < buttons.length; js++) { let cButton = buttons[js]; let cButtonText = cButton.textContent; //通过判断是否相互包含,来确认是不是此选项 if ( cButtonText.indexOf(tipText) > -1 || tipText.indexOf(cButtonText) > -1 ) { console.log("延时500选择"); await $X.wait(500); cButton.click(); await $X.wait(500); console.log("下一步"); return doit(); } } // 循环对比答案,若不纯在包含答案 则走 这套比对答案逻辑 console.log("循环比对答案 【相似度】"); let xiangsidu = []; // 相似度 let max_xiangsidu = 0; let index = 0; for (let js = 0; js < buttons.length; js++) { let cButton = buttons[js]; let cButtonText = cButton.textContent; //通过判断是否相互包含,来确认是不是此选项 xiangsidu.push($X.strSimilarity2Percent(tipText, cButtonText)); } max_xiangsidu = $X.getMaxNumOfArr(xiangsidu); index = xiangsidu.findIndex((item) => item === max_xiangsidu); console.log(`几个答案相似度【$X{max_xiangsidu}】`); console.log(`找最相似的答案【$X{index}】`); buttons[index].click(); await $X.wait(500); document.querySelector(".ant-btn").click(); await $X.wait(500); return doit(); } } break; default: break; } } else { // 可以点击 if ( next.textContent != "再练一次" && next.textContent != "再来一组" && next.textContent != "查看解析" ) { next.click(); await $X.wait(500); doit(); } else { // 结束 console.log("答题结束"); $X.done(); } } }; startQuestionBtn(); startDayBtn(); startWeekBtn(); startExamBtn(); let btn = document.querySelector(".ant-btn"); if (btn) { if (btn.textContent === "确 定" || btn.textContent === "下一题") { await $X.wait(500); doit(); } else { location.reload(); } } };