学堂云3.0 作业解析|自动作答|后台刷课

作业解析|自动作答|后台播放

Pada tanggal 27 April 2020. Lihat %(latest_version_link).

    // ==UserScript==
    // @name        学堂云3.0  作业解析|自动作答|后台刷课
    // @namespace   http://tampermonkey.net/
    // @match       https://*.xuetangx.com/lms
    // @version     2.2
    // @author      Fluke limoure
    // @description
    // @description 作业解析|自动作答|后台播放
    // ==/UserScript==



//视频功能
var firstset = 1;
setInterval(function video() {
           var player = $(".xt_video_player_common_list");
           var current_video = document.getElementsByTagName('video')[0]
           var urld = window.location.href;
           if(urld.match("video")&&firstset) {
           console.log("切换到标清,开启2倍速静音");
           let speedChild = player.children()[0]; //二倍速
               speedChild.click();
           let quality = player.children()[5];    //标清
               quality.click();
               current_video.muted=true;  //静音
            firstset=0;
            }
            if(urld.match("video")) {
                console.log("后台播放中");
                current_video.play();
                let p=$(".xt_video_player_progress_currentTime")[0];//播放进度
                let progress = p.style.width;
                document.title = progress; 
                if(parseInt(progress)>95)   //进度大于95 播放下一个视频
                 {   console.log("播放完成,即将跳转");
                     nextone();
                     return;
                }
          }



      },2000)

    let settings = {
        requestInterval: 500, // 延迟
        clickLoopInterval: 300, //点击间隔
    };
    //连播功能
    function nextone(){
        let url = window.location.href;
        let domain = url.match(/\/\/(\S*).xuetangx.com/);
        var spV = url.split('/');
        var courseid = spV[5];   //主课程ID
        var classid = spV[6];    //课程ID
        var nowvid = spV[8];     //视频ID
        var VideoRe ="https://"+domain[1]+".xuetangx.com/score/"+courseid+"/manual_paging/";
        $.ajax({
            type: "post",
            url: VideoRe,
            data: {"class_id":classid,"cla":"v","cp":"","status":0,"page":1},//查询未完成视频
            success: function (redata) {
               let nextid=0;
               var v = redata.data.items[0];
                        if(v.percent>=80){nextid = redata.data.items[1].item_id; console.log("数据未更新"+v.percent);} //防止数据未更新重复观看
                        else nextid = v.item_id;  //下一个视频ID
                        var next=(url.match(/(\S*)\/0\//)[1]);
                        var nexturl=next.substr(0,next.length-nowvid.length)+nextid+"/0/";  //下一个视频地址
                        console.log(nexturl);
                        window.location.href=nexturl; 
           
            }
        
        
        });
        }
        
    // 左侧提示
        let lpanel = $('<div>', {
            html: "在答题界面按S查询答案,按N自动点击,无效请开启大写锁定或刷新",
            id: "retry",
            style: "position:fixed;z-index:9999;width: 240px;background-color: #FFA500;top:100px;left:10px;opacity: 0.7;color: black;"
        });
        lpanel.appendTo('body');
    // 点击事件,每次点击都是一次请求,mmp
    let clickList = [];
    // 是否全部查询成功
    let successNum = 0;
    let allNum = 0;
    let nChange = 0;
    // 控制按键 s 触发的重复请求
    let submit = false;
    // 开启点击
    let autoClick = false;
    // title 页面标识
    let title = $('.title').text();

    // 初始化函数
    function init() {
        title = $('.title').text();
        autoClick = false;
        retry = [];
        submit = false;
        successNum = 0;
        allNum = 0;
        nChange = 0;
        clickList = [];
        lpanel.html('在答题界面按S查询答案,按N自动点击,无效请切换输入法状态或刷新重试');
    }

    $(window).keydown(function (event) {
        switch (event.key) {
            case 'n':
                autoClick = !autoClick;
                nChange++;
                if (autoClick){
                    clickLoop();
                }
                return false;
            case 's':
                // 初始化        
                let numx=0;
                let answer = new Array();
                let blank=new Array();
                let analy = new Array();
                var questions = new Array();
                var tureanswer = new Array();
                var truequestion = new Array();
                var trueanaly = new Array();
                let nowlist = $('.paper-list>li');
                var nowquestion = new Array();
                //获取当前链接
                let url = window.location.href;
                let domain = url.match(/\/\/(\S*).xuetangx.com/);
                let LIST="https://"+domain[1]+".xuetangx.com/inner_api/homework/score/result/P%2B29698%2B0090/"+url.substring(url.length - 11);
               
                //调用API查询
                $.getJSON(LIST,function(result){
                let p=result.data.question_data;
                $.each(p, function(idx, objx) {
                    let ps=JSON.stringify(objx.options);
                    let psx=ps.match(/\"([^\"]*)\",/g);
                    psx= psx.toString().replace(/,,/g,"&nbsp&nbsp&nbsp&nbsp&nbsp");
                blank[numx]=psx.replace(/,/g,"");         //查询填空题

                questions[numx]=objx.stem.replace(/<[^>]+>/g,"");       
                questions[numx]=questions[numx].replace(/(\n)/g,"");   //去除HTML标记
                console.log(questions[numx]);
                answer[numx]=objx.correct_answer;
                if(answer[numx]=="") answer[numx]=blank[numx];
                analy[numx]=objx.analysis;
                numx++;
             });

             let lis = $('.paper-list>li');
             for (let i = 0; i < lis.length; i++) {
                 nowquestion[i] = $(nowlist[i]).find('span.content').text();
                 let question = $(lis[i]).find('span.content').text();
                 // 建立好每个 li 的提示信息容器
                 $(lis[i]).attr("id", "li" + i);
                 $(lis[i]).append($('<div>', {
                     id: "div" + i,
                 }));
                 // 匹配
                 for(let j = 0;j <nowlist.length; j++){
                     if(nowquestion[i]==questions[j])
                       {   
                           tureanswer[i] = answer[j];
                           truequestion[i] = questions[j];
                           trueanaly[i] = analy[j];
                           console.log('匹配成功');
                           break;
                       }
                       else if(j==nowlist.length-1){
                        
                        tureanswer[i] = answer[i];
                        truequestion[i] = questions[i];
                        trueanaly[i] = analy[i];
                        console.log('匹配失败,使用默认配置');
                        alert("部分题目匹配失败,注意检查")
                       }
                     
                 }
                 show( lis[i],tureanswer[i],trueanaly[i],truequestion[i]);
                 }


             })

                   
            
        }
    });

    // 发请求
    function show(li,x,y,que) {
                   // 提示信息容器
                    let div = $(li).find('#div' + $(li).attr("id").substring(2));
                    div.html('查询题目: ' + que + '</span><br></span><br>' +  '正确答案:' + "<span style='color: green'>" + x + '</span><br>' + '答案解析:' + y + '</span>');
                    // 点击事件入列
                    clickList.push(click(li, x));
    }


    // 点击事件
    function click(li, answer) {
        return function () {
            let choices = $(li).find('.answer-info');
            for (let i = 0; i < choices.length; i++) {
                if ($(li).find('.type').text().replace(" ", '') == '多选') {
                    if (answer.indexOf($(choices[i]).text().replace(" ", '')) != -1) {
                        if (!$(choices[i]).find('input').prop("checked")) {
                            $(choices[i]).click();
                            return true;
                        }
                    }else{
                        if ($(choices[i]).find('input').prop("checked")) {
                            $(choices[i]).click();
                            return true;
                        }
                    }
                } else {
                    // 单选和选择
                    if (answer == $(choices[i]).text().replace(" ", '')) {
                        if (!$(choices[i]).find('input').prop("checked")) {
                            $(choices[i]).click();
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }

    // 执行点击事件
    async function clickLoop() {

        while (autoClick) {
            let tmp = nChange;
            let flag = false;
            for (let i = 0; i < clickList.length; i++) {
                if (clickList[i]()) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                lpanel.html("自动点击完成。主观题、多选题可能无法作答,请注意检查遗漏");
                $(document).scrollTop(0);
                autoClick=false;
                return false;
            }
            await sleep(settings.clickLoopInterval + (100*Math.random()>>0)*20 );
            if (tmp!=nChange)
                return false;
        }
    }

    const sleep = (timer) => {
        return new Promise((resolve, reject) => {
            setTimeout(resolve, timer);
        });
    };