Greasy Fork

Greasy Fork is available in English.

EasyWJX-破解问卷星复制限制,全自动填写答案,绕过微信限制

这个脚本可以帮助你绕过问卷星的复制限制,并且可以直接在问卷星的答题页面搜索答案,防止被企业版防作弊检测。同时可以自动清理cookie来绕过设备限制(部分浏览器可用)

当前为 2022-10-14 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         EasyWJX-破解问卷星复制限制,全自动填写答案,绕过微信限制
// @namespace    http://tampermonkey.net/
// @version      1.5
// @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
// @require      https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js
// @license      GNU GPLv3
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    console.log("EasyWJX is running. From xq.kzw.ink. Version 1.2")
    if(window.location.protocol == 'https:') {
        window.location.href = window.location.href.replace('https', 'http')
    }
    foreach();
    deleteAllCookies();
    if ($("#divTip").text().indexOf("最大填写次数")>=0) {
        alert('监测到您可能被问卷星限制,这种情况请清空浏览器Cookie并重新联网(开一下飞行模式)再试')
    }

    $('#spanPower').html('<a href="https://xq.kzw.ink" title="线圈_专为学生谋福利">线圈脚本</a><span>提供破解</span>')

    // 创建按钮
    var addtrueans_btn = document.createElement("button"); //创建一个input对象(提示框按钮)
    addtrueans_btn.textContent = "添加答对题目";
    addtrueans_btn.style.width = "6rem";
    addtrueans_btn.style.height = "1.5rem";
    addtrueans_btn.style.marginLeft = "1rem";
    addtrueans_btn.type = 'button';
    addtrueans_btn.onclick = function (e){
        var addtrueans_ls=prompt("请问需要将哪些题改为正确的?(输入题目ID,如需多个可用空格隔开,如需修改全部清输入“all”)")
        if (addtrueans_ls!=null && addtrueans_ls!="") {
            if (addtrueans_ls!='all') {
                addtrueans_ls = addtrueans_ls.split(' ')
                for (var i=0; i<addtrueans_ls.length; i++) {
                    changeAnsToTrue(addtrueans_ls[i])
                }
            } else if (addtrueans_ls=='all') {
                var ans_list = document.querySelectorAll('.data__items');
                for (var i=0; i<ans_list.length; i++) {
                    changeAnsToTrue(i)
                }
            }
        }
    };
    var server_ip='xq.kzw.ink:8800'
    var clear_btn = document.createElement("button"); //创建一个input对象(提示框按钮)
    clear_btn.textContent = "我要截屏";
    clear_btn.style.width = "4rem";
    clear_btn.style.height = "1.5rem";
    clear_btn.style.marginLeft = "1rem";
    clear_btn.type = 'button';
    clear_btn.onclick = function (e){
        alert('该功能将清理所有页面上与脚本有关的元素方便截图')
        $('#spanPower').html('<a href="https://xq.kzw.ink" title="线圈_专为学生谋福利">问卷星</a><span>提供技术支持</span>')
        clear_btn.style.display = 'none';
        addtrueans_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])
        }
    };
    // 以上为创建按钮
    $("#stop_jiexiTxt").append(addtrueans_btn).append(clear_btn)
    // 判断是否直接修改成绩
    if ($(".score-font-style").length>0) {
        if(window.location.protocol == 'https:') {
            window.location.href = window.location.href.replace('https', 'http')
        } else {
            setTimeout(function () {
                getAllAnswer_radio_input()
            },2000)
            // 放置题目ID
            var ques_titles = $('.data__tit_cjd');
            console.log(ques_titles.eq(0).text())
            for (var i=0; i<ques_titles.length; i++) {
                ques_titles.eq(i).text(ques_titles.eq(i).text()+'  题目ID:'+i)
            }


            var r=confirm("是否需要修改成绩?(可能出现问题,如修改效果不符合要求请刷新)")
            if (r==true)
            {
                var score=prompt("修改后的分数(注意不要大于总分)")
                if (score!=null && score!="")
                {
                    $(".score-font-style").eq(0).text(score)
                }
                var correct_num=prompt("修改后的正确题数(注意不要大于总题数)")
                if (correct_num!=null && correct_num!="")
                {
                    //$(".tbottom-title").eq(3).html('<span style="font-size:20px;">'+correct_num+'</span>')
                    //$("span[style$='font-size:20px;']").text(correct_num)
                    $(".score-form__list.clearfix .tht-content span").text(correct_num)
                }
                if ($(".score-form__list.clearfix .tht-content").text().indexOf('名')>=0) {
                    var rank=prompt("修改后的名次(如果没有排名或者排名修改后出错请点击取消或留空)")
                    if (rank!=null && rank!="")
                    {
                        //$(".tbottom-title").eq(3).html('<span style="font-size:20px;">'+correct_num+'</span>')
                        //$("span[style$='font-size:20px;']").text(correct_num)
                        $(".score-form__list.clearfix .tht-content").eq(1).text("第"+rank+"名")
                    }
                }
            }
        }
    } else {
        /*
        setTimeout(function () {
            writeAnswer_radio_input()
        },2000)
        */
        var writeAnswer_btn = document.createElement("button"); //创建一个input对象(提示框按钮)
        writeAnswer_btn.id = "writeAnswer_btn";
        writeAnswer_btn.textContent = "自动填写";
        writeAnswer_btn.style.width = "4rem";
        writeAnswer_btn.style.height = "2rem";
        writeAnswer_btn.style.marginLeft = '1rem';
        writeAnswer_btn.type = 'button';
        writeAnswer_btn.onclick = function (e){
            writeAnswer_radio_input()
        }
        /*
        var quickPass_btn = document.createElement("button"); //创建一个input对象(提示框按钮)
        quickPass_btn.id = "quickPass_btn";
        quickPass_btn.textContent = "速通";
        quickPass_btn.style.width = "4rem";
        quickPass_btn.style.height = "2rem";
        quickPass_btn.style.marginLeft = '1rem';
        quickPass_btn.type = 'button';
        quickPass_btn.onclick = function (e){

        }
        */
        $('#toptitle h1').eq(0).append(writeAnswer_btn)
        //$('#toptitle h1').eq(0).append(quickPass_btn)
    }

    if ($(".wxtxt").length >0) {
        var r2=confirm("监测到微信限制。是否需要移除限制并查看题目(可以查看题目但无法提交)")
        if (r2==true) {
            $("#zhezhao2").remove();
            $("#divContent").removeClass('disabled').removeClass('isblur');
            $("#ctlNext").text('破解后可能无法提交')
            setTimeout(function () {
                alert("重要信息:破解只是删除遮挡,无法提交,建议搜索答案后用微信提交")
            },500)

        }
    }

    // 使用搜索的方式
    var div_list = $(".field-label");
    var btn_list = [];
    // var btn = $('<button type="button" style="height: 1.5rem; width: 2.3rem; margin-left: 1rem;" onclick="alert(102210);">搜索</button>')
    for (i=0; i<div_list.length; i++) {
        var btn = document.createElement("button"); //创建一个input对象(提示框按钮)
        btn.id = "search_btn_"+i;
        btn.textContent = "搜索";
        btn.style.width = "2.3rem";
        btn.style.height = "1.5rem";
        btn.style.marginLeft = "1rem";
        btn.type = 'button';
        //绑定按键点击功能
        btn_list.push(btn)
        console.log(btn)
        btn.onclick = function (e){
            console.log('点击了按键', e.srcElement.id);
            var btn_num = parseInt(e.srcElement.id.split('_')[2]);
            var url = window.location.href;
            var search_content = div_list.eq(btn_num).text().replace('搜索', '').replace('复制','').replace('✅','');
            console.log(btn_num, search_content)
            //iframe 层
            /*
            layer.msg('hello');
            layer.open({
                type: 2,
                title: '很多时候,我们想最大化看,比如像这个页面。',
                shadeClose: true,
                shade: false,
                maxmin: true, //开启最大化最小化按钮
                area: ['100%', '100%'],
                content: 'https://www.wjx.cn/',
                zIndex: layer.zIndex, //重点1
                success: function(layero){
                    layer.setTop(layero); //重点2
                }
            });
            */

            //window.open('https://www.bing.com/search?q='+search_content)
            if (e.srcElement.textContent=="搜索") {
                var iframe = document.createElement("iframe");
                iframe.id = "search_iframe"+btn_num;
                iframe.style.width = "100%";
                iframe.style.height = "20rem";
                iframe.style.marginTop = "2rem";
                iframe.src = 'https://www.bing.com/search?q='+search_content
                div_list.eq(btn_num).append(iframe)
                e.srcElement.textContent="收起";
            } else {
                e.srcElement.textContent="搜索";
                document.getElementById("search_iframe"+btn_num).remove();
            }
        };
        div_list.eq(i).append(btn)
    }
    for (var j=0; j<div_list.length; j++) {
        var copy_btn = document.createElement("button"); //创建一个input对象(提示框按钮)
        copy_btn.id = "copy_btn_"+j;
        copy_btn.textContent = "复制";
        copy_btn.style.width = "2.3rem";
        copy_btn.style.height = "1.5rem";
        copy_btn.style.marginLeft = "1rem";
        copy_btn.type = 'button';
        copy_btn.onclick = function (e){
            console.log('点击了按键', e.srcElement.id);
            var btn_num = parseInt(e.srcElement.id.split('_')[2]);
            var search_content = div_list.eq(btn_num).text().replace('搜索', '').replace('复制','').replace('✅','');
            copy_to_clipboard(search_content)
            e.srcElement.textContent ="✅";
            setTimeout(function(){
                e.srcElement.textContent="复制";
            },2000)
        };
        div_list.eq(j).append(copy_btn)
    }


    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);
    }
    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(";");
        console.log(cookies2)
    }
    function DelCookie(name) {
        var exp = new Date();
        exp.setTime (exp.getTime() - 1);
        var cval = GetCookie (name);
        document.cookie = name + "=" + cval + "; expires="+ exp.toGMTString();
    }
    function foreach() {
        var strCookie=document.cookie;
        var arrCookie=strCookie.split("; "); // 将多cookie切割为多个名/值对
        for(var i=0;i <arrCookie.length;i++)
        { // 遍历cookie数组,处理每个cookie对
            var arr=arrCookie[i].split("=");
            if(arr.length>0)
                DelCookie(arr[0]);
        }
    }
    function GetCookie(name) {
        var arg = name + "=";
        var alen = arg.length;
        var clen = document.cookie.length;
        var i = 0;
        while (i < clen)
        {
            var j = i + alen;
            if (document.cookie.substring(i, j) == arg)
                return GetCooki (j);
            i = document.cookie.indexOf(" ", i) + 1;
            if (i == 0) break;
        }
        return null;
    }
    function GetCooki(offset) {
        var endstr = document.cookie.indexOf (";", offset);
        if (endstr == -1)
            endstr = document.cookie.length;
        return decodeURIComponent(document.cookie.substring(offset, endstr));
    }
    function getAnswer_radio(str_id) {
        // 问卷星迷惑行为: 是已选radio标志, 是未选标志,真的它俩不一样,不要尝试修改不然可能出问题。或者说我改成unicode字符是不是会好一点
        // 好的我现在转换出来了,已选对应的unicode是\ue6df,未选对应的是\ue6e0,问卷星我真谢谢你
        // 然后接着就发现h5里只支持10进制的所以还得转一下,现在h5对应的就是:选中:59103 未选:59104
        // html里转译这种字符的方式就是:&#59103; &#59104;
        // 又是阴间操作:多选题:勾选答案:, 未勾选:
        var id = parseInt(str_id);
        console.log('开始检查',id)
        var ans_list_html = document.querySelector('.query__data-result.new__data-result');
        var ans_data_key = ans_list_html.querySelectorAll('.data__key')[id]
        if (ans_data_key && 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
                        }
                    }
                    console.log(true_ans_num)
                } else {
                    var true_ans_txt = ans_data_key.querySelector('.answer-ansys div').innerText
                    console.log(true_ans_txt)
                    true_ans_num = -1
                    for (i=0; i<ans_radio_list.length; i++) {
                        console.log(ans_radio_list[i].querySelector('span').innerText)
                        if (ans_radio_list[i].querySelector('span').innerText==true_ans_txt) {
                            true_ans_num = i
                            break
                        }
                    }
                    console.log(true_ans_num)
                }
                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 = '';
                var i=0
                if (ans_span_txt == '回答正确'){
                    for (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('┋', '|');
                }
                console.log(true_ans_ls_txt)
                return [true_ans_ls_txt, 'checkbox']
            }

        } else {
            console.log('不是radio题目')
            return ["NOTRADIO", 'none']
        }
    }
    function getAnswer_input(str_id) { // 需要特别注意,后期修改的时候,因为这里获取的是div的直接文本,要判断不是其他题目类型,所以优先级最低,后期添加其他类型题目时,要在这里排除
        var id = parseInt(str_id);
        console.log('开始检查',id)
        var ans_list_html = document.querySelector('.query__data-result.new__data-result');
        var ans_data_key = ans_list_html.querySelectorAll('.data__key')[id]
        if (ans_data_key && 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 '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
            }
            console.log(true_ans)
            return true_ans
        } else {
            console.log('不是input题目')
            return "NOTINPUT"
        }
    }
    function sendUploadRequest(wj_id, content) {
        $.post('//'+server_ip+'/upload', {wj_id: wj_id, content: JSON.stringify(content)}, function (result) {
            console.log(result)
        })
    }
    function getAllAnswer_radio_input() {
        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 = []
        for (var i=0; i<ans_title_list.length; i++) {
            var title = ans_title_list[i].innerText;
            var id= title.split('题目ID:')[1];
            try {
                var [ans, kind] = getAnswer_radio(id);
            }catch{
                var [ans, kind] = ['none', 'NOTRADIO']
            }
            if (ans != 'NOTRADIO') {
                send_ls.push({ques_id: id, answer: ans, kind: kind})
            } else if (ans == 'NOTRADIO') {
                try{
                    ans = getAnswer_input(id);
                }catch{
                    ans = 'NOTINPUT'
                }
                if (ans!='NOTINPUT') {
                    send_ls.push({ques_id: id, answer: ans, kind: 'input'})
                }
            }

        }
        var wj_id = getQueryString('activityid')
        console.log(send_ls)
        sendUploadRequest(wj_id, send_ls)
    }
    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 writeAnswer_radio_input() {
        var wj_id = window.location.pathname.replace('/vm/', '').replace('.aspx', '')
        console.log(wj_id)
        var answer_ls;
        $.post('//'+server_ip, {wj_id: wj_id}, function (result) {
            if (result.length==0) {
                console.log('NONE_ANSWER')
                document.querySelector('#writeAnswer_btn').innerText = '暂无答案';
                setTimeout(function(){
                    document.querySelector('#writeAnswer_btn').innerText = '自动填写';
                }, 2000)
                return 'NONE_ANSWER';
            }
            console.log(result[0].content)
            answer_ls = JSON.parse(result[0].content)
            console.log(answer_ls)
            var ans_ls_html = document.querySelectorAll('.field.ui-field-contain');
            console.log(ans_ls_html)
            // 填写radio
            for (var i=0; i<ans_ls_html.length; i++) {
                var radios = ans_ls_html[i].querySelectorAll('.ui-radio')
                console.log(radios)
                if (radios.length!=0){
                    for (var j=0; j<answer_ls.length; j++) {
                        if (answer_ls[j].ques_id==i && answer_ls[j].kind=='radio') {
                            for (var l=0; l<radios.length; l++) {
                                if (answer_ls[j].answer.indexOf(radios[l].innerText)>=0) {
                                    radios[l].click()
                                }
                            }
                        }
                    }
                }
            }

            // 填写input
            for (i=0; i<ans_ls_html.length; i++) {
                var input = ans_ls_html[i].querySelector('.ui-input-text input')
                if (input) {
                    for (var j=0; j<answer_ls.length; j++) {
                        if (answer_ls[j].ques_id==i && answer_ls[j].kind=='input') {
                            input.value = answer_ls[j].answer.split('|')[0];
                        }
                    }
                }
            }

            // 填写checkbox(在上传答案的时候checkbox和radio是一类)
            for (i=0; i<ans_ls_html.length; i++) {
                var checkbox = ans_ls_html[i].querySelectorAll('.ui-checkbox')
                if (checkbox.length!=0){
                    for (var j=0; j<answer_ls.length; j++) {
                        if (answer_ls[j].ques_id==i && answer_ls[j].kind=='checkbox') {
                            var ans_txt_ls = answer_ls[j].answer.split('|')
                            for (var l=0; l<ans_txt_ls.length; l++) {
                                for (var k=0; k<checkbox.length; k++) {
                                    if(ans_txt_ls[l] == checkbox[k].querySelector('.label').innerText) {
                                         checkbox[k].click();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        })
    }
    function changeAnsToTrue(str_id) {
        var id = parseInt(str_id);
        var ans_list_html = document.querySelector('.query__data-result.new__data-result');
        console.log(ans_list_html);
        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
            console.log(parseInt(title.split('题目ID:')[1]), id)
            if (parseInt(title.split('题目ID:')[1]) == id) {
                var num = i
                break;
            }
        }
        for (i=0; i<ans_title_list.length; i++) {
            try{
                ans_list_html.querySelectorAll('.data__items')[i].querySelector('.judge_ques_right font').innerText='';
            }catch{}
        }
        try{
            if (ans_list_html.querySelectorAll('.data__items')[num].querySelector('.judge_ques_right span').innerText=='回答错误') {
                console.log('修改成绩',num)
                ans_list_html.querySelectorAll('.data__items')[num].querySelector('.judge_ques_right').style.color='#01AD56';
                ans_list_html.querySelectorAll('.data__items')[num].querySelector('.judge_ques_right img').src = '//image.wjx.cn/images/newimg/score-form/[email protected]';
                ans_list_html.querySelectorAll('.data__items')[num].querySelector('.judge_ques_right font').innerText='';
                ans_list_html.querySelectorAll('.data__items')[num].querySelector('.answer-ansys').remove()
                ans_list_html.querySelectorAll('.data__items')[num].querySelector('.judge_ques_right span').innerText = '回答正确'
            }
        }catch{}
    }

})();