校情与教学质量问卷自动化(GXMU)(自动评语版)

自动完成调查问卷

// ==UserScript==
// @name         校情与教学质量问卷自动化(GXMU)(自动评语版)
// @namespace    http://tampermonkey.net/
// @version      0.5.0
// @description  自动完成调查问卷
// @author       Natonaa
// @match        http://10.129.2.141/new/student/rank*
// @match        http://10.129.2.141/new/student/rank/*
// @match        http://10.129.2.141/new/student/lzdx_rank/*

// @match        http://10-129-2-141.svpn.gxmu.edu.cn:8118/new/student/rank/*
// @match        http://10-129-2-141.svpn.gxmu.edu.cn:8118/new/student/rank*
// @match        http://10-129-2-141.svpn.gxmu.edu.cn:8118/new/student/lzdx_rank/*

// @match        http://wspj.gxmu.edu.cn/new/student/rank*
// @match        http://wspj.gxmu.edu.cn/new/student/rank/*
// @match        http://wspj.gxmu.edu.cn/new/student/lzdx_rank/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=48.43

// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    /***** 参数配置 *****/
    var init_time=3000; //当页面加载完成后,延时3秒后启动评测脚本
    var finish_each_time=3600; //完成每次评测后间隔时间6s
    var close_time=1500; //关闭评测界面的对话框后延时2s;
    /***** 参数配置 *****/

    var all_tasks;
    var all_links=[];
    var isload=0;
    //教师评语
    var predefined_comments = [
        "老师授课内容丰富多彩,讲解细致清晰,能结合实际案例帮助我们理解知识点,是我们非常尊敬和喜欢的老师。",
        "老师教学严谨认真,总是鼓励我们积极思考,帮助我们培养独立学习的能力,让我在学习中收获很多。",
        "老师不仅知识渊博,而且对待学生一视同仁,总是用鼓励的方式激发我们的潜力,课堂氛围十分融洽。",
        "课堂上老师总是耐心解答每一个问题,无论难易程度,都会用通俗易懂的方式讲解,给我们带来很大的帮助。"
    ];
    //课程评语
    var class_comments = [
        "课程内容丰富且有深度,老师讲解清晰易懂,但课堂互动较少,希望能增加更多的实际案例和讨论环节,提升学习体验。",
        "我非常喜欢课程的实用性和老师的教学方式,内容生动有趣,但课程节奏稍快,建议能在一些难点上花更多时间讲解。",
        "该课程能够深入浅出地传授理论知识,实际案例也很有帮助,不过某些部分的学习材料较少,希望能提供更多的参考资源。",
        "课程内容扎实,理论与实践相结合,讲解条理清晰;但有时进度较快,建议能适当放慢,确保每个知识点都能消化理解。",
        "课程设计合理,案例分析非常有助于理解理论,课堂氛围也很好;不过,某些环节过于抽象,希望能够更具体一些。"
    ];
    //返回主页
    function go_home(){
        //使用正则将'/*rank*'一大串字符替换成主页网址的‘studen_login/index.jsp’
        let return_home=window.location.href.replace(/(.*)(\/.*\/.*)\/.*rank.*/,'$1$2')+'/student_login/index.jsp';
        //跳转主页
        window.location.replace(return_home);
    }

    //关闭对话框
    function fclose(){
        //var gcloses=document.querySelectorAll("button[data-dismiss='modal'].blue");
        //for(let i=0;i<gcloses.length;i++){
        //  try{ gcloses[i].click();}catch(e){console.log("some error happened when try to find the function which enbale to close the modal...");}
        //}
        try{
            //这里关闭的是测评页面的对话框
            var finishDlg=document.getElementById("finishDlg");
            if(finishDlg){
                finishDlg.innerHTML+=`<button id="close_" data-dismiss="modal">close</button>`;
                var close_=document.getElementById("close_");
                if(close_){
                    close_.click();
                    finishDlg.removeChild(close_);
                }
            }
        }catch(e){
        }
    }

    setTimeout(function(){
        all_tasks=document.querySelectorAll("td>span.badge-important,td>span.badge-success");
        //console.log(all_tasks);
        var raw_all_links=document.querySelectorAll("td>div.tdrepaire>a[onclick].blue");
        for(let h=0;h<raw_all_links.length;h++){
            if(raw_all_links[h].innerText=="评价") all_links.push(raw_all_links[h]);
        }

        var undone=[];
        for(let i=0;i<all_tasks.length;i++){
            var badge_class=all_tasks[i].getAttribute("class");
            console.log(badge_class);
            if(badge_class=="badge badge-important"){
                undone.push(i);
            }
        }

        console.log(undone)
        console.log("undone_len: "+undone.length)
        var count=0;
        if(undone.length==0){
            alert("所有评测可能完成,请自行检查!");
            go_home();
        }
        else{
            var inter=setInterval(function(){
                if(count==undone.length){
                    clearInterval(inter);
                    fclose();
                    alert("所有评测可能完成,请自行检查!");
                    go_home();
                }

                if(all_links[undone[count]]){
                    all_links[undone[count]].click()
                    count++;
                }
                //找到所有选项(10分..0分)
                var opts=document.querySelectorAll("label.radio>div.radio>span");
                //console.log(opts);

                //筛选出10分的选项,自动选择10分的选项
                for(let i=0;i<opts.length;i++){
                    var op=opts[i].querySelector("input");
                    if(op.value=="10"||op.value=="1"){
                        var item=opts[i].parentNode.parentNode;
                        item.dispatchEvent(new MouseEvent("click"));
                    }
                }

                //判断链接是评教还是评课
                var currentURL = window.location.href;
                if (currentURL.includes("lzdx_rank")) {
                    var textBox1343 = document.querySelector("textarea[name='1343']");
                    var textBox1344 = document.querySelector("textarea[name='1344']");
                    var randomIndex1 = Math.floor(Math.random() * class_comments.length);
                    var randomComment1 = class_comments[randomIndex1];
                    var randomIndex2;
                    // 确保两个文本框的评语不重复
                    do {
                        randomIndex2 = Math.floor(Math.random() * class_comments.length);
                        } while (randomIndex2 === randomIndex1);
                    var randomComment2 = class_comments[randomIndex2];
                    //填入评语
                    textBox1343.value = randomComment1;
                    textBox1344.value = randomComment2;
                } else {
                 //填入评语
                var commentBox = document.querySelector("textarea[name='1332'], textarea[name='1382']");
                if (commentBox) {
                    var randomComment = predefined_comments[Math.floor(Math.random() * predefined_comments.length)];
                    commentBox.value = randomComment;
                  }
                }

                //由于问卷不能满分,所以倒数第11题固定选第二个
                var lastChange=opts[opts.length-9]?opts[opts.length-9]:opts[opts.length-8]
                lastChange.parentNode.parentNode.dispatchEvent(new MouseEvent("click"));

                //点击提交按钮
                var submit=document.getElementById("pjsubmit");

                //关闭按钮
                submit.click();
                fclose();
                //做一个延迟,避免太快后导致窗口黑屏了...会让人以为卡死了orz
                setTimeout(()=>console.log("awaiting..."),close_time);
            },finish_each_time);
        }
    },init_time)

})();