Greasy Fork is available in English.

学堂在线助手

作业提前解析|视频后台播放

Version au 17/04/2020. Voir la dernière version.

    // ==UserScript==
    // @name        学堂在线助手
    // @namespace   http://tampermonkey.net/
    // @match       https://*.xuetangx.com/lms
    // @version     1.2
    // @author      Fluke limoure 
    // @description 作业提前解析|视频后台播放
    // ==/UserScript==


//后台播放
setInterval(function () {
    var current_video = document.getElementsByTagName('video')[0]
    current_video.play()
    current_video.muted=true;
    var speed = $(".xt_video_player_common_list");
		var speedChild = speed.children()[0];
		var gp = "wi";
		speedChild.click();
}, 2000)


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

    // 左侧提示
        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');
    // 点击事件,每次点击都是一次请求
    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 objt = 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) {
                objt[numx]=objx.correct_answer;
                numx++;
           
             });
             })
            
                lpanel.html("已开始查询,如无效请尝试切换输入法");
                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],objt[i]);
                        }
                    })();
                } 
        }
    });

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