中华会计网校自动答题挂学时插件

文章目录

    凌晨起来换完尿布,清醒了,于是打开笔记本想看看有没有尤文的比赛。发现媳妇在用我的电脑挂会计学时,界面正好卡在了答题环节。看起来跟驾校挂学时是一个套路,即答对了继续播放视频,算学时;回答错误则卡在答题界面,直到你答对为止。

    这 TNM 浪费电了, 于是趁着清醒,决定写个自动答题挂学时的脚本。

    很快搞定,效果非常棒:

    中华会计网校自动答题挂学时插件

    咨询请加微信:zhongwei

    会计系统的页面逻辑

    基本在这个脚本中 http://jxjyxuexi.chinaacc.com/CourseWare/Content/js/pl.js?r=0.12282015

    //知识点做题提交
    function postPoint() {
        var useranswer = document.getElementsByName("useranswer");
        var useranswervalue = "";
        for (var i = 0; i < useranswer.length; i++) {
            if (useranswer[i].checked) {
                useranswervalue += useranswer[i].value;
            }
        }
        var strUrl = pointTestUrl + "?rnd=" + Math.random();
        try {
            var xmlHttp = new XMLHttpRequest();
            var sdata = "testid=" + document.pointform.testid.value + "&useranswer=" + useranswervalue + "&pointnum=" + document.pointform.pointnum.value + "&forumid=" + document.pointform.forumid.value + "&questionid=" + document.pointform.questionid.value + "&pointtype=" + document.pointform.pointtype.value + "&newpointid=" + document.pointform.newpointid.value + "&videoid=" + nowVideoID;
            xmlHttp.open("Post", strUrl, false);
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttp.send(sdata);
            if (xmlHttp.status == 200) {
                var xmlDoc = xmlHttp.responseText;
                eval("var obj =" + xmlDoc);
                if (obj.Results == "1") {
                    document.getElementById("videoPointBg").style.display = "none";
                    document.getElementById("videoPoint").style.display = "none";
                    setValidTime(obj.MaxPlayTime);  //设置有效播放时间  
                    playVideo(); //播放
                } else {
                    document.getElementById("PointQuestionAnswer").innerHTML = obj.ReturnStr;
                }
            }
        } catch (e) {
        }
    }
    

    初步分析,可能需要分两种情况来提交

    • 单选题
    • 多选题

    单选题

    逐个尝试即可

    <div><input type="radio" id="useranswer" name="useranswer" value="Y">对  <input type="radio" id="useranswer" name="useranswer" value="N">错</div>
    

    以下代码即可自动提交

    var useranswer = document.getElementsByName("useranswer");
    
    for (var i = 0; i < useranswer.length; i++) {
        useranswer[i].checked = true;
        postPoint();
    }
    

    多选题

    打错了会有提示

    document.getElementById("PointQuestionAnswer").innerHTML = obj.ReturnStr;
    
    <div style="height:370px; margin: 10px; overflow: auto" id="videoPointContent" class="nr"><div class="ctit">多选题:</div><div class="ccontent">符合税法规定的加速折旧形式和方法有(  )。<br>A、 缩短年限法。最低年限不得法定最低年限的60% <br>B、 双倍余额递减法 <br>C、 年数总和法 <br>D、 一次性全额扣除法</div><div><input type="checkbox" id="useranswer" name="useranswer" value="A">A  <input type="checkbox" id="useranswer" name="useranswer" value="B">B  <input type="checkbox" id="useranswer" name="useranswer" value="C">C  <input type="checkbox" id="useranswer" name="useranswer" value="D">D  </div><div class="cbtn"><input type="hidden" name="pointnum" id="pointnum" value="69434"><input type="hidden" name="forumid" id="forumid" value="0"><input type="hidden" name="testid" id="testid" value="46485"><input type="hidden" name="questionid" id="questionid" value="11623805"><input type="hidden" name="pointtype" id="pointtype" value="1"><input type="hidden" name="newpointid" id="newpointid" value="69434"><input type="button" name="btn" value="提交答案" onclick="postPoint()"></div><div id="PointQuestionAnswer"></div></div>
    
    <div id="PointQuestionAnswer">
      <div>正确答案:ABCD。<font color="red">请选择正确答案,重新提交。</font></div>
    </div>
    

    运行时机

    <div id="videoPoint" style="display: none;" class="tanchu_zsd">
    

    当弹出知识点,需要做题时候,即,该 div 变为可见时。自动执行提交答案逻辑。

    //获取弹出知点做题内容
    function getPointContent(nowTime) {
        //弹出后5秒内不再弹出
        if (testPoint > 0) {
            testPoint--;
        } else {
            for (var i = 0; i < window.points.length; i++) {
                //弹出知识点前后允许误差1秒
                if (testPoint == 0 && (nowTime - 1) <= window.points[i].PointVideoLen && window.points[i].PointVideoLen <= (nowTime + 1)) {
                    pauseVideo(); //暂停
                    unFullScreenVideo(); //退出全屏
                    document.getElementById("videoPointBg").style.display = "";
                    document.getElementById("videoPoint").style.display = "";
                    var strUrl = getPointContentUrl + "?rnd=" + Math.random();
                    try {
                        testPoint = 5;   //弹出后5秒内不再弹出
                        var xmlHttp = new XMLHttpRequest();
                        var sdata = "testid=" + window.points[i].TestID + "&pointnum=" + window.points[i].PointNum + "&forumid=" + window.points[i].ForumId + "&pointtype=" + window.points[i].PointType + "&newpointid=" + window.points[i].NewPointID;
                        xmlHttp.open("Post", strUrl, false);  // 同步
                        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                        xmlHttp.send(sdata);
                        if (xmlHttp.status == 200) {
                            var xmlDoc = xmlHttp.responseText;
                            document.getElementById("videoPointContent").innerHTML = xmlDoc;
                        }
                    } catch (e) {
                    }
                    break;
                }
            }
        }
    }
    

    在弹出做题页面之后,会发现 testPoint 的值一直是 5,也验证了代码中的逻辑。

    所以自动答题的触发逻辑应该是,每 30 秒钟检查一次,testPoint 的值是否等于5, 若是则执行自动答题逻辑。

    执行逻辑

    1. 无论是单选还是多选,第一次尝试都填写一个百分百错误的答案,例如“X”。
    2. 提交答案
    3. 从返回的答案提示中获取正确答案。再次提交答案

    最终代码

    扔到 Chrome - Sources - Snippets 中, 执行即可

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式