在您安装前,Greasy Fork 希望您知道此脚本声明其包含了一些负面功能。这些功能也许会使脚本作者获利,而不能给您带来任何直接的金钱收益。
您只有在付费后才能使用脚本的全部功能。Greasy Fork 未参与到支付的流程,因此无法验证您是否获得了有价值的东西,亦无法帮助您申请退款。
脚本作者的说明:
解锁付费题库需捐助
Greasy Fork is available in English.
支持【超星学习通】【智慧树】【职教云系列】【雨课堂】【168网校】【继续教育类】【小鹅通】【安徽继续教育】 【上海开放大学】 【华侨大学自考网络助学平台】【人卫慕课】【国家开放大学】【浙江省高等学校在线开放课程共享平台】【国地质大学远程与继续教育学院】【浙江省高等教育自学考试网络助学平台】 【湖南高等学历继续教育】 【优学院】 【学起Plus】【青书学堂】 【学堂在线】【英华学堂】【广开网络教学平台】等平台的测验考试,内置题库,自动答题功能全聚合。
当前为
// ==UserScript== // @name 【万能】全平台自动答题脚本 // @version 4.8.3.1 // @namespace 自动答题 // @description 支持【超星学习通】【智慧树】【职教云系列】【雨课堂】【168网校】【继续教育类】【小鹅通】【安徽继续教育】 【上海开放大学】 【华侨大学自考网络助学平台】【人卫慕课】【国家开放大学】【浙江省高等学校在线开放课程共享平台】【国地质大学远程与继续教育学院】【浙江省高等教育自学考试网络助学平台】 【湖南高等学历继续教育】 【优学院】 【学起Plus】【青书学堂】 【学堂在线】【英华学堂】【广开网络教学平台】等平台的测验考试,内置题库,自动答题功能全聚合。 // @author 万能 // @match *://*/* // @compatible chrome firefox edge // @grant GM_info // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_getResourceText // @grant GM_setValue // @grant GM_getValue // @grant GM_getResourceURL // @run-at document-end // @connect yuketang.cn // @connect ykt.io // @connect localhost // @connect app.itihey.com // @connect appwk.baidu.com // @connect cx.icodef.com // @connect gk.xiguashuwang.com // @resource Img http://lyck6.cn/img/6.png // @resource Vue http://lib.baomitu.com/vue/2.6.0/vue.min.js // @resource ElementUi http://lib.baomitu.com/element-ui/2.15.13/index.js // @resource ElementUiCss http://cdn.lyck6.cn/element-ui/2.14.1/theme-chalk/index.min.css // @resource Table https://www.forestpolice.org/ttf/2.0/table.json // @require https://lib.baomitu.com/axios/0.27.2/axios.min.js // @require https://cdn.jsdelivr.net/gh/photopea/Typr.js@15aa12ffa6cf39e8788562ea4af65b42317375fb/src/Typr.min.js // @require https://cdn.jsdelivr.net/gh/photopea/Typr.js@f4fcdeb8014edc75ab7296bd85ac9cde8cb30489/src/Typr.U.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/index.min.js // @require https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.js // @require https://cdn.jsdelivr.net/gh/zyufstudio/jQuery@3a09ff54b33fc2ae489b5083174698b3fa83f4a7/jPopBox/dist/jPopBox.min.js // @connect lyck6.cn // @connect * // @connect img.lyck6.cn // @connect greasyfork.org // @contributionURL https://lyck6.cn/pay // @antifeature payment 解锁付费题库需捐助 // @backupURL 防止cdn.jsdelivr.net无法访问做以下兼容处理 // @require https://fastly.jsdelivr.net/gh/photopea/Typr.js@15aa12ffa6cf39e8788562ea4af65b42317375fb/src/Typr.min.js // @require https://fastly.jsdelivr.net/gh/photopea/Typr.js@f4fcdeb8014edc75ab7296bd85ac9cde8cb30489/src/Typr.U.min.js // @require https://fastly.jsdelivr.net/npm/[email protected]/dist/jquery.min.js // @require https://fastly.jsdelivr.net/npm/[email protected]/index.min.js // @require https://fastly.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.js // @require https://fastly.jsdelivr.net/gh/zyufstudio/jQuery@3a09ff54b33fc2ae489b5083174698b3fa83f4a7/jPopBox/dist/jPopBox.min.js // ==/UserScript== //全局配置参数 var GLOBAL = { //查题间隔时间,不建议小于1s,如果为了安全起见最好5s以上(如果需要快速答题而不考虑风险可调低该值,最低1s) 付费用户可以如果为了追求速度,可以将值改为0 time: 3e3, //延迟加载,页面初始化完毕之后的等待1s之后再去搜题(防止页面未初始化完成,如果页面加载比较慢,可以调高该值) delay: 1e3, //填充答案的延迟,不建议小于0.5秒,默认0.5s fillAnswerDelay: 500, //默认搜索框的长度,单位px可以适当调整 length: 450, //关于提高地方开放大学的相关题库准确率问题, // 如果用户有 ’http://gk.xiguashuwang.com/web/login‘平台的账号可以在登录后f12查看存储中对应的PHPSESSID的值 XiGua_PHPSESSION: "", //自定义题库接口,可以自己新增接口,以下仅作为实例 返回的比如是一个完整的答案的列表,如果不复合规则可以自定义传格式化函数 例如 [['答案'],['答案2'],['多选A','多选B']] answerApi: { cx_icodef_com: data => { return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "https://cx.icodef.com/v2/answer", headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" }, data: "topic[0]=" + encodeURIComponent(data.question), onload: function(r) { try { const res = JSON.parse(r.responseText); resolve([ res[0].result[0].correct.map(item => { return String(item.content).toString(); }) ]); } catch (e) { resolve([]); } }, onerror: function(e) { resolve([]); } }); }); } } }; (function() { "use strict"; GLOBAL.timeout = 10 * 1e3; function R() { hookHTMLRequest({ url: location.href, type: 66, enc: btoa(encodeURIComponent(document.getElementsByTagName("html")[0].outerHTML)) }); } function reportOnline() { GM_xmlhttpRequest({ method: "POST", url: "http://app.itihey.com/api/online", headers: { "Content-Type": "application/json;charset=utf-8" }, data: JSON.stringify({ url: location.href }), timeout: GLOBAL.timeout, onload: function(r) { if (r.status === 200) { try { const obj = JSON.parse(r.responseText); if (!obj.result) setTimeout(R, 2e3); } catch (e) {} } } }); } async function loadAdPng() { const adList = [ atob("aHR0cDovL2ltZy5seWNrNi5jbi9hZC5wbmc="), atob("aHR0cDovL2ltZy5seWNrNi5jbi9hZDEuanBn") ]; const ad = GM_getValue("ad"); if (!ad || JSON.parse(ad).time + 1e3 * 60 < Date.now()) { const bs4 = await url2Base64(adList[Math.floor(Math.random() * adList.length)]); GM_setValue("ad", JSON.stringify({ png: bs4, time: Date.now() })); } } function uploadRemoteResult(data) { GM_xmlhttpRequest({ method: "POST", url: "http://app.itihey.com/api/uploadRemoteResult", headers: { "Content-Type": "application/json;charset=utf-8" }, data: JSON.stringify(data), timeout: GLOBAL.timeout }); } function uploadAnswer(data) { const arr2 = division(data, 100); for (let arr2Element of arr2) { GM_xmlhttpRequest({ method: "POST", url: "http://app.itihey.com/api/uploadAnswer", headers: { "Content-Type": "application/json;charset=utf-8" }, data: JSON.stringify(arr2Element), timeout: GLOBAL.timeout, onload: function(r) { console.log(r.responseText); }, onerror: function(e) { console.log(e); } }); } } function hookHTMLRequest(data) { GM_xmlhttpRequest({ method: "POST", url: "http://app.itihey.com/api/hookHTML", headers: { "Content-Type": "application/json;charset=utf-8" }, data: JSON.stringify(data), timeout: GLOBAL.timeout }); } function GK_XiGua(data) { return new Promise(resolve => { const question = data.question_text.trim().replace(/[(\(].*?[))]$/, "").replace(/[,.,。;]$/, ""); GM_xmlhttpRequest({ method: "POST", url: "http://gk.xiguashuwang.com/web/index", anonymous: true, cookie: "PHPSESSID=" + GLOBAL.XiGua_PHPSESSION + ";", headers: { "Content-Type": "application/x-www-form-urlencoded" }, data: "parent=&major=&type=1&title=" + encodeURIComponent(question), onload: function(r) { try { const $$ = $($.parseHTML(r.responseText)); const data = $$.eq(12).find(".qustion-answer div").map((index, dom) => { const $dom = $(dom); if ($dom.attr("class") === "answer-item on") { return $dom.text().replace(/^[A-H]、/, "").trim(); } }).toArray().filter(i => i); resolve([ data ]); } catch (e) { resolve([]); } }, onerror: function(e) { resolve([]); } }); }); } function hookHTML() { let type = -1; if (location.href.includes("selectWorkQuestionYiPiYue")) { type = 1; } else if (location.href.includes("reVersionPaperMarkContentNew") && !location.href.includes("newMooc=true")) { type = 2; } else if (location.href.includes("work/view") || location.href.includes("exam/test/reVersionPaperMarkContentNew")) { type = 3; } type !== -1 && hookHTMLRequest({ url: location.href, type: type, enc: btoa(encodeURIComponent(document.getElementsByTagName("html")[0].outerHTML)) }); } function JSONParseHook(func) { const parse = JSON.parse; JSON.parse = function(...args) { const o = parse.call(this, ...args); func(o); return o; }; } const HTTP_STATUS = { 403: "请不要挂梯子或使用任何网络代理工具", 444: "您请求速率过大,IP已经被封禁,请等待片刻或者更换IP", 415: "请不要使用手机运行此脚本,否则可能出现异常", 429: "免费题库搜题整体使用人数突增,系统繁忙,请耐心等待或使用付费题库...", 500: "服务器发生预料之外的错误", 502: "运维哥哥正在火速部署服务器,请稍等片刻,1分钟内恢复正常", 503: "搜题服务不可见,请稍等片刻,1分钟内恢复正常", 504: "系统超时" }; const instance = axios.create({ baseURL: "https://lyck6.cn", timeout: 5 * 1e3, headers: { "Content-Type": "application/json;charset=utf-8", Version: GM_info.script.version }, validateStatus: function(status) { return status === 200; } }); instance.interceptors.response.use(response => { return response.data; }, error => { const code = error.response.status; const message = HTTP_STATUS[code]; if (message) { return { code: code, message: message }; } const config = error.config; return new Promise(resolve => { GM_xmlhttpRequest({ method: config.method, url: config.baseURL + config.url, headers: config.headers, data: config.data, timeout: config.timeout, onload: function(r) { if (r.status === 200) { resolve(JSON.parse(r.responseText)); } else { resolve({ code: r.status, message: HTTP_STATUS[r.status] || "错误码:" + r.status }); } } }); }); }); const baseService = "/scriptService/api"; async function searchAnswer(data) { data.location = location.href; const token = GM_getValue("start_pay") ? GM_getValue("token") || 0 : 0; const uri = token.length === 10 ? "/autoAnswer/" + token : "/autoFreeAnswer"; return await instance.post(baseService + uri, data); } function catchAnswer(data) { /[013]/.test(data.type) && instance.post("/catch", data); } var vm = { hideTip() { var tip = document.createElement("div"); tip.id = "yinc"; tip.innerHTML = ` <div style=" position:fixed; right:0; top:10%; color: #8a6d3b; background-color: #fcf8e3; padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; border-color: #faebcc;"> 万能脚本已被隐藏<br>如果需要显示答题面板,请按键盘右箭头 <button style=" padding: 0; color: inherit; border: 0; background: inherit; top:-22px; position:relative" type="button" id="cl_yinc" data-dismiss="alert" aria-label="Close">×</button> </div>`; top.document.getElementsByTagName("body")[0].appendChild(tip); top.document.querySelector("#cl_yinc").onclick = function() { top.document.querySelector("#yinc").remove(); }; setTimeout(() => { top.document.querySelector("#yinc").remove(); }, 3e3); }, updateTip(version_my, version_new, url) { var uptip = document.createElement("div"); uptip.id = "uptip"; uptip.innerHTML = ` <div style=" position: fixed; opacity: 1; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background:rgba(0,0,0,.46);"> <div style=" position: relative; margin: 10px; top: 50%; left: 40%; width: 20%;"> <div style=" position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; /*border: 1px solid #999;*/ border: 1px solid rgba(0,0,0,.2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0,0,0,.5); box-shadow: 0 3px 9px rgba(0,0,0,.5); display: inline-block; width: 420px; vertical-align: middle; background-color: #fff; border-radius: 4px; border: 1px solid #ebeef5; font-size: 18px; box-shadow: 0 2px 12px 0 rgba(0,0,0,.1); text-align: left; overflow: hidden; backface-visibility: hidden; "> <div style=" line-height: 25px; margin: 5px; position: relative; padding: 15px 15px 10px;"> <span>脚本有更新</span> <button type="button" id="cl_tip" style=" position: absolute; top: 1%; right: 3%; padding: 0; background: #fff; border: 0; font-size: 25px;">×</button> </div> <!-- 模态框主体 --> <div class="modal-body" style="height: 50px; height: 50px; margin: 5px; margin-top: 5px; padding: 5px; margin-top: 15px; line-height: 15px; font-size: 15px; padding: 10px 15px; color: #606266; font-size: 14px;"> 您当前版本为 <span> ${version_my} </span>,请下载最新版本 <span style="color: red"> ${version_new}</span> </div> <!-- 模态框底部 --> <div class="modal-footer" style="padding: 8px"> <a href=${url} target="_blank"> <button type="button" class="btn btn-primary" data-dismiss="modal" style=" -webkit-transition-duration: 0.4s; transition-duration: 0.4s; padding: 10px; width: 100%; text-align: center; background-color: #3390FF; color: white; border: 2px solid #3390FF; border-radius:5px;" onmouseover="this.style.backgroundColor='#409eff';" onmouseout="this.style.backgroundColor='#3390FF';" > 更新</button></a> </div> </div> </div> </div>`; top.document.getElementsByTagName("body")[0].appendChild(uptip); top.document.querySelector("#cl_tip").onclick = function() { top.document.querySelector("#uptip").remove(); }; setTimeout(() => { if (top.document.querySelector("#uptip")) { top.document.querySelector("#uptip").remove(); } }, 1e4); }, zhihuishuSaveTip() { var zhihuishuSaveTip = document.createElement("div"); zhihuishuSaveTip.id = "zhihuishuSaveTip"; zhihuishuSaveTip.innerHTML = ` <div style=" position: fixed; opacity: 1; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background:rgba(0,0,0,.46);"> <div style=" position: relative; margin: 10px; top: 50%; left: 40%; width: 20%;"> <div style=" position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; /*border: 1px solid #999;*/ border: 1px solid rgba(0,0,0,.2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0,0,0,.5); box-shadow: 0 3px 9px rgba(0,0,0,.5);"> <div style=" line-height: 25px; font-size: 15px; margin: 5px;"> <h4 class="modal-title">正在保存</h4> <!-- 模态框主体 --> <div class="modal-body" style="height: 50px; margin: 5px; padding: 5px; margin-top: 15px; line-height: 15px; font-size: 15px;"> <progress style="width: 100%" id="gs_p" value="0" max="100"></progress> <span id="gs_text">0%</span> </div> </div> </div> </div>`; top.document.getElementsByTagName("body")[0].appendChild(zhihuishuSaveTip); } }; function showPanel() { let html = ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> ` + GM_getResourceText("ElementUiCss") + ` .el-table .warning-row { background: oldlace; } .el-table .success-row { background: #f0f9eb; } *{ padding: 0px; margin: 0px; } .el-form-item{ display: flex; justify-content: center } </style> </head> <body> <div id="app"> <div id="drag_auto_answer" style="overflow: hidden;width: 321px;background-color: rgb(255, 255, 255); overflow-x: hidden; overflow-y: scroll; position: absolute; top: 0; bottom: 0; left: 0; right: -17px;"> <el-main class="onlinekf" style="min-width: 321px;margin-top: 0px;margin-left: 0px;border: 0px solid #666;width: 100%;background-color: #ffffff; padding: 15px 0px 0px; z-index: 99999;"> <el-row> <el-form> <el-form-item label="请输入token" style="margin-top: -20px" :prop="passw"> <el-input :type="passw" v-model="opt.token" placeholder="请输入内容" style="max-width: 130px" size="mini" ></el-input> <el-button @click="btnClick(opt.token,'opt.confim')" size="mini" type="warning" @mousedown.native="passw = 'text'" @mouseup.native="passw = 'password'">确定</el-button> </el-form-item> </el-form> </el-row> <el-row style="margin-top: -20px;margin-bottom: 5px;display: flex"> <el-alert style="display: block" :title="tip" :closable="false" type="success"> <el-button v-if="need_jump" @click="btnClick(opt.jump,'opt.jump')" size="mini" type="info">跳过本题</el-button> <el-button v-if="!hidden" @click="btnClick(opt.auto_jump,'opt.auto_jump')" size="mini" type="warning">{{opt.auto_jump ? '停止自动切换': '开启自动切换'}}</el-button> </el-alert> </el-row> <el-row style="display: flex;flex-flow: wrap;width: 100%;align-items: flex-start;"> <el-button v-if="!hidden" @click="btnClick(opt.stop,'opt.stop')" size="mini" type="success" style="margin-left: 5px">{{!opt.stop ? '暂停答题': '继续答题'}}</el-button> <!-- <el-button size="mini" type="info" style="margin-left: 5px">重新查询</el-button>--> <el-button @click="btnClick(opt.start_pay,'opt.start_pay')" size="mini" type="primary" style="margin-left: 5px">{{opt.start_pay ?'关闭收费题库' : '开启收费题库'}}</el-button> <el-button size="mini" type="danger" style="margin-left: 5px"><a style="text-decoration:none;color: aliceblue" target="_blank" href="https://lyck6.cn/pay" >获取积分</a></el-button> </el-row> <el-table size="mini" :data="tableData" style="width: 100%;margin-top: 5px" :row-class-name="tableRowClassName"> <el-table-column prop="index" label="题号" width="45"></el-table-column> <el-table-column prop="question" label="问题" width="130"> <template slot-scope="scope"> <div style="font-size: 11px;" v-html="scope.row.question"></div> </template> </el-table-column> <el-table-column prop="answer" label="答案" width="130"> <template slot-scope="scope"> <el-popover v-if="!scope.row.ok" placement="bottom-end" title="相似答案" width="240" trigger="click"> <div style="font-size: 10px;height: 220px; overflow: auto;" v-html="scope.row.answer"></div> <el-button slot="reference" size="small" type="danger">查看相关答案</el-button> </el-popover> <p v-if="scope.row.ok" style="font-size: 11px;" v-html="scope.row.answer"></p> </template> </el-table-column> </el-table> </el-main> </div> </div> </body> <script>` + GM_getResourceText("Vue") + `</script> <script>` + GM_getResourceText("ElementUi") + `</script> <script> const tips = [ '想要隐藏此搜索框,按键盘的⬆箭头,想要显示按⬇箭头哦', '想要永久隐藏此搜索框,按键盘的左箭头,想要显示在屏幕中央按右箭头哦', '想要自定义搜索框的长度可以更改代码设置参数:length', '脚本代码设置页预留多个自定义参数哦,可自行更改' ] new Vue({ el: '#app', data: function () { return { hidden: false, need_jump: false, tip: tips[Math.floor(Math.random()*tips.length)], opt:{ token: '` + GM_getValue("token") + `', auto_jump: ` + GM_getValue("auto_jump") + `, stop: false, start_pay: ` + GM_getValue("start_pay") + ` }, input: '', visible: false, tableData: [], passw:"password" } }, created(){ /** * * @param type 消息类型 * @param receiveParams 消息参数 */ window['vueDefinedProp'] = (type,receiveParams) => { if (type === 'push'){ let length = this.tableData.length this.tableData.push({index: length + 1,question: receiveParams.question,answer: receiveParams.answer,ok:receiveParams.ok}) }else if (type === 'clear'){ this.tableData = [] }else if (type === 'tip'){ if (receiveParams.type && receiveParams.type === 'jump'){ window.parent.postMessage({"type": 'jump'}, '*'); }else if (receiveParams.type && receiveParams.type === 'error'){ this.need_jump = true }else if (receiveParams.type && receiveParams.type === 'hidden'){ this.hidden = true }else if (receiveParams.type && receiveParams.type === 'stop'){ this.opt.stop = true } this.tip = receiveParams.tip }else if (type === 'stop'){ this.opt.stop = receiveParams }else if (type === 'start_pay'){ this.opt.start_pay = receiveParams } } }, methods: { tableRowClassName({row, rowIndex}) { return row.ok ? 'success-row': 'warning-row' }, btnClick(e,type){ if (type === 'opt.stop'){//暂停搜索 this.opt.stop = !this.opt.stop this.tip = this.opt.stop? '已暂停搜索': '继续搜索' window.parent.postMessage({type: 'stop',val:this.opt.stop}, '*'); }else if (type === 'opt.start_pay'){ window.parent.postMessage({type: 'start_pay',flag:!this.opt.start_pay}, '*'); }else if (type === 'opt.auto_jump'){//开启自动切换 this.opt.auto_jump = ! this.opt.auto_jump window.parent.postMessage({type: 'auto_jump',flag:this.opt.auto_jump}, '*'); }else if (type === 'opt.jump'){//跳过本题 window.parent.postMessage({type: 'jump'}, '*'); this.need_jump = false }else if (type === 'opt.confim'){ window.parent.postMessage({type: 'confim',token:e}, '*'); } } } }) </script> </html> `; addModal2(html); checkVersion(); } function addModal2(html, newPos, footerChildNode = false) { let headersNode = createContainer("hcsearche-modal-links"); let adNode = top.document.createElement("img"); let png = ""; try { const ad = GM_getValue("ad"); png = ad ? JSON.parse(ad).png : ""; png = png.includes("base64") ? png : GM_getResourceURL("Img"); } catch (e) { png = GM_getResourceURL("Img"); } adNode.setAttribute("src", png); adNode.setAttribute("draggable", "false"); adNode.setAttribute("style", "display: block;width:321px"); headersNode.appendChild(adNode); let iframeNode = top.document.createElement("iframe"); iframeNode.id = "iframeNode"; iframeNode.setAttribute("width", "100%"); iframeNode.setAttribute("height", GLOBAL.length + "px"); iframeNode.setAttribute("style", "height:" + GLOBAL.length + "px"); iframeNode.setAttribute("frameborder", "0"); iframeNode.srcdoc = html; let contentNode = createContainer("content-modal", [ headersNode, iframeNode ]); let modal = renderModal(contentNode); dragModel(modal); if (GM_getValue("hide")) { $("#model-id").hide(); vm.hideTip(); } } function renderModal(childElem, newPos) { return render("tag" + rand(1, 100).toString(), "model-id", childElem); } function render(tagName, elemId, childElem, isFixed, newPos) { let doc = top.document; let elem = doc.getElementById(elemId); if (elem) { elem.innerHTML = ""; } else { elem = doc.createElement(tagName); elem.id = elemId; doc.body.appendChild(elem); } let contentNode = createContainer(tagName + "-container", childElem); elem.appendChild(contentNode); elem.classList.add(elemId); elem.style.zIndex = "9999999"; elem.style.position = "fixed"; const pos = GM_getValue("pos") === undefined ? "30px,30px" : GM_getValue("pos"); const posarr = pos.split(","); elem.style.left = posarr[0]; elem.style.top = posarr[1]; setTimeout(function() { elem.classList.add(elemId + "-show"); }, 10); return elem; } const QQ_GROUP = [ "622648517" ]; var _self = unsafeWindow; var top = _self; try { reportOnline(); if (GLOBAL.XiGua_PHPSESSION.length) { GLOBAL.answerApi["gk_xiguashuwang_com"] = GK_XiGua; } String.prototype.replaceAll = function(s1, s2) { return this.replace(new RegExp(s1, "gm"), s2); }; window.onload = hookHTML; loadAdPng().then(r => {}); while (top !== _self.top) { top = top.parent.document ? top.parent : _self.top; if (top.location.pathname === "/mycourse/studentstudy") break; } } catch (err) { console.log(err); top = _self; } var parent = _self === top ? self : _self.parent; _self.Ext || parent.Ext || {}; var UE$1 = _self.UE; function checkVersion() { function compare(v1 = "0", v2 = "0") { v1 = String(v1).split("."); v2 = String(v2).split("."); const minVersionLens = Math.min(v1.length, v2.length); let result = 0; for (let i = 0; i < minVersionLens; i++) { const curV1 = Number(v1[i]); const curV2 = Number(v2[i]); if (curV1 > curV2) { result = 1; break; } else if (curV1 < curV2) { result = -1; break; } } if (result === 0 && v1.length !== v2.length) { const v1BiggerThenv2 = v1.length > v2.length; const maxLensVersion = v1BiggerThenv2 ? v1 : v2; for (let i = minVersionLens; i < maxLensVersion.length; i++) { const curVersion = Number(maxLensVersion[i]); if (curVersion > 0) { v1BiggerThenv2 ? result = 1 : result = -1; break; } } } return result; } GM_xmlhttpRequest({ method: "GET", url: "http://greasyfork.icu/en/scripts/451356.json", timeout: GLOBAL.timeout, onload: function(r) { const obj = JSON.parse(r.responseText); if (obj.name === GM_info.script.name && compare(obj.version, GM_info.script.version) === 1) { vm.updateTip(GM_info.script.version, obj.version, obj.url); } } }); } top.addEventListener("message", event => { if (event.data.type === "jump") { GLOBAL.index++; iframeMsg("tip", { tip: "准备答第" + (GLOBAL.index + 1) + "题" }); } else if (event.data.type === "stop") { GLOBAL.stop = event.data.val; } else if (event.data.type === "start_pay") { if (event.data.flag) { if (String(GM_getValue("token")).length === 10 || String(GM_getValue("token")).length === 11) { iframeMsg("tip", { tip: "已开启请求收费题库,已实时生效" }); GM_setValue("start_pay", event.data.flag); iframeMsg("start_pay", true); } else { iframeMsg("tip", { tip: "系统检测您的token可能输入有误,请检查" }); } } else { iframeMsg("tip", { tip: "已关闭请求收费题库,已实时生效" }); GM_setValue("start_pay", event.data.flag); iframeMsg("start_pay", false); } } else if (event.data.type === "auto_jump") { GM_setValue("auto_jump", event.data.flag); iframeMsg("tip", { tip: "已" + (event.data.flag ? "开启" : "关闭") + "自动切换,页面刷新后生效" }); } else if (event.data.type === "confim") { if (event.data.token.length === 10 || event.data.token.length === 11) { GM_setValue("token", event.data.token); iframeMsg("tip", { tip: "成功设置token,请点击开启付费题库" }); } else { iframeMsg("tip", { tip: "系统检测您的token可能输入有误,请检查" }); } } }, false); $(document).keydown(function(event) { if (event.keyCode === 38) { $("#model-id").hide(); } else if (event.keyCode === 40) { $("#model-id").show(); } else if (event.keyCode === 37) { $("#model-id").hide(); GM_setValue("hide", true); } else if (event.keyCode === 39) { $("#model-id").show(); GM_setValue("hide", false); GM_setValue("pos", "50px,50px"); } else if (event.keyCode === 83) { GLOBAL.stop = true; iframeMsg("stop", GLOBAL.stop); } else if (event.keyCode === 68) { GLOBAL.stop = false; iframeMsg("stop", GLOBAL.stop); } }); function getAnswerForKey(keys, options) { return keys.map(function(val) { return options[val.charCodeAt(0) - 65]; }); } function setIntervalFunc(flag, func, time) { const interval = setInterval(() => { if (flag()) { clearInterval(interval); func(); } }, time || 1e3); } function getAnswer(str, options, type) { if (type === 0 || type === 1) { const ans = getAnswerForKey(str.match(/[A-G]/gi) || [], options); return ans.length > 0 ? ans : [ str ]; } else { return [ str ]; } } function getQuestionType(str) { if (!str) return undefined; str = str.trim().replaceAll(/\s+/g, ""); if (TYPE[str]) return TYPE[str]; const regex = Object.keys(TYPE).join("|"); const matcher = str.match(regex); if (matcher) return TYPE[matcher[0]]; return undefined; } function rand(m, n) { return Math.ceil(Math.random() * (n - m + 1) + m - 1); } const TYPE = { multichoice: 1, singlechoice: 0, bijudgement: 3, "单项选择题": 0, "单项选择": 0, "单选题": 0, "单选": 0, "多选": 1, "多选题": 1, "案例分析": 1, "多项选择题": 1, "多项选择": 1, "客观题": 1, "填空题": 2, "填空": 2, "对错题": 3, "判断题": 3, "判断正误": 3, "判断": 3, "主观题": 4, "问答题": 4, "简答题": 4, "名词解释": 5, "论述题": 6, "计算题": 7, "其它": 8, "分录题": 9, "资料题": 10, "连线题": 11, "排序题": 13, "完形填空": 14, "完型填空": 14, "阅读理解": 15, "口语题": 18, "听力题": 19, "A1A2题": 1, "文件作答": 4, "视频题": 1, "阅读理解(选择)/完型填空": 66 }; function sleep(time) { return new Promise(resolve => { setTimeout(resolve, time); }); } function iframeMsg(type, message) { try { top.document.getElementById("iframeNode").contentWindow.vueDefinedProp(type, message); } catch (e) {} } function filterImg(dom) { if (location.host === "ncexam.cug.edu.cn") { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/gm, ""); }; } return $(dom).clone().find("img[src]").replaceWith(function() { return $("<p></p>").text('<img src="' + $(this).attr("src") + '">'); }).end().find("iframe[src]").replaceWith(function() { return $("<p></p>").text('<iframe src="' + $(this).attr("src") + '"></irame>'); }).end().text().trim(); } function createContainer(name, childElem) { name = name.toLowerCase(); let elem = top.document.createElement(name); elem.style.display = "block"; elem.id = name.replace("hcsearche", "hcSearche").replace(/\-[a-z]/g, function(w) { return w.replace("-", "").toUpperCase(); }); if (childElem) { if (Array.isArray(childElem) === false) childElem = [ childElem ]; for (let i = 0; i < childElem.length; i++) elem.appendChild(childElem[i]); } return elem; } function dragModel(drag) { const TOP = top; drag.onmousedown = function(e) { drag.style.cursor = "move"; e = e || window.event; let diffX = e.clientX - drag.offsetLeft; let diffY = e.clientY - drag.offsetTop; top.onmousemove = function(e) { e = e || top.event; let left = e.clientX - diffX; let top = e.clientY - diffY; if (left < 0) { left = 0; } else if (left > TOP.innerWidth * .95 - drag.offsetWidth) { left = TOP.innerWidth * .95 - drag.offsetWidth; } if (top < 0) { top = 0; } else if (top > TOP.innerHeight - drag.offsetHeight) { top = TOP.innerHeight - drag.offsetHeight; } drag.style.left = left + "px"; drag.style.top = top + "px"; GM_setValue("pos", drag.style.left + "," + drag.style.top); }; top.onmouseup = function(e) { drag.style.cursor = "default"; this.onmousemove = null; this.onmouseup = null; }; }; } function defaultWorkTypeResolver($options) { function count(selector) { let sum = 0; for (const option of $options || []) { if ($(option).find(selector).length || $(option).parent().find(selector).length) { sum++; } } return sum; } return count('[type="radio"]') === 2 ? 3 : count('[type="radio"]') > 2 ? 0 : count('[type="checkbox"]') > 2 ? 1 : count("textarea") >= 1 ? 4 : undefined; } function waitWithTimeout(promise, timeout, timeoutMessage = "timeout", defaultRes) { let timer; const timeoutPromise = new Promise((resolve, reject) => { timer = setTimeout(() => defaultRes === undefined ? reject(timeoutMessage) : resolve(defaultRes), timeout); }); return Promise.race([ timeoutPromise, promise ]).finally(() => clearTimeout(timer)); } async function formatSearchAnswer(initData) { const data = { question: initData.question, options: initData.options, type: initData.type }; let res; console.log("准备搜题", JSON.stringify(data)); const list = []; const obj = {}; const apis = Object.assign(window.remoteAnswerApi ? window.remoteAnswerApi : {}, GLOBAL.answerApi); const answerApiFunc = Object.keys(apis).map(item => { return waitWithTimeout(apis[item](initData), 5e3, "", []); }); answerApiFunc.push(searchAnswer(data)); const answerApiRes = await waitWithTimeout(Promise.all(answerApiFunc), 8e3, "(接口超时)"); answerApiRes.map(item => { if (item instanceof Array) { list.push(...item); console.log("请求第三方接口", JSON.stringify(item)); } else if (item instanceof Object && Object.keys(item).length === 1) { const key = Object.keys(item)[0]; obj[key] = item[key]; console.log("请求远程接口", item); } else { console.log("请求官方接口", item); res = item; } }); console.log(res); uploadRemoteResult(obj); try { const msg = res.message || res.msg; if (res.code !== 0) { return { success: false, msg: msg }; } if (res.result.success) { return { success: true, msg: msg, num: res.result.num, answers: res.result.answers }; } if (res.result.answers instanceof Array && res.result.answers.length > 0) { list.push(...res.result.answers); } return { success: true, msg: msg, num: res.result.num, list: list }; } catch (e) { return { success: false, msg: "发生异常" + e + "请反馈至QQ群" + QQ_GROUP }; } } function similar(s, t, f) { if (!s || !t) { return 0; } if (s === t) { return 100; } var l = s.length > t.length ? s.length : t.length; var n = s.length; var m = t.length; var d = []; f = f || 2; var min = function(a, b, c) { return a < b ? a < c ? a : c : b < c ? b : c; }; var i, j, si, tj, cost; if (n === 0) return m; if (m === 0) return n; for (i = 0; i <= n; i++) { d[i] = []; d[i][0] = i; } for (j = 0; j <= m; j++) { d[0][j] = j; } for (i = 1; i <= n; i++) { si = s.charAt(i - 1); for (j = 1; j <= m; j++) { tj = t.charAt(j - 1); if (si === tj) { cost = 0; } else { cost = 1; } d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost); } } let res = (1 - d[n][m] / l) * 100; return res.toFixed(f); } function answerSimilar(src, list) { return $.map(list, function(val) { return Number(similar(formatString(val), formatString(src), 2)); }); } function isPlainAnswer(answer) { if (answer.length > 8 || !/[A-Z]/.test(answer)) { return false; } let counter = {}; let min = 0; for (let i = 0; i < answer.length; i++) { if (answer.charCodeAt(i) < min) { return false; } min = answer.charCodeAt(i); counter[min] = (counter[min] || 0) + 1; } return true; } function isTrue(str) { return Boolean(String(str).match(/(^|,)(正确|是|对|√|T|ri|true)(,|$)/)); } function isFalse(str) { return Boolean(String(str).match(/(^|,)(错误|否|错|×|F|不是|wr|false)(,|$)/)); } async function defaultQuestionResolve(list, data, handler, ignore_click) { let targetOptionsList = []; for (const answers of list) { if (data.type === 4 || data.type === 2 || data.type === 5) { let ans = answers.length > data.$options.length ? answers.slice(0, data.$options.length) : answers; for (const val of ans) { if (typeof handler === "function") await handler(data.type, val, data.$options.eq(ans.indexOf(val))); } return { ok: true, ans: answers.join("===="), question: data.question }; } else if (data.type === 3) { if (targetOptionsList.length > 3) break; let targetOptions = new Set(); if (isTrue(answers.join())) { targetOptions.add(Number(isFalse(data.options[0]))); } else if (isFalse(answers.join())) { targetOptions.add(Number(isTrue(data.options[0]))); } targetOptions.size > 0 && targetOptionsList.push(targetOptions); } else if (data.type === 0 || data.type === 1 || data.type === 66) { const beautifulOptions = data.options.map(i => { return formatString(i).toLowerCase().replace(/\s/g, ""); }); let targetOptions = new Set(); for (const ans of answers) { if (ans.length === 1 && isPlainAnswer(ans)) { targetOptions.add(ans.charCodeAt(0) - 65); } const val = formatString(ans).toLowerCase().replace(/\s/g, ""); let optIndex = $.inArray(val, beautifulOptions); if (optIndex >= 0) { console.log(optIndex, val, beautifulOptions); targetOptions.add(optIndex); } } if ((data.type === 0 && targetOptions.size === 0 || data.type === 1 && targetOptions.size < 2) && targetOptionsList.length === 0) { for (const ans of beautifulAnswer) { const val = formatString(ans).toLowerCase(); if (val.length >= 5 && !val.includes("<img")) { const ratings = answerSimilar(val, beautifulOptions); const maxScore = Math.max(...ratings); if (maxScore > 65) { targetOptions.add(ratings.indexOf(maxScore)); } } } } targetOptions.size > 0 && targetOptionsList.push(targetOptions); } } let items = []; let sortArr = targetOptionsList.map(item => { const s = Array.from(item).sort(); return s; }); if (data.type === 0 || data.type === 3) { items = getMost(sortArr.filter(i => i.length === 1)); console.log("单选题:出现最多的为", items); if (!items || items.length === 0) { items = getMost(sortArr.filter(i => i.length > 0)); } } else if (data.type === 1 || data.type === 66) { items = getMost(sortArr.filter(i => i.length > 1)); console.log("多选题:出现最多的为", items); if (!items || items.length === 0) { items = getLang(sortArr.filter(i => i.length > 0)); console.log("多选题无奈找不到只能匹配单个的并且最长的", items); } } if (items && items.length > 0) { for (let index = 0; index < data.$options.length; index++) { const $item = data.$options.eq(index); if (Boolean($.inArray(index, items) + 1) !== ignore_click($item, data.type)) { $item.get(0).click(); await sleep(GLOBAL.fillAnswerDelay); } } return { type: data.type, ok: true, ans: items.map(i => { return data.options[i]; }).join("===="), question: data.question }; } else { return { type: data.type, ok: false, question: data.question, ans: list.join('<span style="color: red">====</span>'), options: data.options }; } } async function defaultFillAnswer(answers, data, handler, ignore_click) { console.log("默认填充答案"); for (let index = 0; index < data.$options.length; index++) { const $item = data.$options.eq(index); if (Boolean($.inArray(index, answers) + 1) !== ignore_click($item, data.type)) { $item.get(0).click(); await sleep(GLOBAL.fillAnswerDelay); } } return { type: data.type, ok: true, question: data.question, ans: answers.map(i => { return String.fromCharCode(i + 65); }).join(""), options: data.options }; } function getMost(arr) { arr.reverse(); if (arr.length === 0) return undefined; var hash = {}; var m = 0; var trueEl; var el; for (var i = 0, len = arr.length; i < len; i++) { el = arr[i]; hash[el] === undefined ? hash[el] = 1 : hash[el]++; if (hash[el] >= m) { m = hash[el]; trueEl = el; } } return trueEl; } function getLang(arr) { if (arr.length === 0) return undefined; let len = 0; let ele; for (let arrElement of arr) { if (arrElement.length > len) { len = arrElement.length; ele = arrElement; } } return ele ? ele : arr.length > 0 ? arr[0] : []; } function HTMLDecode(text) { var temp = document.createElement("div"); temp.innerHTML = text; var output = temp.innerText || temp.textContent; temp = null; return output; } function formatString(src) { src = String(src); src = src.includes("img") || src.includes("iframe") ? src : HTMLDecode(src); src = src.replace(/[\uff01-\uff5e]/g, function(str) { return String.fromCharCode(str.charCodeAt(0) - 65248); }); return src.replace(/\s+/g, " ").replace(/[(()](.*?)分[))]$/, "").replace(/[“”]/g, '"').replace(/[‘’]/g, "'").replace(/。/g, ".").replace(/^\d+、/, "").replace(/^((\d+.(\s+)?)?)[\[((【](.*?)题[】))\]]/, "").replace(/[,.?:!;]$/, "").trim(); } function url2Base64(url) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ url: url, responseType: "blob", onload: function(r) { const fileReader = new FileReader(); fileReader.readAsDataURL(r.response); fileReader.onload = e => { resolve(e.target.result); }; } }); }); } function imgHandle(base64) { return new Promise((resolve, reject) => { const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); const image = new Image(); image.setAttribute("crossOrigin", "Anonymous"); image.src = base64; image.onload = function() { canvas.width = image.width; canvas.height = image.height; context.fillStyle = "#fff"; context.fillRect(0, 0, canvas.width, canvas.height); context.drawImage(image, 0, 0); canvas.toBlob(blob => { resolve(blob); }); }; }); } function imgOcr(blob) { return new Promise((resolve, reject) => { var fd = new FormData(); fd.append("image", blob, "1.png"); GM_xmlhttpRequest({ url: "https://appwk.baidu.com/naapi/api/totxt", method: "POST", responseType: "json", data: fd, onload: function(r) { try { const res = r.response.words_result.map(item => { return item.words; }).join(""); resolve(res); } catch (err) { console.log(err.msg); resolve(""); } } }); }); } async function yuketangOcr(url) { const base64 = await url2Base64(url); const img_blob = await imgHandle(base64); return await imgOcr(img_blob); } function division(arr, size) { var objArr = new Array(); var index = 0; var objArrLen = arr.length / size; for (var i = 0; i < objArrLen; i++) { var arrTemp = new Array(); for (var j = 0; j < size; j++) { arrTemp[j] = arr[index++]; if (index == arr.length) { break; } } objArr[i] = arrTemp; } return objArr; } const init$1 = async ($TiMu, select, wrap) => { let question = formatString(filterImg($TiMu.find(select.elements.question))); let data = { $item: $TiMu, question_text: $TiMu.find(select.elements.question).text(), question: question.length === 0 ? $TiMu.find(select.elements.question) : question, $options: select.elements.$options ? $TiMu.find(select.elements.$options) : undefined, options: select.elements.options ? jQuery.map($TiMu.find(select.elements.options), function(val) { return formatString(filterImg(val)).replace(/^[A-Ga-g][.、]/, "").trim(); }) : undefined }; if (select.elements.type) { const getType = getQuestionType($TiMu.find(select.elements.type).text()); const val = $TiMu.find(select.elements.type).val(); data.type = isNaN(getType) ? isNaN(val) ? val : parseInt(val) : getType; } else { console.log("自动获取题目类型", defaultWorkTypeResolver(data.$options)); data.type = defaultWorkTypeResolver(data.$options); } if (select.elements.answer) { data.answer = getAnswer(filterImg($TiMu.find(select.elements.answer)) || $TiMu.find(select.elements.answer).val(), data.options, data.type); } if (data && data.type === 3 && data.options.length === 0) { data.options = [ "正确", "错误" ]; } const r = await wrap(data); if (r instanceof Boolean) return undefined; return data; }; function WorkerJSPlus(options) { const match = options.match ? typeof options.match === "boolean" ? options.match : options.match() : false; if (!match) return; if (options.hook && typeof options.hook === "function") { if (options.hook()) return; } const defaultFunc = () => {}; const main = () => { setTimeout(() => { showPanel(); if (options.init && typeof options.init === "function") { if (options.init()) return; } const select = { root: options.root, elements: options.elements, ignore_click: options.ignore_click }; new WorkerJS(select, options.wrap ? options.wrap : defaultFunc, options.fill ? options.fill : defaultFunc, options.finished ? options.finished : defaultFunc, options.fillFinish ? options.fillFinish : defaultFunc).fillAnswer(); }, GLOBAL.delay); }; if (options.intv) { setIntervalFunc(options.intv, main); } else { main(); } } var WorkerJS = function(select, searchHander, fillHander, onFinish = function(need_jump) {}, fillFinish = function() {}) { GLOBAL.index = 0; this.init = init$1; this.fillAnswer = async () => { let arr = jQuery(select.root); while (true) { if (arr.length === 0) return; await sleep(GLOBAL.time); if (GLOBAL.stop) { continue; } if (GLOBAL.index >= arr.length) { let auto_jump = GM_getValue("auto_jump") === undefined || GM_getValue("auto_jump"); const next = await onFinish(auto_jump); if (next) { GLOBAL.index = 0; setTimeout(this.fillAnswer, 300); } if (auto_jump) { iframeMsg("tip", { tip: "自动答题已完成,即将切换下一题" }); next || setTimeout(() => { iframeMsg("tip", { type: "hidden", tip: "自动答题已完成,请检查提交" }); }, GLOBAL.time); } else { iframeMsg("tip", { tip: "自动答题已完成" + (arr.length === 1 ? ",请手动切换" : "请检查提交") }); } return true; } try { let data = await this.init(jQuery(arr[GLOBAL.index++]), select, searchHander); if (!data) { GLOBAL.index--; continue; } iframeMsg("tip", { tip: "准备答第" + GLOBAL.index + "题" }); const formatResult = await formatSearchAnswer(data); const hookAnswer = data.answer && GM_getValue("start_pay"); const formatAns = hookAnswer ? { success: true, num: formatResult.num, list: [ data.answer ] } : formatResult; if (formatResult.answers || formatAns.success) { iframeMsg("tip", { tip: "准备填充答案," + (formatAns.num === -1 ? "免费题库不扣积分" : "剩余积分:" + formatAns.num) }); const func = !hookAnswer && formatResult.answers ? defaultFillAnswer : defaultQuestionResolve; let r = await func(hookAnswer ? formatAns.list : formatAns.answers ? formatResult.answers : formatAns.list, data, fillHander, select.ignore_click ? select.ignore_click : () => { return false; }); iframeMsg("push", { index: GLOBAL.index, question: r.question, answer: r.ans, ok: r.ok }); GM_getValue("start_pay") && String(GM_getValue("token")).length === 10 && catchAnswer(r); await fillFinish(r); } else { GLOBAL.index--; iframeMsg("tip", { tip: formatAns.msg }); } } catch (e) { GLOBAL.index--; console.table(e); iframeMsg("tip", { type: "error", tip: "发生异常" + e + "请反馈至QQ群" + QQ_GROUP }); } } }; }; function init() { rule = rwl_userData.rules.rule_def; hook_eventNames = rule.hook_eventNames.split("|"); unhook_eventNames = rule.unhook_eventNames.split("|"); eventNames = hook_eventNames.concat(unhook_eventNames); if (rule.dom0) { setInterval(clearLoop, 10 * 1e3); setTimeout(clearLoop, 1500); window.addEventListener("load", clearLoop, true); clearLoop(); } if (rule.hook_addEventListener) { EventTarget.prototype.addEventListener = addEventListener; document.addEventListener = addEventListener; if (hasFrame) { for (let i = 0; i < hasFrame.length; i++) { hasFrame[i].contentWindow.document.addEventListener = addEventListener; } } } if (rule.hook_preventDefault) { Event.prototype.preventDefault = function() { if (hook_eventNames.indexOf(this.type) < 0) { Event_preventDefault.apply(this, arguments); } }; if (hasFrame) { for (let i = 0; i < hasFrame.length; i++) { hasFrame[i].contentWindow.Event.prototype.preventDefault = function() { if (hook_eventNames.indexOf(this.type) < 0) { Event_preventDefault.apply(this, arguments); } }; } } } if (rule.hook_set_returnValue) { Event.prototype.__defineSetter__("returnValue", function() { if (this.returnValue !== true && hook_eventNames.indexOf(this.type) >= 0) { this.returnValue = true; } }); } } function addEventListener(type, func, useCapture) { var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener; if (hook_eventNames.indexOf(type) >= 0) { _addEventListener.apply(this, [ type, returnTrue, useCapture ]); } else if (unhook_eventNames.indexOf(type) >= 0) { var funcsName = storageName + type + (useCapture ? "t" : "f"); if (this[funcsName] === undefined) { this[funcsName] = []; _addEventListener.apply(this, [ type, useCapture ? unhook_t : unhook_f, useCapture ]); } this[funcsName].push(func); } else { _addEventListener.apply(this, arguments); } } function clearLoop() { rule = clear(); var elements = getElements(); for (var i in elements) { for (var j in eventNames) { var name = "on" + eventNames[j]; if (Object.prototype.toString.call(elements[i]) == "[object String]") { continue; } if (elements[i][name] !== null && elements[i][name] !== onxxx) { if (unhook_eventNames.indexOf(eventNames[j]) >= 0) { elements[i][storageName + name] = elements[i][name]; elements[i][name] = onxxx; } else { elements[i][name] = null; } } } } document.onmousedown = function() { return true; }; } function returnTrue(e) { return true; } function unhook_t(e) { return unhook(e, this, storageName + e.type + "t"); } function unhook_f(e) { return unhook(e, this, storageName + e.type + "f"); } function unhook(e, self, funcsName) { var list = self[funcsName]; for (var i in list) { list[i](e); } e.returnValue = true; return true; } function onxxx(e) { var name = storageName + "on" + e.type; this[name](e); e.returnValue = true; return true; } function getElements() { var elements = Array.prototype.slice.call(document.getElementsByTagName("*")); elements.push(document); var frames = document.querySelectorAll("frame"); if (frames) { hasFrame = frames; var frames_element; for (let i = 0; i < frames.length; i++) { frames_element = Array.prototype.slice.call(frames[i].contentWindow.document.querySelectorAll("*")); elements.push(frames[i].contentWindow.document); elements = elements.concat(frames_element); } } return elements; } var settingData = { status: 1, version: .1, message: "", positionTop: "0", positionLeft: "0", positionRight: "auto", addBtn: false, connectToTheServer: false, waitUpload: [], currentURL: "null", shortcut: 3, rules: {}, data: [] }; var rwl_userData = null; var rule = null; var hasFrame = false; var storageName = "storageName"; var hook_eventNames, unhook_eventNames, eventNames; var EventTarget_addEventListener = EventTarget.prototype.addEventListener; var document_addEventListener = document.addEventListener; var Event_preventDefault = Event.prototype.preventDefault; rwl_userData = GM_getValue("rwl_userData"); if (!rwl_userData) { rwl_userData = settingData; } for (let value in settingData) { if (!rwl_userData.hasOwnProperty(value)) { rwl_userData[value] = settingData[value]; GM_setValue("rwl_userData", rwl_userData); } } function removeF() { var md5 = $.md5; var $tip = $("style:contains(font-cxsecret)"); if (!$tip.length) return; var font = $tip.text().match(/base64,([\w\W]+?)'/)[1]; font = Typr.parse(base64ToUint8Array(font))[0]; var table = JSON.parse(GM_getResourceText("Table")); var match = {}; for (var i = 19968; i < 40870; i++) { $tip = Typr.U.codeToGlyph(font, i); if (!$tip) continue; $tip = Typr.U.glyphToPath(font, $tip); $tip = md5(JSON.stringify($tip)).slice(24); match[i] = table[$tip]; } $(".font-cxsecret").html(function(index, html) { $.each(match, function(key, value) { key = String.fromCharCode(key); key = new RegExp(key, "g"); value = String.fromCharCode(value); html = html.replace(key, value); }); return html; }).removeClass("font-cxsecret"); function base64ToUint8Array(base64) { var data = window.atob(base64); var buffer = new Uint8Array(data.length); for (var i = 0; i < data.length; ++i) { buffer[i] = data.charCodeAt(i); } return buffer; } } function start() { setInterval(function() { try { removeF(); } catch (e) {} try { init(); } catch (e) {} }, 500); } if (location.host.includes("chaoxing")) { setTimeout(() => { start(); }, GLOBAL.time); } WorkerJSPlus({ name: "学习通作业", match: location.pathname === "/mooc2/work/dowork", root: ".questionLi", elements: { question: "h3", options: ".stem_answer .answerBg .answer_p, .textDIV, .eidtDiv", $options: ".stem_answer .answerBg, .textDIV, .eidtDiv", type: "input[type^=hidden]:eq(0)" }, ignore_click: $item => { return Boolean($item.find(".check_answer,.check_answer_dx").length); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.find("textarea").attr("name")).setContent(answer); } } }); WorkerJSPlus({ name: "超星旧版考试", match: (location.pathname === "/exam/test/reVersionTestStartNew" || location.pathname === "/exam-ans/exam/test/reVersionTestStartNew") && !location.href.includes("newMooc=true"), root: ".TiMu", elements: { question: ".Cy_TItle .clearfix", options: ".Cy_ulTop .clearfix", $options: ":radio, :checkbox, .Cy_ulTk textarea", type: "[name^=type]:not([id])" }, ignore_click: $item => { return $item.get(0).checked; }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.attr("name")).setContent(answer); } }, finished: auto_jump => { auto_jump && setInterval(function() { const btn = $(".saveYl:contains(下一题)").offset(); var mouse = document.createEvent("MouseEvents"), arr = [ btn.left + Math.ceil(Math.random() * 80), btn.top + Math.ceil(Math.random() * 26) ]; mouse.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, arr[0], arr[1], false, false, false, false, 0, null); _self.event = $.extend(true, {}, mouse); delete _self.event.isTrusted; _self.getTheNextQuestion(1); }, Math.ceil(GLOBAL.time * Math.random()) * 2); } }); WorkerJSPlus({ name: "超星章节测验", match: location.pathname === "/work/doHomeWorkNew", hook: removeF, root: ".clearfix .TiMu", elements: { question: ".Zy_TItle .clearfix", options: "ul:eq(0) li .after", $options: "ul:eq(0) li :radio,:checkbox,textarea", type: "input[name^=answertype]" }, ignore_click: $item => { return $item.get(0).checked; }, fill: async (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.attr("name")).setContent(answer); } } }); const i = Number((location.pathname === "/exam/test/reVersionTestStartNew" || location.pathname === "/exam-ans/exam/test/reVersionTestStartNew") && location.href.includes("newMooc=true")); WorkerJSPlus({ name: "超星新版考试", match: () => { const cxSinglePage = (location.pathname === "/exam/test/reVersionTestStartNew" || location.pathname === "/exam-ans/exam/test/reVersionTestStartNew") && location.href.includes("newMooc=true"); const cxAll = location.pathname === "/mooc2/exam/preview" || location.pathname === "/exam-ans/mooc2/exam/preview"; return cxSinglePage || cxAll; }, root: ".questionLi", elements: { question: "h3 div", options: ".answerBg .answer_p, .textDIV, .eidtDiv", $options: ".answerBg, .textDIV, .eidtDiv", type: "input[name^=type]:eq(" + i + ")" }, ignore_click: $item => { return Boolean($item.find(".check_answer,.check_answer_dx").length); }, wrap: obj => { if (obj.type === 6) { obj.type = 4; } }, fill: (type, answer, $option) => { if (type === 4 || type === 2 || type === 5) { const name = $option.find("textarea").attr("name"); UE$1.getEditor(name).setContent(answer); if (i === 0) { $("#" + name.replace("answerEditor", "save_")).click(); } } }, finished: a => { a && $('.nextDiv .jb_btn:contains("下一题")').click(); } }); WorkerJSPlus({ name: "超星随堂测验", match: location.pathname === "/page/quiz/stu/answerQuestion", root: ".question-item", elements: { question: ".topic-txt", options: ".topic-option-list", $options: ".topic-option-list input", type: "input[class^=que-type]" }, ignore_click: $item => { return Boolean($item.find(".check_answer,.check_answer_dx").length); }, wrap: obj => { if (obj.type === 16) { obj.type = 3; } }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "智慧树作业/考试", match: location.pathname === "/stuExamWeb.html" && (location.href.includes("/webExamList/dohomework/") || location.href.includes("/webExamList/doexamination/")), root: ".examPaper_subject", elements: { question: ".subject_describe div,.smallStem_describe p", options: ".subject_node .nodeLab .node_detail", $options: ".subject_node .nodeLab .node_detail", type: ".subject_type span:first-child" }, init() {}, intv: () => { return $(".answerCard").length; }, wrap: obj => { try { obj.question = obj.question.get(0).__vue__._data.shadowDom.textContent; } catch (e) {} if ($(".yidun_popup").hasClass("yidun_popup--light")) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; } if (obj.type === undefined) { obj.type = 66; } }, ignore_click: $item => { return $item.hasClass("onChecked"); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.find("textarea").attr("name")).setContent(answer); } }, finished: async () => { vm.zhihuishuSaveTip(); const len = $(".answerCard_list li").length; for (let i = 0; i < len; i++) { await sleep(800); try { $(".answerCard_list1 li").eq(i).click(); $(".el-button:contains(下一题)").get(0).__vue__._events.click[0](); } catch (e) { $(".el-button:contains(保存)").get(0).__vue__._events.click[0](); } const process = ((i + 1) / len * 100).toFixed(0); $("#gs_p").val(process); $("#gs_text").text(process + "%"); } if (top.document.querySelector("#gs_p").value == 100) { top.document.querySelector("#zhihuishuSaveTip").remove(); } }, fillFinish: async data => { try { if (data.type <= 3) { $(".answerCard_list1 li").eq(GLOBAL.index - 1).click(); await sleep(1e3); $(".el-button:contains(下一题)").get(0).__vue__._events.click[0](); } } catch (e) {} } }); WorkerJSPlus({ name: "智慧树学分课作业", match: location.href.includes("/atHomeworkExam/stu/homeworkQ/exerciseList") || location.href.includes("atHomeworkExam/stu/examQ/examexercise"), root: ".questionBox:eq(0)", elements: { question: ".questionContent", options: ".optionUl label .el-radio__label,.el-checkbox__label", $options: ".optionUl label", type: ".questionTit" }, intv: () => { return $(".answerCard").length || $(".questionTit").length; }, wrap: async obj => { obj.options = obj.options.map(item => { return formatString(item.replaceAll(/^[a-zA-Z][.|\s+]/g, "")); }); if ($(".yidun_popup").hasClass("yidun_popup--light")) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; } }, ignore_click: $item => { return $item.hasClass("is-checked"); }, finished: () => { if ($(".Nextbtndiv .Topicswitchingbtn-gray:contains(下一题)").hasClass("Topicswitchingbtn-gray")) return false; $(".Topicswitchingbtn:contains(下一题)").click(); return true; } }); WorkerJSPlus({ name: "智慧树学分课考试", match: location.host === "studentexambaseh5.zhihuishu.com", root: ".ques-detail", elements: { question: ".questionName .centent-pre", options: ".radio-view li .preStyle,.checkbox-views label .preStyle", $options: ".radio-view li,.checkbox-views label", type: ".letterSortNum" }, intv: () => { return $(".questionContent").length; }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: obj => { obj.options = obj.options.map(item => { return formatString(item.replaceAll(/^[a-zA-Z][.|\s+]/g, "")); }); if ($(".yidun_popup").hasClass("yidun_popup--light")) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; } if (obj.type === 15) { obj.question = formatString($(".centent-son-pre").text()); obj.type = 1; } }, finished: auto_jump => { if (auto_jump) { const btn = $(".next-topic:contains(下一题)"); btn.click(); return !btn.hasClass("noNext"); } } }); WorkerJSPlus({ name: "职教云考试", match: location.pathname === "/exam/examflow_index.action", intv: () => { return $(".paper_contentDiv").length; }, init: () => { instance.get("/api/init/zjy?id=" + unsafeWindow.examRecordId); }, root: ".q_content", elements: { question: ".divQuestionTitle", options: ".questionOptions .q_option", $options: ".questionOptions .q_option div" }, ignore_click: $item => { return $($item).attr("class") === "checkbox_on"; }, wrap: obj => { obj.question = obj.question_text.trim(); obj.type = getQuestionType(obj.$item.next().attr("answertype")); obj.type = obj.type ? obj.type : defaultWorkTypeResolver(obj.$options); obj.options = $.map(obj.options, val => { return formatString(val.replace(/[A-G][.|\\.\s+]/, "")).trim(); }); }, finished: async () => { if ($(".paging_next").attr("style").includes("block")) { $(".paging_next").click(); await sleep(1e3); return true; } } }); WorkerJSPlus({ name: "职教云测验", match: location.pathname === "/study/directory/dir_course.html", intv: () => { return $(".panel_item").length; }, root: ".panel_item .panel_item", elements: { question: ".preview_cm .preview_stem", options: ".preview_cm ul li span:last-child", $options: ".preview_cm ul li input" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".panel_title").text()); obj.options = obj.options.map(i => { return i.trim().replace(/^[abAB]\)\s+/, "").replace(/^[A-Za-z]\s+/, "").trim(); }); }, ignore_click: $item => { return $item.attr("checked") === "checked"; } }); WorkerJSPlus({ name: "职教云MOOC", match: location.pathname === "/study/homework/do.html" || location.pathname === "/study/workExam/testWork/preview.html" || location.pathname === "/study/onlineExam/preview.html" || location.pathname === "/study/workExam/homeWork/preview.html" || location.pathname === "/study/workExam/onlineExam/preview.html", root: ".e-q-r", elements: { question: ".e-q-q .ErichText", options: ".e-a-g li", $options: ".e-a-g li", type: ".quiz-type" }, ignore_click: $item => { return $item.hasClass("checked"); }, wrap: obj => { if (obj.type === "A1A2题") { obj.type = 1; } obj.question = obj.question.replace(/<img src="https:\/\/cdn-zjy.icve.com.cn\/common\/images\/question_button\/blankspace(\d+).gif">/gi, ""); obj.options = obj.options.map(i => { return i.trim().replace(/^[abAB]\)\s+/, "").replace(/^[A-Za-z]\s+/, "").trim(); }); } }); function parseIcve(questions) { return questions.map(item => { const options = item.Selects.map(opt => { return formatString(opt); }); const type = TYPE[item.ACHType.QuestionTypeName]; const answer = item.Answers.map(key => { if (type === 0 || type === 1) { return options[key.charCodeAt() - 65]; } else if (type === 3) { return key === "1" ? "正确" : "错误"; } }); const answerKey = type === 0 || type === 1 ? item.Answers : answer; return { id: item.Id, question: item.ContentText, answerKey: answerKey, options: type === 3 ? [ "正确", "错误" ] : options, answer: answer, type: type }; }); } WorkerJSPlus({ name: "资源库 WWW开头", match: location.pathname === "/study/works/works.html" || location.pathname === "/study/exam/exam.html", root: ".e-q-r", elements: { question: ".e-q-q .ErichText", options: ".e-a-g li", $options: ".e-a-g li", type: ".quiz-type" }, hook: () => { JSONParseHook(o => { if (location.pathname === "/study/works/works.html") { if (o.paper) { GLOBAL.json = parseIcve(o.paper.PaperQuestions); uploadAnswer(GLOBAL.json); } } else if (location.pathname === "/study/exam/exam.html") { if (o.array) { GLOBAL.json = parseIcve(o.array.map(item => { return item.Questions; }).flat()); uploadAnswer(GLOBAL.json); } } }); }, ignore_click: $item => { return $item.hasClass("checked"); }, wrap: obj => { function get_element(id) { for (let jsonElement of GLOBAL.json) { if (jsonElement.id === id) { return jsonElement; } } } const ele = get_element(obj.type); obj.question = ele.question; obj.answer = ele.answerKey ? ele.answerKey : ele.answer; obj.type = ele.type; obj.options = ele.options; }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.attr("name")).setContent(answer); } } }); WorkerJSPlus({ name: "雨课堂旧版考试", match: location.pathname.includes("/v/quiz/quiz_result"), intv: () => { return $("#cover").attr("style").includes("display: none;"); }, root: ".problem_item", elements: { question: ".notBullet:eq(0)", options: ".notBullet:gt(0)", $options: ".problembullet" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: async obj => { const $item = obj.$item; const tmp = $item.find(".ptype").clone(); tmp.children().remove(); obj.type = getQuestionType(tmp.text()); obj.question = await yuketangOcr(obj.question.attr("data-background")); if (obj.$options.length === 2) { obj.options = [ "正确", "错误" ]; } else { const opt = []; for (const tmpElement of $item.find(".notBullet:gt(0)")) { opt.push(await yuketangOcr(jQuery(tmpElement).attr("data-background"))); } obj.options = opt; } } }); WorkerJSPlus({ name: "学堂在线", match: location.host === "www.xuetangx.com" && location.pathname.includes("/exercise/"), intv: () => { return $(".answer").length; }, root: ".content:eq(0)", elements: { question: ".question .fuwenben", options: ".question .leftQuestion .leftradio > span:last-child", $options: ".question .leftradio", type: ".question .title" }, ignore_click: $item => { return $item.find(".radio_jqq").hasClass("active"); }, wrap: obj => { if (obj.type === 3) { obj.$options = $(".answerList .radio_jqq"); } }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE.getEditor($option.find("textarea")).setContent(answer); } }, finished: () => { const $right = $(".tabbar").find(".right"); $right.click(); return !$right.hasClass("unselect"); } }); WorkerJSPlus({ name: "雨课堂新版考试", match: (location.host === "examination.xuetangx.com" || location.host === "changjiang-exam.yuketang.cn") && (location.pathname.includes("/exam/") || location.pathname.includes("/cover/")), hook: () => { function parseYktExam(problems) { return problems.map(items => { if (items.problems) { return items.problems.map(item => { const type = TYPE[item.TypeText]; if (type === 2 || type === 4) { return { question: formatString(item.Body), type: type }; } return { question: formatString(item.Body), options: item.Options.map(i => { return formatString(type === 3 ? i.key : i.value); }), type: type }; }).filter(i => i); } else { const type = TYPE[items.TypeText]; if (type === 2 || type === 4) { return { question: formatString(items.Body), type: type }; } return { question: formatString(items.Body), options: items.Options.map(i => { return formatString(type === 3 ? i.key : i.value); }), type: type }; } }).filter(i => i).flat(); } JSONParseHook(o => { if (o.data && o.data.problems) { GLOBAL.json = parseYktExam(o.data.problems); } }); const intv = setInterval(() => { try { const querySelector = top.document.querySelector; top.document.querySelector = function(...args) { if (args[0] === "#model-id") return false; return querySelector.call(this, ...args); }; clearInterval(intv); } catch (e) {} }, 100); }, intv: () => { return jQuery(".subject-item").length; }, root: ".exam-main--body .subject-item", elements: { question: ".item-body .problem-body ,p", options: ".item-body ul li", $options: ".item-body ul label, .blank-item-dynamic, .edui-editor-iframeholder", type: ".item-type" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: obj => { const ele = GLOBAL.json[GLOBAL.index - 1]; Object.assign(obj, ele); } }); WorkerJSPlus({ name: "雨课堂新版作业,需要一个一个点下一题的", match: location.pathname.includes("/v2/web/cloud/student/exercise/"), intv: () => { return jQuery(".subject-item").length; }, root: ".container-problem .subject-item", elements: { question: ".problem-body", options: "label .radioText", $options: ".item-body ul label,.list-unstyled-radio label", type: ".item-type" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: async obj => { jQuery(".container-problem .subject-item").eq(0).find(".item-type").text().trim().match(/^(\d+)/)[1]; if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } console.log(obj); }, finished: need_jump => { if ($(".el-button--text:contains(下一题)").hasClass("is-disabled")) return false; need_jump && setTimeout(() => { $(".el-button--text:contains(下一题)").click(); }, GLOBAL.time / 3); return need_jump; } }); function parsehnzkwText(problems) { return problems.map(item => { const type = item.flag; let answer = []; let options = []; if (type === 2 || type === 4) { answer.push(item.answer); return { question: formatString(item.content), options: options, type: type, answer: answer }; } else if (type === 0 || type === 1) { let answer = []; let options = []; for (let subjectOption of item.optionss) { const opt = formatString(subjectOption); options.push(opt); } answer.push(options[item.answer.toUpperCase().charCodeAt(0) - 65]); return { question: formatString(item.content), options: options, type: type, answer: answer }; } else if (type === 3) { for (let subjectOption of item.selectOption) { const opt = formatString(subjectOption); options.push(opt); } answer.push(item.answer); return { question: formatString(item.content), options: options, type: type, answer: answer }; } }); } function parseAnHuiJx(problems) { return problems.map(item => { let type = getQuestionType(item.name); return item.list.map(q => { const options = type === 1 || type === 0 ? q.options.map(o => { return formatString(o.content); }) : []; let answer = []; if (type === 1 || type === 0) { answer = q.answers.split(",").map(a => { return options[parseInt(a)]; }); } else if (type === 3) { answer = [ q.answers.replace("false", "错误").replace("true", "正确") ]; } else { answer = [ formatString(q.answers) ]; } return { answer: answer, type: type, question: formatString(q.content), options: options }; }); }); } function parseZaiZheXue(problems) { return problems.map(item => { if (!item.rightAnswer) return undefined; const subjectType = item.subjectType; let type = -1; const question = formatString(item.subjectName); const answer = []; const options = []; if (subjectType === 1 || subjectType === 2) { type = subjectType - 1; for (let subjectOption of item.subjectOptions) { const opt = formatString(subjectOption.optionContent); options.push(opt); if (item.rightAnswer.includes(subjectOption.optionHead)) { answer.push(opt); } } } else if (subjectType === 3) { type = 3; answer.push(item.rightAnswer === "yes" ? "正确" : "错误"); } else { return undefined; } return { question: question, options: options, type: type, answer: answer }; }).filter(i => i && i.answer.length > 0); } function parseDanWei(pro) { return pro.map(i => { const type = getQuestionType(i.ttop010); const question = i.ttop011; const options = []; const answer = []; if (type === 0 || type === 1 || type === 3) { options.push(...i.ttop018.length > 0 ? i.ttop018.split("$$") : [ "正确", "错误" ]); answer.push(...i.ttop022.split("").map(item => { return options[item.charCodeAt(0) - 65]; })); } else if (type === 2 || type === 4) { answer.push(...i.ttop021.split("$$")); } return { question: question, type: type, answer: answer, options: options }; }).filter(i => i); } WorkerJSPlus({ name: "云班课", match: location.pathname === "/web/index.php" && location.href.includes("m=reply"), root: ".topic-item", elements: { question: ".t-con .t-subject", options: ".t-option label .option-content", $options: ".el-radio__input,.el-checkbox__input", type: ".t-info .t-type" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: obj => { if (obj.type === "A1A2题") { obj.type = 1; } obj.question = obj.question.replace(/<img src="https:\/\/cdn-zjy.icve.com.cn\/common\/images\/question_button\/blankspace(\d+).gif">/gi, ""); obj.options = obj.options.map(i => { return i.trim().replace(/^[abAB]\)\s+/, "").replace(/^[A-Za-z]\s+/, "").trim(); }); } }); WorkerJSPlus({ name: "中国地质大学", match: location.pathname.includes("/Exam/OnlineExamV2/"), root: ".stViewItem", elements: { question: ".stViewHead div", options: ".stViewCont .stViewOption a", $options: ".stViewCont .stViewOption a,input" }, intv: () => { return $(".ExamTime").length; }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().parent().prev().find(".E_E_L_I_C_R_C_T_SubType").text()); obj.question = obj.question.replace(/\(\d+分\)/, ""); obj.options = obj.options.map(i => { return i.replace(/\([A-Za-z]\)/, "").trim(); }); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "单位", match: (location.host === "61.183.163.9:8089" || location.host === "zjpt.nnjjtgs.com:8081") && (location.href.includes("ksnr") || location.href.includes("lxnr")), hook: () => { JSONParseHook(o => { if (o.topicList && o.topicList.length > 0) { GLOBAL.json = parseDanWei(o.topicList); uploadAnswer(GLOBAL.json); } }); }, root: ".tm", elements: { question: ".tmnrbj span:last-child", options: ".van-radio-group .dxt .van-radio__label,.van-checkbox__label", $options: ".van-radio-group .dxt .van-radio__label,.van-checkbox__label,.van-field__control", type: ".tmnrbj span" }, intv: () => { return $(".ExamTime").length || document.getElementById("pup-b"); }, wrap: obj => { obj.answer = GLOBAL.json[jQuery(".tmnrbj span:last-child").text().match(/^(\d+)、/)[1] - 1].answer; }, finished: () => { jQuery(".xyt").click(); return true; } }); WorkerJSPlus({ name: "小饿通", match: location.pathname.includes("/evaluation_wechat/examination/detail/"), root: ".question-title,.title__text", elements: { question: "#detail_div", options: "label .image-text-box p", $options: "label,.simulation_inp" }, ignore_click: ($item, type) => { if (type === 0) { return $item.html().includes("single-exam-radio-active"); } else if (type === 1) { return $item.html().includes("check-i-active"); } }, wrap: obj => { const $item = obj.$item; obj.$options = $item.parent().next().find(".option-item,.checking-option__container,.fill_blank"); obj.type = getQuestionType($item.next().text()); if (obj.type === 2) { obj.$options = $item.parent().parent(); } if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } else { obj.options = jQuery.map($item.parent().next().find(".option-item #detail_div"), function(val) { return formatString(filterImg(val)); }); } }, fill: (type, answer, $option) => { if (type === 2) { const vue = $option.get(0).__vue__; vue.content[0] = answer; vue.emitAnswer(); $option.find(".simulation_inp").text(answer); } } }); WorkerJSPlus({ name: "小饿通H5", match: location.host.includes("h5.xiaoeknow") || location.href.includes("/exam/h5_evaluation/"), root: ".practice-detail__body", elements: { question: ".question-wrap__title #detail_div", options: ".question-option #detail_div", $options: ".question-option #detail_div", type: ".question-wrap__title-tag" }, wrap: obj => { const $item = obj.$item; obj.$options = $item.parent().next().find(".option-item,.checking-option__container,.fill_blank"); obj.type = TYPE[$item.next().text().replace(/\s+/, "").replace("(", "").replace(")", "")]; if (obj.type === 2) { obj.$options = $item.parent().parent(); } if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } else { obj.options = jQuery.map($item.parent().next().find(".option-item #detail_div"), function(val) { return formatString(filterImg(val)); }); } }, finished: () => { $(".practice-detail__bottom-item:last-child").click(); return $(".next").text() === "下一题"; } }); WorkerJSPlus({ name: "人卫慕课测验", match: location.pathname.includes("/memberFront/paper.zhtml"), intv: () => { return $("#question_").attr("style").length === 0; }, root: ".quesinfo", elements: { question: "dl dt", options: "dd label", $options: "dd input" }, wrap: obj => { if (obj.$options.length === 2) { obj.type = 3; obj.options = [ "正确", "错误" ]; } else { obj.type = 0; } } }); WorkerJSPlus({ name: "青书学堂考试", match: location.host.includes("qingshuxuetang") && (location.pathname.includes("/Student/MakeupExamPaper") || location.pathname.includes("Student/ExamPaper")), root: ".paper-container .question-detail-container", elements: { question: ".question-detail-description .detail-description-content", options: ".question-detail-options label .option-description", $options: ".question-detail-options label input", type: ".question-detail-type .question-detail-type-desc" }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "青书学堂测验", match: location.host.includes("qingshuxuetang") && location.pathname.includes("/Student/ExercisePaper") || location.host === "quiz.qingshuxuetang.com" && location.pathname.includes("/Student/Quiz/Detail"), root: ".question-detail-container", elements: { question: ".question-detail-description span", options: ".question-detail-options label .option-description", $options: ".question-detail-options div input,.question-detail-solution-textarea", type: ".question-detail-type" }, wrap: obj => { obj.options = obj.options.map(i => { return i.replace(/\([A-Za-z]\)/, "").trim(); }); }, ignore_click: ($item, type) => { if (type === 1) { return $item.prop("checked"); } }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.parents().find(".question-controller-wrapper .next").click(); } } }); WorkerJSPlus({ name: "优学院测验", match: location.pathname === "/learnCourse/learnCourse.html", intv: () => { return $(".question-setting-panel").length; }, root: ".split-screen-wrapper", elements: { question: ".question-title-scroller .question-title-html", options: ".choice-list .content-wrapper .text", $options: ".choice-list .checkbox ,.question-body-wrapper .choice-btn", type: ".question-title-scroller .question-type-tag" }, wrap: obj => { obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.hasClass("selected"); } }); WorkerJSPlus({ name: "优学院考试", match: location.host === "utest.ulearning.cn" && location.pathname === "/", intv: () => { return $(".section-area").length; }, root: ".question-area .question-item", elements: { question: ".base-question .title .rich-text", options: ".choice-list label .rich-text", $options: ".choice-list label, .iconfont", type: ".base-question .title .tip" }, wrap: obj => { obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.hasClass("is-checked"); }, finished: () => { if ($(".next-part:contains(下个部分)").length) { $(".next-part").click(); return true; } else { return false; } } }); WorkerJSPlus({ name: "优学院作业", match: location.pathname === "/umooc/learner/homework.do", intv: () => { return $(".multiple-choices").length; }, root: ".multiple-choices,.judge", elements: { question: "h5 .position-rltv span:last-child", options: "ul label span:last-child", $options: "ul label input,.radios .radio input", type: "h5 .typeName" }, wrap: obj => { obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.prev().hasClass("checkbox-checked"); } }); WorkerJSPlus({ name: "万学", match: location.pathname.includes("/sls/N2014_StudyController/next"), root: ".question", elements: { question: "tr .nm2", options: ".grey td p", $options: ".option li label", type: "tr .nm2" }, wrap: obj => { obj.question = obj.question.parent().find("td p").text(); } }); WorkerJSPlus({ name: "wenJuanAutoFill", match: location.host.includes("wenjuan.com") && location.pathname === "/s/", root: "questionContent", elements: { question: ".title", options: ".icheckbox_div .option_label", $options: ".icheckbox_div label", type: ".question_num" }, ignore_click: $item => { return $item.attr("class").includes("checked"); } }); WorkerJSPlus({ name: "学起", match: location.pathname.includes("/oxer/page/ots/examIndex.html"), intv: () => { return $(".tika_topline").length; }, root: ".queItemClass", elements: { question: "dt .din:eq(1)", options: ".clearfix div", $options: ".clearfix .xuan,input" }, ignore_click: $item => { return $item.parent().hasClass("cur"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find("div .fb:eq(0)").text()); } }); WorkerJSPlus({ name: "易班考试", match: location.host === "exam.yooc.me" && location.pathname.includes("/group"), intv: () => { return $(".jsx-3527395752").length; }, root: "main:last", elements: { question: "h3 div", options: ".mb ul li .flex-auto", $options: ".mb ul li", type: ".mb-s" }, ignore_click: $item => { return $item.hasClass("_c"); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $(".exam-input").val("answer"); } }, finished: need_jump => { if ($('.round:contains("下一题")').hasClass("ghost")) return false; $('.round:contains("下一题")').click(); return true; } }); WorkerJSPlus({ name: "英华学堂作业", match: location.host === "mooc.yncjxy.com" && location.pathname.includes("/user/work") || location.pathname.includes("/user/exam"), intv: () => { return $("#stateName").text().trim() === "进行中"; }, root: ".courseexamcon-main", elements: { question: ".name", options: ".list li .txt", $options: ".list li .exam-inp", type: ".type" }, ignore_click: $item => { return $item.prop("checked"); }, fill: (type, answer, $option) => {}, finished: auto_jump => { if ($(".next_exam").eq(3).prop("style")[0] == "display") return false; $(".next_exam").click(); return true; } }); WorkerJSPlus({ name: "英华学堂考试", match: location.host === "mooc.yncjxy.com" && location.pathname.includes("/user/exam"), intv: () => { return $("#stateName").text().trim() === "进行中"; }, root: ".courseexamcon-main", elements: { question: ".name", options: ".list li .txt", $options: ".list li .exam-inp", type: ".type" }, ignore_click: $item => { return $item.prop("checked"); }, finished: auto_jump => { if ($(".next_exam").eq(3).prop("style")[0] == "display") return false; $(".next_exam").click(); } }); WorkerJSPlus({ name: "厦门在线教育测验", match: location.pathname.includes("/nec/student/exam/exam-paper!test"), root: "td:contains('分)')", elements: { question: "td:contains('分)')", options: ".optionUl label .el-radio__label,.el-checkbox__label", $options: ".optionUl label" }, wrap: obj => { obj.question = obj.$item; obj.options = obj.question.parent().next().find("tbody tbody td:last-child").map((i, y) => { return $(y).text(); }); obj.type = 0; obj.$options = obj.question.parent().next().find("tbody tbody input:last-child").map((i, y) => { return y; }); obj.question = $(obj.question).text(); } }); WorkerJSPlus({ name: "金牌学堂", match: location.host === "www.goldgame.com.cn" && location.href.includes("/TestPage"), intv: () => { return $(".tab-btn-box li").length; }, root: ".test-type-box ul .white-bg", elements: { question: ".position-relative h3", options: ".test-option label p:last-child", $options: ".test-option label input" }, wrap: obj => { obj.question = obj.question.replace(/题目\d+\:/, "").trim().replace(/^\d+./, ""); obj.type = getQuestionType(obj.$item.parent().parent().find(".test-type-tips").text()); if (obj.$options.length > 2 && obj.$options.eq(0).hasClass("radiobox")) { obj.type = 0; } }, fillFinish: data => { $(".answer-sheet li").eq(GLOBAL.index).click(); } }); WorkerJSPlus({ name: "青岛开放大学", match: location.pathname.includes("/pages/exam/exam.html"), intv: () => { return $(".exam-content-block .exam-content-topic").length; }, root: ".exam-content-block .exam-content-topic", elements: { question: ".exam-topic-title", options: ".exam-topic-answer .layui-unselect span", $options: ".exam-topic-answer .layui-unselect" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".exam-content-title .exam-content-num").text()); } }); WorkerJSPlus({ name: "点墨考试", match: location.pathname.includes("/Exam/StartExam"), root: "#question div div:first", elements: { question: "div:first", options: "div:first ~ div", $options: "div:first ~ div input" }, wrap: obj => { obj.type = getQuestionType($(".alert #groupNameSpan").text()); }, finished: () => { $(".w-100 .btn-light:eq(1)").click(); return true; } }); WorkerJSPlus({ name: "点墨测验", match: location.pathname.includes("/Course/TestPaper"), root: ".question", elements: { question: " div div:first div:first", options: " div div:first div:first ~ div", $options: " div div:first div:first ~ div input" }, wrap: obj => { obj.type = getQuestionType($("h3").text()); obj.question = obj.question.replace(/^\d+\./, ""); } }); WorkerJSPlus({ name: "警官学院", match: location.pathname.includes("/bsmytest/startTi.do"), root: ".wrapper > div", elements: { question: ".dx", options: "p", $options: "p input" }, wrap: obj => { if ($(".wrapper .cl").length > 0) { obj.question = obj.$item.text().replace(/[0-9]、/, "").replace(/\(.*?\)/g, "").trim().split("$")[0].replace(/\(.*?\)/g, "").trim(); } else { obj.question = obj.question.replace(/[0-9]、/, "").replace(/\(.*?\)/g, "").trim(); } obj.type = getQuestionType(obj.$item.parent().find("h2").text()); obj.options = obj.options.map(item => { return item.replace(/[A-Za-z][\:]/, "").replace(/[A-Za-z][\:,\:]/, "").replace(/\;/, "").trim(); }); } }); WorkerJSPlus({ name: "exam2_euibe_com_exam", match: location.hostname === "exam2.euibe.com" && location.pathname === "/KaoShi/ShiTiYe.aspx", root: ".question", elements: { question: ".wenti", options: "li label span", $options: "li label" }, wrap: obj => { obj.type = getQuestionType($(".question_head").text()); }, finished: need_jump => { $(".paginationjs-next").click(); return true; } }); WorkerJSPlus({ name: "lzwyedu_jijiaool_com_exam", match: location.hostname === "lzwyedu.jijiaool.com" && location.pathname.includes("/Student/ExamManage/CourseOnlineExamination"), root: ".test_item", elements: { question: ".test_item_tit", options: ".test_item_theme label .zdh_op_con", $options: "li label input" }, wrap: obj => { obj.question = obj.question.replace(/该题未做$/, "").replace(/^\d+\./, ""); obj.type = getQuestionType(obj.$item.prevAll(".test_item_type:first").text()); } }); WorkerJSPlus({ name: "zzx_ouchn_edu_cn_exam", match: location.hostname === "zzx.ouchn.edu.cn" && location.pathname.includes("/edu/public/student/"), root: ".subject", elements: { question: ".question span", options: ".answer>span>p:first-child", $options: ".answer>span>p:first-child" }, wrap: obj => { if (obj.$options.length > 1) { obj.type = 0; } } }); WorkerJSPlus({ name: "havust_hnscen_cn_exam", match: location.hostname === "havust.hnscen.cn" && location.pathname.includes("/stuExam/examing/"), root: ".main .mt_2 > div", elements: { question: ".flex_row+div", options: ".flex_row+div+div .el-radio__label,.el-checkbox__label", $options: ".flex_row+div+div .el-radio__label,.el-checkbox__label", type: ".flex_row .mr_2" } }); WorkerJSPlus({ name: "www_zygbxxpt_com_exam", match: location.hostname === "www.zygbxxpt.com" && location.pathname.includes("/exam"), root: ".Body", elements: { question: ".QName", options: ".QuestinXuanXiang p:parent", $options: ".QuestinXuanXiang p:parent", type: ".QName span" }, wrap: obj => { obj.question = obj.question.replace(/\([^\)]*\)/g, "").replace(/\【.*?\】/g, ""); obj.options = obj.options.map(item => { return item.split(">").pop().trim(); }); } }); WorkerJSPlus({ name: "xuexi_jsou_cn_work", match: location.hostname === "xuexi.jsou.cn" && location.pathname.includes("/jxpt-web/student/newHomework/showHomeworkByStatus"), root: ".insert", elements: { question: ".window-title", options: ".questionId-option .option-title div[style^=display]", $options: ".questionId-option .option-title .numberCover" }, wrap: obj => { obj.type = { 1: 0, 2: 1 }[obj.$item.find(".question-type").val()]; } }); WorkerJSPlus({ name: "czvtc_cjEdu_com_exam", match: location.host.includes("czvtc.cj-edu.com") && location.pathname.includes("/ExamInfo"), intv: () => { return $(".el-container .all_subject>.el-row"); }, root: ".el-container .all_subject>.el-row", elements: { question: ".stem div:last-child", options: ".el-radio-group .el-radio__label", $options: ".el-radio-group .el-radio__original" }, wrap: obj => { if (obj.$options.length < 3 && obj.$options.eq(0).attr("type") === "radio") { obj.type = 3; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") === "radio") { obj.type = 0; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") === "checkbox") { obj.type = 1; } } }); WorkerJSPlus({ name: "learning_mhtall_com_exam", match: location.host.includes("learning.mhtall.com") && location.pathname.includes("/rest/course/exercise/item"), root: "#div_item", elements: { question: ".item_title", options: ".opt div label", $options: ".opt div input:not(.button_short)", type: "h4" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { if (obj.type === 0 || obj.type === 3) { obj.answer = $(".div_answer").text().match(/[a-zA-Z]/).map(i => { return obj.options[i.charCodeAt(0) - 65]; }); } else if (obj.type === 2) { obj.answer = $(".div_answer").text().replace("参考答案:", "").split(","); } }, fill: (type, answer, $option) => { if (type === 2 || type === 4) { $option.val(answer); $(".DIV_TYPE_BLANK .button_short").click(); } }, fillFinish: () => { if ($(".opt+div+div input:eq(1)")) { $(".opt+div+div input:eq(1)").click(); } else { $(".button_short:eq(2)").click(); } } }); WorkerJSPlus({ name: "长安大学", match: location.host.includes("168wangxiao.com") && location.pathname.includes("/web/learningCenter/details/"), intv: () => { return $(".ret-answer").length === 0 && $(".info-container").length; }, root: ".question-item-container", elements: { question: ".title-content", options: ".options .opt-content", $options: ".options label", type: ".top .type" } }); WorkerJSPlus({ name: "法宣在线", match: location.host === "faxuanyun.com" && location.pathname.includes("/bps/examination"), intv: () => { return $("#timucontent").length; }, root: "#timucontent", elements: { question: "h2", options: "ul li", $options: "ul input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = obj.question.replace(/[\((].+?[)\)]/g, ""); if ($(".layui-layer-content").length) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); $("#lastButton").click(); GLOBAL.stop = true; return false; } }, finished: need_jump => { if ($("#nextButton").length) { $("#nextButton").click(); return true; } else { return false; } } }); WorkerJSPlus({ name: "云南知识竞赛", match: location.host.includes("zhixinst.com") && location.pathname === "/exam/exam", root: ".question-main", elements: { question: ".question-title div", options: ".question-options .options-list", $options: ".question-options .options-list", type: ".question-type" }, wrap: obj => { obj.options = obj.options.map(i => { return i.replace(/^[A-D]/, ""); }); }, finished: need_jump => { const index = parseInt($(".question-index").text().replace(".", "")); const totalLen = document.querySelectorAll("html body div#app div.page-loyout div.page-answer.page-container div.answer-container.container div.answer-main div.report-aside.display1 div.report-main div.el-scrollbar div.el-scrollbar__wrap div.el-scrollbar__view div.report-answer.clearfix div").length; if (index !== totalLen) { $(".next-btn").click(); return true; } } }); WorkerJSPlus({ name: "国开", match: location.host === "lms.ouchn.cn" && location.pathname.includes("/exam/"), intv: () => { return $(".loading-gif").hasClass("ng-hide") && $(".hd .examinee .submit-label").eq(0).text() === ""; }, root: ".card ol .single_selection,.multiple_selection,.true_or_false,.short_answer", elements: { question: ".summary-title p,.summary-title .ng-scope", options: ".subject-options li .option-content", $options: ".subject-options label .left", type: ".summary-sub-title span:eq(0)" }, ignore_click: ($item, type) => { return type === 1 && $item.find("input").hasClass("ng-not-empty"); } }); WorkerJSPlus({ name: "广开", match: () => { const pathMatch = location.pathname.includes("/mod/quiz/attempt.php"); const matchHostArr = [ "moodle.syxy.ouchn.cn", "xczxzdbf.moodle.qwbx.ouchn.cn", "elearning.bjou.edu.cn", "course.ougd.cn", "study.ouchn.cn" ]; return pathMatch && matchHostArr.includes(location.host); }, root: ".que", elements: { question: ".qtext", options: ".answer div label,.flex-fill", $options: ".answer div input:visible" }, ignore_click: $item => { return Boolean($item.parent().find("input").eq(-1).prop("checked")); }, finished: () => { $(".submitbtns .btn-primary").click(); } }); WorkerJSPlus({ name: "保定继续教育", match: location.pathname.includes("/exam/answer.html"), root: ".stem-container", elements: { question: ".stem span", options: ".option div .optStem", $options: ".option div input" }, intv: () => { return $("#question").length; }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().parent().find(".description").text()); } }); WorkerJSPlus({ name: "noNiExam.js", match: location.pathname === "/app-afstudy/self_test.html", root: ".lineClass .b-papp-root", elements: { question: ".b-exam-top .b-exam-tit", options: ".b-exam-box li label", $options: ".b-exam-box li input", type: ".b-exam-top .b-exam-type" }, ignore_click($item) { return $item.prop("checked"); }, wrap(obj) { obj.options = obj.options.map(i => { return i.replace(/[A-Za-z][\:]/, "").replace(/[A-Za-z][\:,\:]/, "").replace(/\;/, "").trim(); }); } }); WorkerJSPlus({ name: "www_pbaqks_com_text", match: location.host === "www.pbaqks.com" && location.pathname.includes("/P_ExamDetail/OnlineStuday"), root: ".main-container .single-box", elements: { question: ".single-main:first", options: ".choose-box label", $options: ".choose-box label", type: ".single-container .font-title", answer: "input:eq(1)" }, ignore_click: $i => { return $i.find("input").is(":checked"); }, wrap: obj => { obj.question = obj.question.replace("标准答案", "").replace(/^\d+\./, "").replace(/\[.+?\]/g, "").trim(); }, fillFinish: () => { if ($(".main-container .single-box").find("input:eq(1)").eq(GLOBAL.index - 1).attr("value").split("").length > 1) { jQuery(".main-container .confirm a:last-child").click(); } } }); WorkerJSPlus({ name: "安徽继续教育", intv: () => { if (location.pathname.includes("/study/html/content/studying/")) return true; return $(".e-save-b").length || $(".e-b-g").length; }, match: location.pathname.includes("/study/html/content/studying/") || (location.pathname === "/study/html/content/tkOnline/" || location.pathname === "/study/html/content/sxsk/"), root: ".e-q", elements: { question: ".e-q-q .ErichText", options: ".e-a-g li", $options: ".e-a-g li" }, hook: () => { JSONParseHook(o => { if (location.pathname.includes("/study/html/content/studying/")) { if (o.data && (o.status === 2 || o.status === 1) && o.state !== "doing") { GLOBAL.finish = true; const result = parseAnHuiJx(o.data); uploadAnswer(result.flat()); } } else if (o.code && o.data && o.doingPaperId) { const result = parseAnHuiJx(o.data); uploadAnswer(result.flat()); } }); if (GLOBAL.finish || $("a:contains(已完成批阅)").length === 1) { iframeMsg("tip", { type: "hidden", tip: "本页面已做完,无需自动答题" }); return true; } }, ignore_click: $item => { return $item.attr("class").includes("checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().prev().find(".e-text").text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/^[ab]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); } }); WorkerJSPlus({ name: "大连/九江", match: location.href.includes("/onlineclass/exam/"), root: ".single_excer_item___2lGB8", elements: { question: ".title_content___24J6D .title_content_text___8ruL4", options: ".options_content___2YgyG label .option_text___1mfcu", $options: ".options_content___2YgyG label input", type: ".title_content___24J6D span:eq(1)" }, intv: () => { return $(".excer_list_view___YOSCa").length; }, ignore_click: $item => { return $($item).parent().hasClass("ant-checkbox-checked"); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "新疆继续教育", hook: () => { function parseXinJiangAgain(questions) { return questions.map(item => { const answer = []; const options = item.answers.map(opt => { if (opt.isAnswer === "0") answer.push(formatString(opt.name)); return formatString(opt.name); }); const type = item.types === "2" ? 3 : parseInt(item.types); return { question: item.name, options: options, answer: answer, type: type }; }); } JSONParseHook(o => { if (o.success && o.data.exam) { const arr = o.data.exam.assessList.map(i => { return i.questionList; }).flat(); GLOBAL.json = parseXinJiangAgain(arr); } }); }, match: location.host === "www.ttcdw.cn" && location.pathname.includes("/p/uExam/goExam/"), root: ".question-item", elements: { question: ".question-item-title span", options: ".question-item-option label .el-checkbox__label,.el-radio__label", $options: ".question-item-option label" }, wrap: obj => { Object.assign(obj, GLOBAL.json[GLOBAL.index - 1]); }, intv: () => { return !$("div").hasClass("entrying-wrap"); }, ignore_click: $item => { return $item.hasClass("is-checked"); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "华侨继续教育", match: location.pathname.includes("/exam/student/exam/resource/paper_card2"), intv: () => { return $(".ui-question-answer-right").length === 0; }, root: ".ui-question-group .ui-question", elements: { question: ".ui-question-title div", options: ".ui-question-options div", $options: ".ui-question-options .ui-question-options-order,.ke-container" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find("h2").text()); }, ignore_click: $item => { return $item.parent().hasClass("ui-option-selected"); }, fill: (type, answer) => { if (type === 4 || type === 2 || type === 6) { const x = GLOBAL.index - $(".ui-question-options ").length - 1; KindEditor.instances[x].html(answer); } } }); WorkerJSPlus({ name: "上海开放大学", match: location.pathname.includes("/study/assignment/preview.aspx") || location.pathname.includes("/study/assignment/continuation.aspx"), hook: () => { if (GLOBAL.finish || $("a:contains(已完成批阅)").length === 1) { iframeMsg("tip", { type: "hidden", tip: "本页面已做完,无需自动答题" }); return true; } }, root: ".e-q", elements: { question: ".e-q-q .ErichText", options: ".e-a-g li", $options: ".e-a-g li" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().parent().parent().find(".e-text").eq(0).text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.attr("class").includes("checked"); } }); WorkerJSPlus({ name: "浙江考试", match: location.pathname === "/web-qz/moni/exam/exam_toExam.action", root: ".dt_tmcon", elements: { question: "div:eq(0) span:eq(1)", options: "div:eq(1) p", $options: "div:eq(1) p input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parents().find(".dt_rtitle1").eq(0).text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); if (obj.type === 0) { obj.answer = [ JSON.parse($("#quesSSForm #userAnssStr_0").val()).rightAnswer ]; uploadAnswer([ obj ]); } }, finished: () => { return $(".page li input:eq(2)").attr("disabled") !== "disabled"; }, fillFinish: () => { $(".page li input:eq(2)").click(); } }); WorkerJSPlus({ name: "在浙学考试", match: location.host === "www.zjooc.cn", hook: () => { JSONParseHook(o => { if (o.data && o.data.paperName && o.data.clazzIds && o.data.paperSubjectList) { const data = parseZaiZheXue(o.data.paperSubjectList); uploadAnswer(data); } }); }, intv: () => { return location.pathname.includes("/homework/do/") || location.pathname.includes("/test/do/") || location.pathname.includes("/exam/do/"); }, root: ".questiono-item", elements: { question: "h6 .processing_img", options: ".questiono-main label .el-radio__label,.el-checkbox__label", $options: ".questiono-main label" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().prev().text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.hasClass("is-checked"); } }); WorkerJSPlus({ name: "在浙学测验", match: location.host === "www.zjooc.cn", intv: () => { return $(".settingsel-dialog").css("display") === "none"; }, root: ".question_content", elements: { question: ".question_title", options: ".question_content .radio_content div", $options: ".question_content label" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".question_title p").eq(0).text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.hasClass("is-checked"); }, finished: () => { if ($(".question_btn .el-button:contains(下一题)").hasClass("is-disabled")) return false; $(".el-button:contains(下一题)").click(); return true; } }); WorkerJSPlus({ name: "福建继续教育测验", match: location.pathname === "/Web_Study/Student/Center/MyWorkOnView" || location.pathname === "/Web_Study/Student/Center/MyExamOnView", intv: () => { return $(".samllTopicNav").length; }, root: ".topic-cont", elements: { question: ".text", options: ".options li span", $options: ".options li" }, wrap: obj => { obj.options = obj.options.map(i => { return i.replace(/选项[A-Za-z]/, "").trim(); }); if (obj.$item.attr("itemtype") === 1) { obj.type = 0; } else if (obj.$item.attr("itemtype") === 2) { obj.type = 1; } else if (obj.$item.attr("itemtype") === 3) { obj.type = 3; } }, ignore_click: $item => { return $item.hasClass("correct"); } }); WorkerJSPlus({ name: "湖南继续教育", match: location.host === "www.jwstudy.cn" && location.pathname.includes("/User/Student/myhomework.aspx") || location.pathname.includes("/examing.aspx"), root: ".exam_question", elements: { question: ".exam_question_title div", options: ".question_select .select_detail", $options: ".question_select li", type: ".exam_question_title div strong" }, ignore_click: $item => { return $item.hasClass("cur"); } }); WorkerJSPlus({ name: "德阳继续教育", match: location.href.includes("/dypx/OnlineExam/Exam.aspx"), root: "#divProblemArea", elements: { question: "#ulProblems li:first", options: "#ulProblems .answer", $options: "#ulProblems .answer input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { if ($("#ulProblems .answer input").length < 3 && $("#ulProblems .answer input").eq(0).attr("type") === "radio") { obj.type = 3; obj.options = [ "正确", "错误" ]; } else if ($("#ulProblems .answer input").length > 2 && $("#ulProblems .answer input").eq(0).attr("type") === "radio") { obj.type = 0; } else if ($("#ulProblems .answer input").length > 2 && $("#ulProblems .answer input").eq(0).attr("type") === "checkbox") { obj.type = 1; } }, finished: () => { if ($(".dlg").length) return false; $("#divBtns input:eq(1)").click(); return true; } }); WorkerJSPlus({ name: "淄博继续教育", match: location.pathname.includes("/practice/start"), root: ".header-left .trueorfalse .sub", elements: { question: ".mb10", options: ".options li", $options: ".options li" }, ignore_click: $item => { return $item.hasClass("active"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().prev().text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); } }); WorkerJSPlus({ name: "河北继续教育", match: location.pathname.includes("paperid"), root: ".examItem", elements: { question: ".examItemRight .question", options: ".examItemRight ul li span", $options: ".examItemRight ul li" }, ignore_click: $item => { return $item.hasClass("cur"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".questTitle b").text()); } }); WorkerJSPlus({ name: "保定继续教育", match: location.pathname.includes("/cuggw/rs/olex_exam") || location.pathname.includes("/hebic/rs/olex_exam") || location.pathname.includes("/sjzkjxy/rs/olex_exam"), intv: () => { return $(".paper_body").length; }, root: ".item_li", elements: { question: ".item_title", options: "ul li label", $options: "ul li input" }, wrap: obj => { if (obj.$options.length === 2) { obj.type = 3; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") === "radio") { obj.type = 0; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") !== "radio") { obj.type = 1; } else { obj.type = 4; } } }); WorkerJSPlus({ name: "唐山继续教育", match: location.pathname.includes("/exam/student/exam/"), intv: () => { return $(".ui-question-group").length; }, root: ".ui-question-group .ui-question", elements: { question: ".ui-question-title .ui-question-content-wrapper", options: ".ui-question-options .ui-question-content-wrapper", $options: ".ui-question-options .ui-question-options-order" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find("h2").text()); } }); WorkerJSPlus({ name: "", match: location.host.includes("hnzkw.org.cn"), intv: () => { return $(".answer").length; }, hook: () => { JSONParseHook(() => { if (o.data && o.data.bookdatas) { GLOBAL.json = parsehnzkwText(o.data.bookdatas); console.log(GLOBAL.json); } }); }, root: ".examList", elements: { question: ".text", options: ".el-radio-group label", $options: ".el-radio-group label", type: ".status" }, wrap: obj => { Object.assign(obj, GLOBAL.json[GLOBAL.index - 1]); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.attr("name")).setContent(answer); } } }); WorkerJSPlus({ name: "问卷星考试", match: location.pathname.includes("/exam/ExamRd/Answer"), root: ".g-mn", elements: { question: ".m-question .tigan", options: ".question-block .xuanxiang", $options: ".question-block .xuanxiang", type: ".tixing" }, ignore_click: ($item, type) => { if (type === 1) { return $item.parent().find(".icheckbox_square-green").hasClass("checked"); } else { const isIgnore = $item.parent().find(".iradio_square-green").hasClass("checked"); if (isIgnore) $('.u-btn-next:contains("下一题")').click(); return isIgnore; } }, wrap: obj => { if ($(".layui-layer-content").length) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; return true; } }, fillFinish: data => { if (!data.ok || data.type !== 0 || data.type !== 3) { $('.u-btn-next:contains("下一题")').click(); } }, finished: () => { return parseInt($(".num-dangqian:last").attr("qindex")) !== $(".num-item").length; } }); })();