您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
这个脚本可以帮助你绕过问卷星的复制限制,并且可以直接在问卷星的答题页面搜索答案,防止被企业版防作弊检测。同时可以自动清理cookie来绕过设备限制(部分浏览器可用)
当前为
// ==UserScript== // @name EasyWJX-破解问卷星复制限制,全自动填写答案,绕过微信限制 // @namespace http://tampermonkey.net/ // @version 2.0.1 // @description 这个脚本可以帮助你绕过问卷星的复制限制,并且可以直接在问卷星的答题页面搜索答案,防止被企业版防作弊检测。同时可以自动清理cookie来绕过设备限制(部分浏览器可用) // @author MelonFish // @match https://ks.wjx.top/*/* // @match http://ks.wjx.top/*/* // @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net // @grant none // @license GNU GPLv3 // ==/UserScript== (function() { 'use strict'; // Config var EasyWJX_version = '2.0.1'; var server_ip='xq.kzw.ink:8800'; var toolbox_ext = [] var addToWindow_func = [addButtonToToolbox, getWJID, findAnswerFromAnswerLs, btnclicktourl, btnclick, getToolbox, getReallyIdAndDatakey, getAllAnswer,addGetOneAnswerAndWriteOneAnswerClassToWindow, writeAllAnswer, parseManyinputAnswer, randomNum, sleep, insertAfter, parseDom, getQueryString, copy_to_clipboard, clearCookie, deleteAllCookies, clearStorage] // 初始化 initElement(); compatibleOld(); // 初始化页面元素 async function initElement() { console.log("EasyWJX is running. From xq.kzw.ink. Version "+EasyWJX_version); if(window.location.protocol == 'https:') { console.log('EasyWJX不能再https下正常运行,正在刷新到http。。。'); window.location.href = window.location.href.replace('https', 'http'); } // 引入layui 和jquery // 问:这里为什么不用自带的require引入? // 答:第一,require不能引入css。第二,直接引入layer组建会导致显示异常,因此需要单独引入juqery和layer(属于技术原因受限)。第三,下面的三个库均已被GreasyFork认可(可前往https://greasyfork.org/zh-CN/help/cdns 进行审查)。 // 根据GreasyFork脚本规则“库是应被 @require 的脚本,除非因为技术原因不能这么做。如果一个库被内嵌入了脚本,那么你必须一并提供库的来源(比如一行评论指向原始地址、名称以及版本)。” // 我们在下方介绍了对应的库的原始地址、名称以及版本,并且说明了是因为技术原因而不能使用require引用。 $('head').append($('<link rel="stylesheet" href="https://www.layuicdn.com/layui/css/layui.css">')) // 名称:layui,版本:2.7.6,原始地址:https://www.layuicdn.com/#Layui $('head').append($('<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>')) // 名称:jquery,版本:3.6.1,原始地址:https://www.bootcdn.cn/jquery/ if (typeof layer == 'undefined') { $('head').append('<script src="https://www.layuicdn.com/layer-v3.5.1/layer.js"></script>') // 名称:layer,版本:3.5.1,原始地址:https://www.layuicdn.com/#Layer } // 等待layer加载成功 while (true) { if (typeof layer != 'undefined') { break } await sleep(0.5) } //显示加载标签 var load_icon = layer.load(1); // 解除复制粘贴限制 setTimeout(function () { $(".textCont,input,textarea").off(); },2000) $(".textCont,input,textarea").off(); // 既不生效,再来一次又何妨 document.oncontextmenu = function () {return true;}; document.onselectstart = function () {return true;}; $("body").css("user-select", "text"); syncManyinput(); // 检查是否需要清理cookie,是否需要绕过微信限制,放一个定时器时刻检查是否需要绕过企业版限制 setTimeout(function () { checkNeedRemoveCookie(); checkNeedBypassWechat(); checkNeedExpandPage() },1000) var checkNeedBypassEnterprise_interval = setInterval(function () { checkNeedBypassEnterprise(checkNeedBypassEnterprise_interval) }, 2000) // 留个标记不过分吧? $('#spanPower').html('<a href="https://xq.kzw.ink" title="线圈脚本">线圈脚本</a><span>提供破解</span>'); // 初始化一个按钮,并当作功能栏 var ctrl_btn = document.createElement("div"); // 一些样式定义,一行三个,节省空间 ctrl_btn.style.position = 'fixed'; ctrl_btn.style.height = '3rem'; ctrl_btn.style.width = '3rem'; ctrl_btn.style.background = 'url(https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7c225101-813b-41f0-bcda-b99f9ef1c986/70ae58b2-52aa-47d3-b5d1-6a1d6d168d6b.png)'; ctrl_btn.style.backgroundSize = '2rem 2rem'; ctrl_btn.style.backgroundColor = 'white'; ctrl_btn.style.borderRadius = '1.5rem'; ctrl_btn.style.boxShadow = '0px 0px 20px 1px Gray'; ctrl_btn.style.backgroundRepeat = 'no-repeat'; ctrl_btn.id = 'ctrl_btn'; ctrl_btn.style.right = '1rem'; ctrl_btn.style.bottom = '10rem'; ctrl_btn.style.backgroundPosition = 'center'; ctrl_btn.onclick = function (e) { // 显示工具栏 layer.open({ type: 1, skin: 'layui-layer-rim', //加上边框 area: ['80%', '80%'], //宽高 content: getToolbox(), title: 'EasyWJX操作栏', success: function(layero, index){ initToolboxListener(); checkLocalAndCtrlElem(); if (toolbox_ext.length !=0) { $('#ext_line').css('display', 'block') } $('.easywjx_btn').on('click', function () { layer.close(index) console.log('有一个按钮被点击,toolbox已关闭') }) } }); } $('body').append(ctrl_btn); // 执行进入成绩界面的默认操作 checkLocalIsResultAndDoSth() // 绑定tips layer.tips('点击以使用EasyWJX', '#ctrl_btn'); // 将函数加载到window initAllFuncToWindow() // 显示每道题旁的按钮 initButtonNearQuestion() // 初始化结束,发送消息 initMsgSender(); // 结束加载标签 layer.close(load_icon) } // 初始化一个toolbox监听器 function initToolboxListener(){ btnclicktourl('#getmore_btn', 'https://greasyfork.org/zh-CN/scripts?q=EasyWJX') btnclicktourl('#goto_greasyfork_btn', 'https://greasyfork.org/zh-CN/scripts/452006') btnclicktourl('#heydeveloper_btn','https://space.bilibili.com/1946156137') btnclick('#chat_btn', function () { layer.open({ type: 2, title: 'EasyWJX问题反馈与讨论', shadeClose: true, shade: false, maxmin: true, //开启最大化最小化按钮 area: ['80%', '80%'], content: 'https://xq.kzw.ink/?wjx', success: function(layero, index){ console.log('打开了XChat') }, cancel: function (){ console.log('关闭了XChat') } }); }) btnclick('#change_score_btn', function () { if ($(".score-form__list.clearfix .tht-content").text().indexOf('名')>=0) { layer.prompt({title: '修改后的名次(如果没有排名或者排名修改后出错请点击取消或留空)', formType: 0}, function(text, index){ layer.close(index); $(".score-form__list.clearfix .tht-content").eq(1).text("第"+text+"名") }); } layer.prompt({title: '修改后的正确题数(注意不要大于总题数)', formType: 0}, function(text, index){ layer.close(index); $(".score-form__list.clearfix .tht-content span").text(text) }); layer.prompt({title: '修改后的分数(注意不要大于总分)', formType: 0}, function(text, index){ layer.close(index); $(".score-font-style").eq(0).text(text) }); }) btnclick('#addtrueans_btn', function () { layer.prompt({title: '输入需要改为正确的题目ID,如需多个可用空格隔开,修改全部清输入“all”', formType: 0}, function(text, index){ layer.close(index); if (text!=null && text!="") { if (text!='all') { text = text.split(' ') for (var i=0; i<text.length; i++) { changeAnsToTrue(text[i]) } } else if (text=='all') { var ans_list = document.querySelectorAll('.data__items'); for (var i=0; i<ans_list.length; i++) { changeAnsToTrue(i) } } } }); }) btnclick('#clear_elem_btn', function () { $('#spanPower').html('<a href="https://www.wjx.cn/" target="_blank" title="问卷星_不止问卷调查/在线考试">问卷星</a><span>提供技术支持</span>') ctrl_btn.style.display = 'none' var ques_titles = $('.data__tit_cjd'); for (var i=0; i<ques_titles.length; i++) { ques_titles.eq(i).text(ques_titles.eq(i).text().split(' 题目ID:')[0]) } layer.msg('已清理页面') }) btnclick('#clear_ookie_btn', function () { deleteAllCookies(); clearCookie(); clearStorage(); }) btnclick('#auto_write_btn', function () { getAnswerFromServerAndWriteAllAnswer() }) } // 初始化每道题旁边的按钮 function initButtonNearQuestion(){ var div_list = $(".field-label"); // 放置搜索、复制按钮 for (var i=0; i<div_list.length; i++) { var search_btn = $(`<button type="button" class="layui-btn layui-btn-xs" id="search_btn_${i}" style="margin-left:1rem;">搜索</button>`) var copy_btn = $(`<button type="button" class="layui-btn layui-btn-xs" id="copy_btn_${i}" style="margin-left:1rem;">复制</button>`) search_btn.on('click', function (e) { var btn_num = parseInt(e.target.id.split('_')[2]) var search_content = div_list.eq(btn_num).text().replace('搜索', '').replace('已复制','').replace('复制','').replace('*', '').replace('收起', ''); var btn_txt = e.target.innerText if (btn_txt=="搜索") { var search_iframe = $(` <div style='margin-top:1rem;' id='search_div_${btn_num}'> <div class='layui-col-xs10 layui-col-sm10 layui-col-md10'><input type="text" name="url" value='https://www.bing.com/search?q=${search_content}' placeholder="请输入网址" autocomplete="off" class="layui-input" id='url_input_${btn_num}'></div> <button type="button" class="layui-btn layui-btn-normal layui-col-xs2 layui-col-sm2 layui-col-md2" id='gotourl_btn_${btn_num}'>前往</button> </div> <iframe src='https://www.bing.com/search?q=${encodeURIComponent(search_content)}' style='height:20rem; width:100%' id='search_iframe_${btn_num}'></iframe> `) div_list.eq(btn_num).append(search_iframe) $(`#gotourl_btn_${btn_num}`).on('click', function () { var url_input = $(`#url_input_${btn_num}`).val() $(`#search_iframe_${btn_num}`).attr('src', encodeURI(url_input)) }) e.target.innerText="收起"; } else { e.target.innerText="搜索"; $(`#search_iframe_${btn_num}, #search_div_${btn_num}`).remove() } }) copy_btn.on('click', function (e) { var btn_num = parseInt(e.target.id.split('_')[2]) var copy_content = div_list.eq(btn_num).text().replace('搜索', '').replace('已复制','').replace('复制','').replace('*', '').replace('收起', ''); copy_to_clipboard(copy_content) e.target.innerText ="已复制"; setTimeout(function(){ e.target.innerText="复制"; },2000) }) div_list.eq(i).append(search_btn) div_list.eq(i).append(copy_btn) } } // 快速绑定按钮点击并打开链接 function btnclicktourl(query, url) { btnclick(query, function () { window.open(url).location; }) } // 初始化成绩页面的题目id function initResultQuesID() { var ques_titles = $('.data__tit_cjd'); for (var i=0; i<ques_titles.length; i++) { ques_titles.eq(i).text(ques_titles.eq(i).text()+' 题目ID:'+i) } } // 在点击toolbox的时候判断当前位置并隐藏对应元素 function checkLocalAndCtrlElem(){ // 判断所属位置,决定显示哪些按钮 if ($(".score-font-style").length>0) { $('#answer_done, #answer_done_line').css('display','block') } else { $('#answering, #answering_line').css('display','block') } } // 进入成绩页面要进行的默认操作 function checkLocalIsResultAndDoSth() { if ($(".score-font-style").length>0) { initResultQuesID() var load_icon = layer.load(1); setTimeout(function () { getAllAnswerAndUpdate() layer.close(load_icon) }, 1000) } } // 快速绑定按钮点击 function btnclick(query,func) { $(query).on('click', func) } // 初始化消息发送器,给其他脚本反复发送消息表示已加载完成 function initMsgSender() { setInterval(function () { var msg = {msg:'EasyWJX_ready', version: EasyWJX_version, code:0} window.postMessage(msg, '*'); }, 1000) } // 定义一个对外用于增加toolbox按钮的函数,内部不使用 function addButtonToToolbox(name, id) { toolbox_ext.push(`<button type="button" class="layui-btn layui-btn-warm easywjx_btn" id="${id}">${name}</button>`) } // 兼容旧版脚本和其他脚本(指去除layui自带样式) function compatibleOld(){ $('button').css('font-size','10px') } // 检查是否需要清理Cookies function checkNeedRemoveCookie() { if ($("#divTip").text().indexOf("最大填写次数")>=0) { layer.confirm('发现你可能被问卷星作答次数限制。点击“确定”以尝试绕过该限制。如果没有效果,请尝试更换浏览器、重启路由器(或开关飞行模式)', { btn: ['立即清理','取消'], //按钮 title: 'EasyWJX提示', }, function(index){ deleteAllCookies(); clearCookie(); clearStorage(); layer.close(index) }, function(){ console.log('取消清理cookie'); }); } } // 检查是否需要绕过微信限制 function checkNeedBypassWechat(){ if ($(".wxtxt").length >0) { layer.confirm('监测到微信限制。是否需要移除限制并查看题目(可以查看题目但无法提交)', { btn: ['立即绕过','取消'], //按钮 title: 'EasyWJX提示', }, function(index){ $("#zhezhao2").remove(); $("#divContent").removeClass('disabled').removeClass('isblur'); $("#ctlNext").text('破解后可能无法提交') setTimeout(function () { layer.msg('绕过限制后不能提交'); },500) layer.close(index) }, function(){ console.log('取消绕过微信限制'); }); } } // 检测是否需要绕过企业版跳出限制 function checkNeedBypassEnterprise(interval){ if ($(".fieldset").css('display') =='none') { layer.confirm('监测到疑似问卷星企业版作答限制。是否需要移除限制并继续作答?', { btn: ['立即绕过','取消'], //按钮 title: 'EasyWJX提示', }, function(index){ $('#ValError').css('display','none') $('.fieldset').css('display','block') layer.close(index) }, function(){ console.log('取消绕过企业版限制'); clearInterval(interval) }); } } // 检测是否需要展开分页 function checkNeedExpandPage() { if ($('.fieldset').length>1) { layer.confirm('检测到该问卷是分页问卷,请问是否需要自动展开问卷?', { btn: ['立即展开','取消'], //按钮 title: 'EasyWJX提示', }, function(index){ $('.fieldset').css('display','block') $('#divSubmit').css('display','block') $('#divMultiPage').css('display','none') layer.close(index) }, function(){ console.log('取消展开问卷'); }); } } // 将所有在列表中的函数初始化到window全局变量 function initAllFuncToWindow() { if (window.easywjx == undefined) { window.easywjx = {} } // window.easywjx.getToolbox = getToolbox for (var i=0; i<addToWindow_func.length; i++) { window.easywjx[addToWindow_func[i].name] = addToWindow_func[i] } } // 获取工具栏需要的元素 function getToolbox() { var toolbox_html = `<div class="layui-btn-container" style="margin: 1rem;" id="easywjx_toolbox"> <div id='answering' style='display:none;'> <button type="button" class="layui-btn layui-btn-normal easywjx_btn" id="auto_write_btn">自动填写</button> <button type="button" class="layui-btn layui-btn-normal easywjx_btn" id="clear_ookie_btn">清理数据</button> </div> <hr class="layui-border-black" id="answering_line" style="display:none;"> <div id='answer_done' style='display:none;'> <button type="button" class="layui-btn layui-btn-normal easywjx_btn" id="addtrueans_btn">添加答对题目</button> <button type="button" class="layui-btn layui-btn-normal easywjx_btn" id="clear_elem_btn">清理页面元素</button> <button type="button" class="layui-btn layui-btn-normal easywjx_btn" id="change_score_btn">修改成绩</button> </div> <hr class="layui-border-black" id="answer_done_line" style="display:none;"> <div id='ext'>`+toolbox_ext.join(' ')+`</div> <hr class="layui-border-black" id="ext_line" style="display:none;"> <div id='other'> <button type="button" class="layui-btn easywjx_btn" id="chat_btn">在线反馈问题</button> <button type="button" class="layui-btn easywjx_btn" id="heydeveloper_btn">联系开发者(Bilibili)</button> <button type="button" class="layui-btn easywjx_btn" id="goto_greasyfork_btn">前往脚本发布页面</button> <button type="button" class="layui-btn easywjx_btn" id="getmore_btn">获取更多脚本</button> </div> </div>` return toolbox_html } // 同步Manyinput的内容到真正的input标签 function syncManyinput() { setInterval(function () { var all_textCont = document.querySelectorAll('.textCont') for (var i=0; i<all_textCont.length; i++) { var input = all_textCont[i].parentNode.previousSibling; input.value = all_textCont[i].innerText } }, 1500) } // 将答案切换为正确 function changeAnsToTrue(str_id) { var id = parseInt(str_id); var ans_list_html = document.querySelector('.query__data-result.new__data-result'); var ans_title_list = ans_list_html.querySelectorAll('.data__tit_cjd') /* for (var i=0; i<ans_title_list.length; i++) { var title = ans_title_list[i].innerText //if (i!=parseInt(title.split('题目ID:')[1])) {console.log('我发现了一个i和id不符的')} if (parseInt(title.split('题目ID:')[1]) == id) { var num = i break; } } */ for (var i=0; i<ans_title_list.length; i++) { try{ ans_title_list[i].parentNode.querySelector('.judge_ques_right font').innerText=''; }catch{} } try{ if (ans_title_list[id].parentNode.querySelector('.judge_ques_right span').innerText=='回答错误') { ans_title_list[id].parentNode.querySelector('.judge_ques_right').style.color='#01AD56'; ans_title_list[id].parentNode.querySelector('.judge_ques_right img').src = '//image.wjx.cn/images/newimg/score-form/[email protected]'; ans_title_list[id].parentNode.querySelector('.judge_ques_right font').innerText=''; ans_title_list[id].parentNode.querySelector('.answer-ansys').remove() ans_title_list[id].parentNode.querySelector('.judge_ques_right span').innerText = '回答正确' } }catch{} } // ---------------------------------用于自动填写的代码【开始】---------------------------------- // 用于给服务器发请求 function sendUploadRequest(wj_id, content) { $.post('//'+server_ip+'/upload', {wj_id: wj_id, content: JSON.stringify(content)}, function (result) { console.log('服务器返回结果:',result) }) } // 获取题目的真实id function getReallyIdAndDatakey(str_id, kind='default') { var ans_list_html = document.querySelector('.query__data-result.new__data-result'); var ans_data_key_ls = ans_list_html.querySelectorAll('.data__items'); var id=-1 var ans_data_key = 'none' for (var i=0; i<ans_data_key_ls.length; i++) { try { var ques_id = ans_data_key_ls[i].querySelector('.data__tit_cjd').innerText.split('题目ID:')[1] } catch { var ques_id = '-1' } if (ans_data_key_ls[i].querySelector('.data__tit_cjd') && ques_id==str_id) { if (kind=='manyinput') { ans_data_key = ans_data_key_ls[i] } else { ans_data_key = ans_data_key_ls[i].querySelector('.data__key') } id = parseInt(ques_id) break } } return [ans_list_html, id, ans_data_key] } // 用于获取单个题目的类 class getOneAnswer { constructor() {} // 所有返回值格式:[结果, 类型] radio(str_id) { // 来转一段之前代码里的经典: 问:这段话的目的是什么?答:表达了作者对问卷星前端设计的不满,体现了作者不惧艰难、勇于破解的精神 // 问卷星迷惑行为: 是已选radio标志, 是未选标志,真的它俩不一样,不要尝试修改不然可能出问题。或者说我改成unicode字符是不是会好一点 // 好的我现在转换出来了,已选对应的unicode是\ue6df,未选对应的是\ue6e0,问卷星我真谢谢你 // 然后接着就发现h5里只支持10进制的所以还得转一下,现在h5对应的就是:选中:59103 未选:59104 // html里转译这种字符的方式就是:  // 又是阴间操作:多选题:勾选答案:, 未勾选: var [ans_list_html, id, ans_data_key] = getReallyIdAndDatakey(str_id) if (ans_data_key!='none' && ans_data_key.querySelectorAll('.ulradiocheck').length !=0){ var ans_span_txt = ans_data_key.querySelector('.judge_ques_right span').innerText; var ans_radio_list = ans_data_key.querySelectorAll('.ulradiocheck div') if (ans_radio_list[0].querySelector('i').innerText=='' || ans_radio_list[0].querySelector('i').innerText==''){ // 普通radio单选 var true_ans_num=-1 var i=0 if (ans_span_txt == '回答正确'){ true_ans_num = -1 for (i=0; i<ans_radio_list.length; i++) { if (ans_radio_list[i].querySelector('i').innerText=='') { true_ans_num = i break } } } else { var true_ans_txt = ans_data_key.querySelector('.answer-ansys div').innerText true_ans_num = -1 for (i=0; i<ans_radio_list.length; i++) { if (ans_radio_list[i].querySelector('span').innerText==true_ans_txt) { true_ans_num = i break } } } return [ans_radio_list[true_ans_num].querySelector('span').innerText, 'radio'] } else if (ans_radio_list[0].querySelector('i').innerText=='' || ans_radio_list[0].querySelector('i').innerText==''){ // radio多选 var true_ans_ls_txt = ''; if (ans_span_txt == '回答正确'){ for (var i=0; i<ans_radio_list.length; i++) { if (ans_radio_list[i].querySelector('i').innerText=='') { true_ans_ls_txt = true_ans_ls_txt+ans_radio_list[i].querySelector('span').innerText+'|'; } } true_ans_ls_txt = true_ans_ls_txt.slice(0,true_ans_ls_txt.length-1) } else { true_ans_ls_txt = ans_data_key.querySelector('.answer-ansys div').innerText.replace('┋', '|'); } return [true_ans_ls_txt, 'checkbox'] } } else { return ['none', "NOTRADIO"] } } input (str_id) { var [ans_list_html, id, ans_data_key] = getReallyIdAndDatakey(str_id) if (ans_data_key!='none' && ans_data_key.querySelectorAll('div').length!=0 && ans_data_key.querySelector('div').innerText!='' && ans_data_key.querySelectorAll('.ulradiocheck').length==0){ if (ans_data_key.querySelector('.judge_ques_right span')) { var ans_span_txt = ans_data_key.querySelector('.judge_ques_right span').innerText; } else {return ['none', "NOTINPUT"];} var ans_text = ans_data_key.querySelector('div').firstChild.nodeValue var true_ans = '' if (ans_span_txt == '回答正确'){ true_ans = ans_text } else { true_ans = ans_data_key.querySelector('.answer-ansys div').innerText } return [true_ans, 'input'] } else { return ['none', "NOTINPUT"] } } manyinput (str_id) { var [ans_list_html, id, ans_data_key] = getReallyIdAndDatakey(str_id, 'manyinput') if (ans_data_key=='none') { return ['none', 'NOTMANYINPUT'] } var content = ans_data_key.querySelector('.data__tit_cjd').innerText if (content.indexOf('【')<0 && content.indexOf('】')<0){ return ['none', 'NOTMANYINPUT'] } return [content, 'manyinput'] } } // 获取全部答案 function getAllAnswer(getAnswer_class) { var ans_list_html = document.querySelector('.query__data-result.new__data-result'); var ans_title_list = ans_list_html.querySelectorAll('.data__tit_cjd') var send_ls = [] var getAnswer = getAnswer_class for (var i=0; i<ans_title_list.length; i++) { var title = ans_title_list[i].innerText; //var str_id= title.split('题目ID:')[1]; // 这里发现tit_cjd里存放的序号就已经是题目ID了,改变策略。parseInt是支持数字的,所以不用改变太多内容。 // 下面这段代码请注意优先级,radio最高,manyinput其次,input最低 var ans,kind; try{ [ans,kind] = getAnswer.radio(i) }catch { [ans,kind] = ['none', "NOTRADIO"] } if (kind!='NOTRADIO') { send_ls.push({ques_id: i, answer: ans, kind: kind}) } else if (kind=='NOTRADIO') { //try { [ans,kind] = getAnswer.manyinput(i) //} catch { // [ans,kind] = ['none', 'NOTMANYINPUT'] //} if (kind!='NOTMANYINPUT') { send_ls.push({ques_id: i, answer: ans, kind: kind}) } else if (kind=='NOTMANYINPUT') { try { [ans,kind] = getAnswer.input(i) } catch { [ans,kind] = ['none', "NOTINPUT"] } if (kind!='NOTINPUT') { send_ls.push({ques_id: i, answer: ans, kind: kind}) } } } } return send_ls } // 上传答案到服务器 function getAllAnswerAndUpdate() { // 上传答案 var wj_id = getWJID() var getAnswer_class = new getOneAnswer() var send_ls = getAllAnswer(getAnswer_class) console.log(send_ls) sendUploadRequest(wj_id, send_ls) } // 从答案列表查找该题答案 function findAnswerFromAnswerLs(find_id,answer_ls) { for (var i=0; i<answer_ls.length; i++) { if (parseInt(answer_ls[i].ques_id) == parseInt(find_id)) { return answer_ls[i] } } return "NOANSWER" } class writeOneAnswer { constructor() { this.ans_ls_html = document.querySelectorAll('.field.ui-field-contain'); } radio (answer, id) { var radios = this.ans_ls_html[id].querySelectorAll('.ui-radio') if (radios.length!=0){ if (answer.ques_id==id && answer.kind=='radio') { for (var i=0; i<radios.length; i++) { if (answer.answer.replace(/\s*/g,"").indexOf(radios[i].innerText.replace(/\s*/g,""))>=0) { radios[i].click() } } } else { console.log('radio:答案列表中的id和当前获取id不符合,跳过填写') } } } input(answer,id) { var input = this.ans_ls_html[id].querySelector('.ui-input-text input') if (input) { if (answer.ques_id==id) { input.value = answer.answer.split('|')[randomNum(0,answer.answer.split('|').length-1)]; } else { console.log('input:答案列表中的id和当前获取id不符合,跳过填写') } } } checkbox(answer,id) { var checkbox = this.ans_ls_html[id].querySelectorAll('.ui-checkbox') if (checkbox.length!=0){ if (answer.ques_id==id && answer.kind=='checkbox') { var ans_txt_ls = answer.answer.split('|') for (var i=0; i<ans_txt_ls.length; i++) { for (var j=0; j<checkbox.length; j++) { if(ans_txt_ls[i].replace(/\s*/g,"").indexOf(checkbox[j].querySelector('.label').innerText.replace(/\s*/g,""))>=0) { checkbox[j].click(); } } } } else { console.log('checkbox:答案列表中的id和当前获取id不符合,跳过填写') } } } manyinput(answer,id,elem) { var [ques_ls, original_input_group] = parseManyinputAnswer(this.ans_ls_html[id], elem) if (answer.ques_id==id && answer.kind=='manyinput') { // 这里开始处理服务器上获取的整体题目,大致思路就是把现有内容replace掉然后就可以拿到两个带括号的答案内容。正确答案后面的括号没有内容,错误答案括号后有正确答案 var quesandans = answer.answer.split(' 题目ID:')[0]; for (var ij=0; ij<ques_ls.length-1; ij++){ quesandans = quesandans.replace(ques_ls[ij], '') } var quesandans_ls = quesandans.split('】'); // 这个变量里就是用户答案和标准答案了,用【分割 for (var ij=0; ij<quesandans_ls.length; ij++){ try { if (quesandans_ls[ij]!=''){ var usr_ans = quesandans_ls[ij].split('【')[0] var ans_res = quesandans_ls[ij].split('【')[1] var true_ans = '' if (ans_res == ''){ true_ans = usr_ans } else if (ans_res.indexOf('正确答案')>=0){ true_ans = ans_res.replace('正确答案: ', '') } // 填入input内,这里可能会产生问题所以加上try try{ original_input_group.querySelectorAll('.ui-input-text')[ij].value = true_ans if (elem == '.textCont') { original_input_group.querySelectorAll('.textCont')[ij].innerText = true_ans //当作多项填空填写 } else { original_input_group.querySelectorAll('.bracket')[ij].querySelector('span .selection span span').innerText = true_ans //当作完形填空填写 } }catch{} } }catch{} } } } } // 填写全部答案 function writeAllAnswer(answer_ls, writeAnswer_class) { var ans_ls_html = document.querySelectorAll('.field.ui-field-contain'); var writeAnswer = writeAnswer_class console.log(answer_ls) window.easywjx.answer_ls = answer_ls //test for (var i=0; i<ans_ls_html.length; i++) { var answer = findAnswerFromAnswerLs(i, answer_ls) if (answer == 'NOANSWER') { console.log('no_find_answer') continue; } console.log(answer) try{writeAnswer.radio(answer, i)}catch{} try{writeAnswer.input(answer, i)}catch{} try{writeAnswer.checkbox(answer, i)}catch{} try{writeAnswer.manyinput(answer, i, '.textCont')}catch{} try{writeAnswer.manyinput(answer, i, '.bracket')}catch{} //writeAnswer.radio(answer_ls[i], i);writeAnswer.input(answer_ls[i], i);writeAnswer.checkbox(answer_ls[i], i);writeAnswer.manyinput(answer_ls[i], i, '.textCont');writeAnswer.manyinput(answer_ls[i], i, '.bracket'); } } // 从服务器获取数据并填写全部答案 function getAnswerFromServerAndWriteAllAnswer() { var wj_id = getWJID() $.post('//'+server_ip, {wj_id: wj_id}, function (result) { if (result.length==0) { layer.msg('暂无答案') return 'NONE_ANSWER'; } var writeAnswer_class = new writeOneAnswer() var answer_ls = JSON.parse(result[0].content) writeAllAnswer(answer_ls, writeAnswer_class) }) } // 获取manyinput的答案内容 function parseManyinputAnswer(ans_html, elem) { var original_input_group = ans_html.querySelector('.field-label div'); if (!original_input_group || original_input_group.querySelectorAll(elem).length==0){ return "CANTPARSE" } var copy_input_group_dom = parseDom(original_input_group.innerHTML) var input_group = document.querySelector('body').appendChild(copy_input_group_dom) //var input_group = document.querySelectorAll('div')[document.querySelectorAll('div').length-1] // 添加换行符方便分割 var all_span = input_group.querySelectorAll(elem); for (var i=0; i<all_span.length; i++){ var br = document.createElement("br"); insertAfter(br, all_span[i]) } // 删除多余元素 var rm1_ls = input_group.querySelectorAll(elem) var rm2_ls = input_group.querySelectorAll(".ui-input-text") for (var i=0; i<rm1_ls.length; i++){ rm1_ls[i].remove() } for (var i=0; i<rm2_ls.length; i++){ rm2_ls[i].remove() } // 拿到拆分的题目 var ques_ls = input_group.innerHTML.split('<br>') for (var i=0; i<ques_ls.length; i++) { ques_ls[i] = parseDom(ques_ls[i]).innerText } console.log(ques_ls) // 删除这个复制元素 input_group.remove() return [ques_ls, original_input_group] } function addGetOneAnswerAndWriteOneAnswerClassToWindow() { var class_getOneAnswer = new getOneAnswer() var class_writeOneAnswer = new writeOneAnswer() window.easywjx.getOneAnswer = class_getOneAnswer window.easywjx.writeOneAnswer = class_writeOneAnswer } // ---------------------------------用于自动填写的代码【结束】---------------------------------- // ---------------------------------下面是一些通用函数------------------------------------ // 通用函数,生成范围内随机数 function randomNum(minNum,maxNum){ switch(arguments.length){ case 1: return parseInt(Math.random()*minNum+1,10); break; case 2: return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10); break; default: return 0; break; } } // 通用函数,同步等待1秒 function sleep(time) { return new Promise((resolve, reject) => { setTimeout(() => { resolve() }, time * 1000) }) } // 通用函数,获取问卷ID function getWJID(){ var localpath = window.location.pathname var wj_id = 'none' if (localpath.indexOf('/wjx/join')>=0) { wj_id = getQueryString('activityid') } else { wj_id = localpath.replace('vm', '').replace('.aspx', '').replaceAll('/', '') } return wj_id } // 通用函数,插入dom function insertAfter(newElement,targetElement){ var parent = targetElement.parentNode; if(parent.lastChild == targetElement){ parent.appendChild(newElement); }else{ parent.insertBefore(newElement,targetElement.nextSibling); } } // 通用函数,转换dom function parseDom(arg) { var objE = document.createElement("div"); objE.innerHTML = arg; return objE; }; // 通用函数,获取get请求的一个参数 function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } //通用函数,复制内容 function copy_to_clipboard(txt_str){ const input = document.createElement('input'); document.body.appendChild(input); input.setAttribute('value', txt_str); input.select(); if (document.execCommand('copy')) { document.execCommand('copy'); console.log('复制成功'); //Alert(500,'复制成功'); } document.body.removeChild(input); } // 通用函数,清理cookie【方法1,最有效】 function clearCookie(){ // 这段代码来自其它脚本,为MIT协议, var keys = document.cookie.match(/[^ =;]+(?==)/g); if (keys) { for (var i = keys.length; i--;) { document.cookie = keys[i] + '=0;path=/;expires=' + new Date(0).toUTCString(); document.cookie = keys[i] + '=0;path=/;domain=' + document.domain + ';expires=' + new Date(0).toUTCString(); document.cookie = keys[i] + '=0;path=/;domain=ratingdog.cn;expires=' + new Date(0).toUTCString(); } } console.log("cookie数据已清除"); location.reload(); } // 通用函数,清理cookie【方法2】 function deleteAllCookies() { var cookies = document.cookie.split(";"); console.log(cookies) for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i]; var eqPos = cookie.indexOf("="); var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; document.cookie = name +"=;"; //document.cookie = null } var cookies2 = document.cookie.split(";"); } // 通用函数,清理storage function clearStorage() { localStorage.clear() sessionStorage.clear() } })();