Greasy Fork is available in English.

学堂云慕课平台 作业解析|自动作答|后台倍速播放

作业提前解析|自动作答|后台倍速播放

Versão de: 22/04/2020. Veja: a última versão.

    // ==UserScript==
    // @name        学堂云慕课平台 作业解析|自动作答|后台倍速播放
    // @namespace   http://tampermonkey.net/
    // @match       https://*.xuetangx.com/lms
    // @version     1.4
    // @author      Fluke limoure
    // @description
// @description 作业提前解析|自动作答|后台倍速播放
    // ==/UserScript==


//视频功能
var firstset = 1;
setInterval(function video() {
           var player = $(".xt_video_player_common_list");
           var urld = window.location.href;
           if(urld.match("video")&&firstset) {
           console.log("切换到标清,开启2倍速");
           var speedChild = player.children()[0]; //二倍速
               speedChild.click();
           var quality = player.children()[5];    //标清
               quality.click();
            firstset=0;
            }
            if(urld.match("video")) {
                console.log("后台播放中");
                var current_video = document.getElementsByTagName('video')[0];//后台播放
                current_video.play();
                current_video.muted=true;
                var p=$(".xt_video_player_progress_currentTime")[0];//播放进度
                document.title = p.style.width;
                 }



      },2000)

    let settings = {
        requestInterval: 500, // 延迟
        clickLoopInterval: 300, //点击间隔
    };

    // 左侧提示
        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':
                // 查询事件
                // 新页面
                if ($('.title').text() != title)
                    init();
                var numx=0;
                var answer = new Array();
                var blank=new Array();
                var analy = new Array();
                var url = window.location.href;
                var domain = url.match(/\/\/(\S*).xuetangx.com/);
                var LIST="https://"+domain[1]+".xuetangx.com/inner_api/homework/score/result/P%2B29698%2B0090/"+url.substring(url.length - 11);
                $.getJSON(LIST,function(result){
                var 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,"");         //查询填空题

                answer[numx]=objx.correct_answer;
                if(answer[numx]=="") answer[numx]=blank[numx];
                analy[numx]=objx.analysis;
                numx++;

             });
             })

                lpanel.html("按N自动作答");
                if (retry.length == 0 && !submit) {
                    // 主体请求
                    let lis = $('.paper-list>li');
                    // 主体页面没有加载完
                    if (lis.length == 0) {
                        lpanel.html("还没加载完,请重试");
                        alert("还没加载完,请重试");
                        return false;
                    }
                    // 加载完成后获取总长度
                    allNum = lis.length;
                    // 标志位-主体请求已发出
                    submit = true;
                    (async () => {
                        for (let i = 0; i < lis.length; i++) {
                            let question = $(lis[i]).find('span.content').text();
                            // 建立好每个 li 的提示信息容器
                            $(lis[i]).attr("id", "li" + i);
                            $(lis[i]).append($('<div>', {
                                id: "div" + i,
                            }));
                            // 查询
                           await sleep(settings.requestInterval);
                            show( lis[i],answer[i],analy[i]);
                        }
                    })();
                }
        }
    });

    // 发请求
    function show(li,x,y) {
                   // 提示信息容器
                    let div = $(li).find('#div' + $(li).attr("id").substring(2));
                    div.html('正确答案:' + "<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);
        });
    };