独清独醒

举世皆浊我独清,众人皆醉我独醒。

2022年3月24日更新-新版智慧树自动答题,跳过,调倍速(挂机)

智慧树网课辅助脚本,享受一口气看二十课的畅快体验。

本文旨在讨论研究算法,请勿非法使用,使用者出现任何问题概不负责。本人保留法律追究的权利

2022年3月24日更新

特性

  • 自动 1.5 倍速播放
  • 自动静音
  • 自动回答网课中弹题
  • 自动切换下一节、下一章
  • 自动点击之前,会随机等待0~60秒,模拟人类操作延迟

使用方法

  1. 下载Chrome(理论上只要有控制台的浏览器皆可。)

  2. 打开智慧树视频播放地址

  3. 按下F12

  4. 找到Console《2022年3月24日更新-新版智慧树自动答题,跳过,调倍速(挂机)》

  5. 输入以下代码后回车

    /**
    
    *  author: 乖乖龙
    
    *  description: 自动播放、自动下一集、自动选择视频弹窗题目、自动关闭答题窗口、刷智慧树网课必备
    
    *  use-method: 打开智慧树播放课程界面 按F12 -> Console -> 粘贴本代码 ->按回车键
    
    *  upadteTime: 2022/3/24
    
    */
    
    var gxkEnable = true;  
    var abnormalStuckDetectionEnable = true; 
    var abnormalStuckDetectionLimit = 10;  
    var autoClosePopUpTest = true; 
    var pauseResume = true; 
    var autoMute = true;  
    var auto15x = true; 
    var autoBQ = true;  
    var autoPlayNext = true;  
    var autoStop = false;  
    var autoStopTime = 30;  
    
    
    var copyEnable = true;
    var autoCopyEnable = true;
    
    
    
    
    //以下请勿修改
    var timeInterval = 1;  // 脚本主循环时间间隔
    var stuckCount = 0;  // 卡顿计数
    var lastProgressBar = '';  // 进度条缓存
    var startTime = new Date().getTime();
    
    /**
    * 获取浏览器名称
    * @returns 浏览器名称(如 "Safari")
    */
    function explorerDetect() {
       if (navigator.userAgent.indexOf("Opera") > -1) {
           return 'Opera';
       }
       else if (navigator.userAgent.indexOf("Firefox") > -1) {
           return 'Firefox';
       }
       else if (navigator.userAgent.indexOf("Chrome") > -1) {
           return 'Chrome';
       }
       else if (navigator.userAgent.indexOf("Safari") > -1) {
           return 'Safari';
       }
       else if (navigator.userAgent.indexOf("compatible") > -1 && navigator.userAgent.indexOf("MSIE") > -1 && !(navigator.userAgent.indexOf("Opera") > -1)) {
           return "IE";
       }
    }
    
    /**
    * 异步等待,只阻塞当前脚本调用处函数,不阻塞整个浏览器,默认等待 10 ms
    * 
    * 调用方法:await sleep() 或 await sleep (1000)
    * 
    * @param {number} ms 等待的毫秒数
    * @returns 一个匿名函数的 Promise
    */
    function sleep(ms = 10) {
       // 异步等待,只阻塞当前脚本调用处函数,不阻塞整个浏览器
       // 调用方法:await sleep() 或 await sleep (1000)
       return new Promise(function (resolve, reject) {
           setTimeout(() => {
               resolve();
           }, ms);
       })
    }
    
    /**
    * 获取当前时间
    * @returns 当前时间,格式化为:[MM/dd HH:mm:ss]
    */
    function dateTime() {
       var t = new Date();
       return '[' + (t.getMonth() + 1) + '/' + t.getDate() + ' ' + t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds() + '] ';
    }
    
    /**
    * 自定义的控制台 log 方法
    * @param {String} message 日志内容
    */
    function log(message) {
       console.log(dateTime() + '[智慧树助手] ' + message);
    }
    
    /**
    * 获取未观看列表
    * @returns 未观看的网课列表
    */
    function getNotPlayed() {
       var video_labels = [];
       var list = $('.clearfix.video');
       if (list.length > 0) {
           list.each(function (index, elem) {
               if ($(elem).find('.time_icofinish').length < 1) {
                   if (!$(elem).hasClass('current_play')) {
                       video_labels.push(elem);
                   }
               }
           });
       }
       console.log(
           "更新未看列表,还剩" + video_labels.length + "个视频未完成\n",
           { "点击展开全部": video_labels }
       );
       return video_labels;
    }
    
    /**
    * 切换1.5倍速
    */
    function autoSwitch15x() {
       if ($("video").length > 0 && $("video")[0].playbackRate != 1.5 && auto15x) {
           log('切换到1.5倍');
           if ($(".speedTab15").length > 0) {
               $(".speedTab15")[0].click();
           }
           if ($(".speedTab.speedTab15").length > 0) {
               $(".speedTab.speedTab15")[0].click();
           }
       }
    }
    
    /**
    * 切换标清
    */
    function autoSwitchBQ() {
       if ($(".definiLines .active").length > 0) {
           if ($(".definiLines .active")[0].className === "line1gq switchLine active" && autoBQ &&
               $(".line1bq.switchLine").length > 0) {
               log('切换到标清');
               $(".line1bq.switchLine")[0].click();
           }
       }
    }
    
    /**
    * 切换静音
    */
    function autoSwitchMute() {
       if ($("video").length > 0) {
           if ($("video")[0].volume > 0 && autoMute && $(".volumeIcon").length > 0) {
               log('自动静音');
               $(".volumeIcon")[0].click();
           }
       }
    }
    
    /**
    * 关闭页面加载后的一些“烦人的”弹窗
    */
    function closeTips() {
       if ($('.dialog[style!="display: none;"]:has(.dialog-read)').length > 0
           && $('.iconguanbi').length > 0) {
           log("学前必读已关闭");
           $('.iconguanbi').click();
       }
    
       if ($('.dialog-warn').css('display') !== 'none'
           && $('.el-icon-close').length > 0) {
           console.log('智慧树警告已关闭', $('.el-icon-close'));
           $('.el-icon-close').click();
       }
    
       if ($('#close_windowa').length > 0) {
           log("已关闭提示弹窗");
           $('#close_windowa')[0].click();
       }
    }
    
    /**
    * 关闭弹题测验
    */
    async function closePopUpTest() {
       var pop_up = $('.dialog-test');
       if (pop_up.length > 0 && autoClosePopUpTest) {
           //关闭出现的检测题
           var topic_item = $('.topic-item');
           var guess_answer = parseInt(Math.random() * topic_item.length);
           topic_item[guess_answer].click();
           await sleep(1000);
           var guess_char = 'ABCD'[guess_answer];
           //随机点击一个选项
           var answer = $('.answer').children().text();
           //选出正确答案
           if (answer.indexOf('A') !== -1 && answer.indexOf(guess_char) === -1) {
               topic_item[0].click();
           }
           else if (answer.indexOf('B') !== -1 && answer.indexOf(guess_char) === -1) {
               topic_item[1].click();
           }
           else if (answer.indexOf('C') !== -1 && answer.indexOf(guess_char) === -1) {
               topic_item[2].click();
           }
           else if (answer.indexOf('D') !== -1 && answer.indexOf(guess_char) === -1) {
               topic_item[3].click();
           }
           await sleep(1000);
           pop_up.find('div.btn').click();
           log(
               "为您跳过弹题测验," +
               ((answer === guess_char) ? ("一次蒙对,答案:" + answer) : ("蒙的" + guess_char + ',正确答案:' + answer))
           );
       }
    }
    
    /**
    * 检测是否播放完成
    */
    function progressBarMonitor() {
       var progress_bar = $('.nPlayTime');
       //监控进度条
       if (progress_bar.length > 0 && progress_bar.children().length > 0 && autoPlayNext) {
           var ProgressBar = progress_bar.children('.currentTime').text();
           // 跳集条件:
           // 1. 剩余时间不为 00:00:00 (即视频已成功加载)
           // 2. 已播放时间与剩余时间相等(即视频已播放完毕)
           // 3. 右侧目录中正在播放的栏目需要有 time_icofinish 图标(即系统已记录下视频播放完成)
           // 若以上三个条件中任意一个不满足则不跳集,而是回到视频开头重新开始(或由 stuckDetector() 函数刷新页面)
           if ((ProgressBar !== '00:00:00') && (ProgressBar === progress_bar.children('.duration').text() &&
               ($('.current_play').find('.time_icofinish').length > 0))) {
               log("检测到进度条已满");
               var next_video = null;
               if (window.location.href.indexOf("studyh5.zhihuishu.com") !== -1) {
                   next_video = $(getNotPlayed()[0]);
               }
               log("已为您自动切换下一集");
               next_video.click();
           }
       }
    }
    
    /**
    * 暂停检测
    */
    function pauseDetector() {
       var play_Button = $(".playButton");
       if (play_Button.length > 0 && pauseResume) {
           //点击暂停按钮,将继续播放视频
           play_Button.click();
           log("继续播放");
       }
    }
    
    /**
    * 卡顿检测
    */
    function stuckDetector() {
       if (abnormalStuckDetectionEnable) {
           var progress_bar = $('.nPlayTime');
           if (progress_bar.length > 0) {
               // 播放器正常加载的情况
               var ProgressBar = progress_bar.children('.currentTime').text();
               if ($("video").length > 0 && progress_bar.children().length > 0 &&
                   abnormalStuckDetectionLimit > 0 && pauseResume) {
                   if (ProgressBar !== lastProgressBar) {
                       if (stuckCount !== 0) {
                           log("已恢复播放,取消页面刷新计划");
                       }
                       stuckCount = 0;
                   }
                   else {
                       if (stuckCount >= abnormalStuckDetectionLimit) {
                           stuckCount = 0;
                           location.reload();
                       }
                       else {
                           stuckCount++;
                           log("即将刷新页面…… " + stuckCount + "/" + abnormalStuckDetectionLimit);
                       }
                   }
                   lastProgressBar = ProgressBar;
               }
           } else {
               // 播放器未正常加载的情况
               if (stuckCount >= abnormalStuckDetectionLimit) {
                   stuckCount = 0;
                   location.reload();
               } else {
                   stuckCount++;
                   log("即将刷新页面…… " + stuckCount + "/" + abnormalStuckDetectionLimit);
               }
           }
       }
    }
    
    /**
    * 强制允许复制
    */
    function copyEnabler() {
       log('强制复制');
       function hackItem(item) {
           item.onpaste = () => true;
           item.oncontextmenu = () => true;
           item.onselectstart = () => true;
           item.ondragstart = () => true;
           item.oncopy = () => true;
           item.onbeforecopy = () => true;
           Object.defineProperty(item, 'onpaste', { get: () => false })
           Object.defineProperty(item, 'oncontextmenu', { get: () => false })
           Object.defineProperty(item, 'onselectstart', { get: () => false })
           Object.defineProperty(item, 'ondragstart', { get: () => false })
           Object.defineProperty(item, 'oncopy', { get: () => false })
           Object.defineProperty(item, 'onbeforecopy', { get: () => false })
       }
       function hackClass(className) {
           for (const i of document.getElementsByClassName(className)) {
               hackItem(i);
           }
       }
       hackClass("subject_describe");
       hackItem(document.body);
       hackItem(document);
    }
    
    /**
    * 点击题目自动复制
    */
    function autoCopy() {
       function _legacyCopy() {
           log("正在使用传统方法复制");
           let tmpInput = document.createElement('input');
           $(this).append(tmpInput)
           tmpInput.value = $(this).text();
           tmpInput.focus();
           tmpInput.select();
           if (document.execCommand('copy')) {
               document.execCommand('copy');
           }
           tmpInput.blur();
           log('复制成功');
           $(tmpInput).remove();
           showDialog("复制成功!", 0, true, true);
           $(this).css("background-color", "#ECECEC");
           setTimeout(function (elem) {
               elem.css("background-color", "#FFFFFF");
           }, 200, $(this));
       }
       function _autoCopy() {
           log("题目内容:" + $(this).text());
           if (navigator.clipboard && window.isSecureContext) {
               log("正在使用 navigator clipboard api 进行复制操作");
               navigator.clipboard.writeText($(this).text())
                   .then(() => {
                       log('复制成功');
                       showDialog("复制成功!", 0, true, true);
                       $(this).css("background-color", "#ECECEC");
                       setTimeout(function (elem) {
                           elem.css("background-color", "#FFFFFF");
                       }, 200, $(this));
                   })
                   .catch(err => {
                       log("navigator clipboard api 复制时出错,将使用传统方法进行复制")
                       _legacyCopy();
                   })
           } else {
               _legacyCopy();
           }
       }
       $('.subject_describe').on("click", _autoCopy);
       $('.smallStem_describe').on("click", _autoCopy);
    }
    
    /**
    * 返回学堂
    */
    function backToMenu() {
       if ($('.back').length > 0) {
           $('.back').click()
       }
    }
    
    var dialog_number = 0;  // 弹窗编号
    var dialog_timeout = 5;  // 弹窗自动关闭倒计时
    /**
    * 显示提示信息弹窗
    * @param msg 弹窗内消息内容
    * @param timeout 弹窗自动收起的超时时间(秒),默认为 3,最小为 1
    * @param disable_header 不显示对话框标题栏,默认为 false
    * @param disable_footer 不显示对话框按钮栏,默认为 false
    */
    function showDialog(msg, timeout = 3, disable_header = false, disable_footer = false) {
       msg = msg || "默认消息内容";
       dialog_timeout = timeout - 1;
       var dialogId = {
           DialogContent: getRandString(getRandInt(5, 20)),
           DialogCloseButton: getRandString(getRandInt(5, 20)),
           DialogConfirmButton: getRandString(getRandInt(5, 20)),
           Dialog: getRandString(getRandInt(5, 20)),
       }
       var _html = `
           <div class="el-dialog__body">
               <div class="operate-dialog-1" id="` + dialogId.DialogContent + `">
                   <p>` + msg + `</p>
               </div>
           </div>
       `;
       if (!disable_header) {
           _html = `
               <div class="el-dialog__header">
                   <span class="el-dialog__title">提示</span>
                   <button type="button" aria-label="Close" class="el-dialog__headerbtn" id="` + dialogId.DialogCloseButton + `">
                       <i class="el-dialog__close el-icon el-icon-close"></i>
                   </button>
               </div>
           ` + _html;
       }
       if (!disable_footer) {
           _html += `
               <div class="el-dialog__footer">
                   <span class="dialog-footer">
                       <button type="button" class="el-button btn el-button--primary" id="` + dialogId.DialogConfirmButton + `">
                           <span id="confirm-btn">我知道了 (` + dialog_timeout + `)</span>
                       </button>
                   </span>
               </div>`
       }
       _html = `
           <div class="el-dialog__wrapper dialog-tips" style="z-index: 2001;">
               <div role="dialog" aria-modal="true" aria-label="提示" class="el-dialog" style="margin-top: 15vh;" id="` + dialogId.Dialog + `">
       ` + _html + `
               </div>
           </div>
       `
       $('#app').before(_html);
    
       /**
        * 关闭弹窗
        */
       function closeDialog() {
           $('.dialog-tips').remove()
       }
    
       $('#' + dialogId.Dialog).css('width', '400px')
       $('#' + dialogId.DialogContent).css({ "margin": "0 20px", "padding": "10px 0px 0px" });
       $('#' + dialogId.DialogCloseButton).on('click', closeDialog);
       $('#' + dialogId.DialogConfirmButton).on('click', closeDialog);
       /**
        * 超时后自动关闭弹窗
        */
       function countDown() {
           if (dialog_timeout > 0) {
               $('#confirm-btn').text('我知道了 (' + dialog_timeout + ')')
               window.setTimeout(countDown, 1000);
               dialog_timeout--;
           } else {
               closeDialog();
           }
       }
       window.setTimeout(countDown, 1000);
    }
    
    /**
    * 生成随机字符串
    * @param len: 字符串长度
    * @returns `string`
    */
    function getRandString(len = 10) {
       const str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
       let ret = "";
       for (let i = 0; i < len; i++) {
           ret += str.charAt(Math.floor(Math.random() * str.length));
       }
       return ret
    }
    
    /**
    * 生成范围内随机数
    * @param min: 最小值
    * @param max: 最大值
    * @returns `number`
    */
    function getRandInt(min, max) {
       return parseInt(Math.random() * (max - min + 1) + min, 10)
    }
    
    
    (function () {
       'use strict';
       /**
        * 一些仅在加载完成后执行一次的功能
        */
       function oneShot() {
           if (window.location.href.indexOf("onlineexamh5new.zhihuishu.com") !== -1
               && (window.location.href.indexOf("dohomework") !== -1 || window.location.href.indexOf("doexamination") !== -1)) {
               //测试题
               if (autoCopyEnable) {
                   setTimeout(alert, 1000, '点击题目可以一键复制噢');
                   var autocp = setInterval(function () {
                       if ($('.subject_describe').length > 0) {
                           autoCopy();
                           log('自动复制已启用');
                           clearInterval(autocp);
                       }
                   }, 1000);
               }
               if (copyEnable) {
                   copyEnabler();
               }
           }
           if (explorerDetect() === 'Safari'
               && window.location.href.indexOf("studyh5.zhihuishu.com") !== -1
               && autoMute == false) {
               window.setTimeout(alert, 1000, "由于Safari的限制,不允许视频自动播放,因此使用此脚本的自动播放功能时必须启用自动静音功能");
           }
       }
    
       /**
        * 主循环
        */
       function mainLoop() {
           try {
               if (window.location.href.indexOf("studyh5.zhihuishu.com") !== -1 && gxkEnable) {
                   //共享课
                   if ($(".controlsBar").length > 0) {
                       //log("视频正常加载");
                       autoSwitch15x();
                       autoSwitchBQ();
                       autoSwitchMute();
                       closeTips();
                       closePopUpTest();
                       progressBarMonitor();
                       pauseDetector();
                       stuckDetector();
                       if (autoStop && (new Date().getTime() - startTime > autoStopTime * 60 * 1000)) {
                           backToMenu();
                       }
                   } else {
                       //log("视频未加载");
                       stuckDetector();
                   }
               }
           }
           catch (err) {
               console.log(dateTime(), err.message);
           }
       }
       window.onload = window.setInterval(mainLoop, (timeInterval * 1000));
       oneShot();
       log("启动成功");
    })();
    

    6.完事儿。

2020年10月6日更新(已失效)

由于新版智慧树没有了“返回旧版”的按钮,于是只好自己重新写一个咯。(哼)

特性

  • 自动 1.5 倍速播放
  • 自动静音
  • 自动回答网课中弹题
  • 自动切换下一节、下一章
  • 自动点击之前,会随机等待0~60秒,模拟人类操作延迟
  • 视频左上角显示是否开启脚本

使用方法

  1. 下载Chrome(理论上只要有控制台的浏览器皆可。)

  2. 打开智慧树视频播放地址

  3. 按下F12

  4. 找到Console《2022年3月24日更新-新版智慧树自动答题,跳过,调倍速(挂机)》

  5. 输入以下代码后回车

    /**
    *  author: 乖乖龙
    *  description: 自动播放、自动下一集、自动选择视频弹窗题目、自动关闭答题窗口、刷智慧树网课必备
    *  use-method: 打开智慧树播放课程界面 按F12 -> Console -> 粘贴本代码 ->按回车键
    *  use-method: 视频左上方出现一个图标点击图标开始刷课 显示‘已开’脚本开始监听 再次点击图标关闭
    *  upadteTime: 2020/10/6
    */
    //定时器
    var timer;
    //++++++++ 以下为可设置的参数 ++++++++++
    //初始状态 0 开启 1关闭
    var startstatus = 0;
    //次数
    var number = 0;
    //视频播放到100%时候切换下一个
    var percent = 100;
    //速率
    var speed = "1.5";
    //静音
    var vol = true;
    //答题?不答题将会移除答题框
    var answer = true;
    //++++++++ 可设置的参数结束 ++++++++++
    //查找节点
    var tips = $(".video-study");
    //创建新节点
    var option = $("<div>");
    //添加样式
    var args = {
       "color":"DarkOrange",
       "text-align":"center",
       "line-height":"90px",
       "font-size":"30px",
       "background-image": "url(data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMgAyAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/Oa21/ydTQW/2o26FjOsjkEoJDywAJT5duRluec84HT3mp2vm7Jsxyl5PNLyPLLGu9lUDeE9UPGTwTkZK1u+O/gNe/C7+z9aub+OdYmSIqtuuYmCMB8u0LIc7eSRyDnOcjzW7u5ftulguIVaJXfzpQQxMhRmAAXb0A29lUc4FezUp1sO3GpofOUKuFzCHtMM7r7vzOut5xa3CzQGW5lMdw2InDSohRQxKuCCwTncAThywwU41/h34gGh6ilzGguFtkWS4a6twEjTKZYYyT7ZByAeOa4nw3qkWuRm2eFo4IGE7bcOhOzacg4JPBOc4AJwBWz4RtG8R6lJpqRm1ifEUcn2cvI+WcZAZuBneDtHGz1ya0oqenLK9ya0FFSU1a2p+p3gb41/s++L/hnY291eaNpl5a2CedbahYo8oIR/MVXdHZiGV2DRZJLRnkAivB/hB8GLH4meI/FGpeHHEGkQXs/2Le5RYYWlPlLhstvKd29K7D4L/sQ6dpnhO6uPEDyXOrQsscgVZQ1vny8EIF7eapJG4AgnPBx5R8WdS8Rfsp+PpbbwXqMdlaaqiRO0hjkTIZQhYShgQgDYORt3nkDiuug/Yym6UtfyOCveuoRqxsvuuewyeEdV0t2s5LKQSW5MLbbmTGV4OP3w449KK+bZv2tvE9zNJLcaJDdTyMWkncOTIxOSxKkKSTz8oA9ABRXZ7SXkef7J/wAr/A89+MHxzX4heHrHTLNbueGJZCBcxqq7TvRGOCTuAI5J6g9q8FuLS9RhcWxeN0AUmAlWIXDBjz64P1ArsNQv7GztWS3gARSdss2BuBA2kADqQP8APNfT/wCw38evBnwk0XxHD4u0uSO+vZB5V3bQrO8seMGFlJG0ZGfQ5OegrypUpYqSind+R7qrPBQc4U9Lnz98CvAg8XalqNnPdfY4nCsxEgO3nPDH8B+fNe233wm8JeHPAmo6hca7u1qPz5DJBc7ZYpVDsIUBJxubDd+XO3GRX2R4c/Zv+AP/AArqbxlrGnRaNrGt3M17It9fPp0tojliIUjSRVQKCvY8889K/OTS/h0ut/FTUbC31oR2V3qkltaXN02B5fnEK57H5QR26110KtGmlRcNU7NlYbJswzuvKph6totKVr2SS3u/69D6v/Z1/bi1ya11Twt8QL7SLc2kdtbWd7fAQu4TcCssqsoLLlWXpklupBI8b+Kd7N8dPHmoJZalBcafbSt9iuHO7zwCFyrd0LK+MA8AZz29++Kn7Kfw61fw7odnotwunX1+IEkvJmJnIX55d65ID7eORweOxFVtO/ZT8NfDPyEtNVvpdQvIw/73y0Yn5SYztB4OOT1+Vj71NOpRpSdtU/KzCvhK0oKT0fTqvM+NtV0TV59TvJYHMcDzO0aG9XKqWOB94dvYfSivuG3/AGUtLFvFuVWbaMk3CHJx6k80VHtKQvYS7n5iXF8U1C2mhdZDGyuRgAADAOT+hOTkYyeKf4V8VXOg6xod5bGMz2F4l3GkgDIxRwwD54I+UcdOvrXs37O/wf8ADfjfxXBH4nkmgt5QriNgRvVhkEk4yCOcjrX0L+0h+wn4f8P+BR4i8DaZcwXMIaRowfNWVFJU/IzdecjHBwK4Pq9aK54ys2dDzPDwq+ylFtLd9P8Ahjzz4u/G2++MvhzT7SDTW0iG3driQNchpXcqwyx2LgAMeOpz61j/AAc+AniXWPEdvFe6dqFlZlkkS4GYflBzuUNjcTkAMOgXvmvGPC/i+++H3i/T7q+sY77T9KuI55rK5GFmRZR8n9Bz2z7V92fG7/gpN4W1HQtGbwP4evn1ZWFzjVIlSGGMRuziOQOWcgMqc8AIAuM7a8+GKq06sVUjd9z9AxtTL6uCjRy6HIrK+tnfdu99U+nb7j6W0f4X/Z/CEU2qaVNdPEnlpc3V6ZZgpOC2SxIPPJz718UfHqXTvDfxAs9X0/VpDqUtwkKD7ezKxZWA3bmDBRvU5yqnBB9Rka1/wUg+KmraGNLitdE0a3kuPs32h7SUzRoMg7yXK5yvIOPxySvh+oapqfxH8RaFqmrzxtc3SNdOw5LkSFhGvG1eI/lTJ+YPk84HqRq8zblqfFNVKceVOyPsOz/bBvpLOBhZSSho1Ik2Xa7uOuAMDPoOKK/PS71CV7qZkl1IoXYqWlYkjPHO3milzw7G2vl9x9I/sR20Vx480dZYklU3aZDqCOor9jPG9jbXfwsvbee3img/s+P91IgZfvN2PHYflRRV1fhpHza/i4j0X6n4aftUWdvb+LT5UEceQc7EAz85H8gK8e1F2l1YwuxeFb5iI2OVBZzu498DPrgUUVw4v+JI+kwf+7w9Dfl/0bw3HPD+6njSNUlThlHnS8AjkdB+VbOlEp4q8KKp2rNobrIBwHHkynDevIB59KKKUdkby3LdhZwTWNtJJBG7tGrMzICSSBkk0UUV6p4z3P/Z)",
       "background-repeat": "no-repeat",
       "background-size": "100%",
       "width": "90px",
       "height": "90px",
       "border-radius": "45px",
       "position":"fixed",
       "left":"60px",
       "top":"200px",
       "z-index":"999"
    };
    option.css(args);
    //添加点击事件
    option.attr("onClick","StartOrStop()");
    option.attr("id","rains");
    option.text("Rains");
    //插入节点到页面
    tips[0].parentNode.insertBefore(option[0],tips[0]);
    //函数
    function start(){
       if(number % 200 == 0){
           console.clear();
       }
       number += 1;
    
       //获取视频速率
       var speedSpan = $(".speedBox>span").text().replace("X ","");
       if(speedSpan != speed){
           switch(speed){
               case "1.0":
                   $("div[rate='1.0']").click();
                   break;
               case "1.25":
                   $("div[rate='1.25']").click();
                   break;
               case "1.5":
                   $("div[rate='1.5']").click();
                   break;
           }
       }
       //判断音量
       var volume = parseInt($(".volumeBox .passVolume")[0].style.height);
       if(volume > 0 && vol == true){
           $(".volumeIcon").click();
       }
       //获取进度条
       var pass = $(".passTime");
       //获取答题框状态
       var dialog = $(".el-dialog__wrapper.dialog-test")[0];
       if(dialog != undefined){
           if(answer == false){
               //移除答题框
               $(".v-modal").remove();
               $(".el-dialog__wrapper.dialog-test")[0].remove();
               $("body").removeClass("el-popup-parent--hidden");
           }else{
               //如果是单选题或者判断题选择一个答案否则移除答题框
               if($(".title-tit").text() == "【单选题】" || $(".title-tit").text() == "【判断题】"|| $(".title-tit").text() == "【多选题】"){
                   //选择选项的第一个用于获取正确答案
                   $(".topic-list .topic-option-item")[0].click();
                   //取消已经选择的
                   $(".topic-list .topic-option-item").each(function(){
                       if($(this).hasClass("active")){
                           $(this).click();
                       }
                   })
                   //选择答案
                   let answer = $(".answer span").text().split(",");
                   $.each(answer,function(index,value){
                       let option = value.charCodeAt() - 65;
                       $(".topic-list .topic-option-item")[option].click();
    
                   });
                   //延时关闭弹窗
                   setTimeout("$(\".el-dialog__wrapper.dialog-test .el-dialog__footer .dialog-footer .btn\")[0].click();",1000);
               }else{
                   //如果不是这3个选项移除答题框以后弹框将不会出现
                   $(".v-modal").remove();
                   $(".el-dialog__wrapper.dialog-test")[0].remove();
                   $("body").removeClass("el-popup-parent--hidden");
               }
           }
           let play  = $(".bigPlayButton.pointer")[0];
           //如果暂停继续播放
           if(play.style.display == "block"){
               play.click();
           }
       }else{
           let play  = $(".bigPlayButton.pointer")[0];
           //如果暂停继续播放
           if(play.style.display == "block"){
               play.click();
           }
       }
       //判断播放进度是否大于83%
       if(parseInt(pass[0].style.width) > percent){
           //切换下一个视频
           $("#nextBtn").click();
       }
       console.log("执行第"+ number + "次");
    }
    function StartOrStop(){
       var rains = $("#rains");
       //获取播放状态
       var play  = $(".bigPlayButton.pointer")[0];
       if (startstatus == 0){
           //开始脚本
           timer = setInterval(start, 3000);
           //已经暂停 点击开始按钮 block时视频播放暂停
           if(play.style.display == "block"){
               play.click();
           }
           startstatus = 1;
           rains.text("已开");
           rains.css("color","blue");
           console.log("刷课开始执行");
       }else if (startstatus == 1) {
           //停止脚本
           clearInterval(timer);
           //已经播放 暂停播放
           if(play.style.display == "none"){
               play.click();
           }
           startstatus = 0;
           rains.text("已关");
           rains.css("color","red");
           console.log("刷课已停止");
       }
    }
    //执行监听方法 默认填入代码后开启脚本
    StartOrStop();
    

    6.看到视频左上角出现“已开”,说明操作正确。

    7.此时就可以愉快的奔放咯。

2019年11月7日更新(已失效)

有同学反映最近脚本没法用了,这是由于智慧树进行了改版而脚本还没改版。然而我本人又懒得重新写一个新的脚本,所以想到了一个折中的办法 嘻嘻~

进入智慧树的在线学习页面,点击右上角返回旧版,再根据下面的流程做一遍即可继续学习奔放

《2022年3月24日更新-新版智慧树自动答题,跳过,调倍速(挂机)》

特性

  • 自动 1.5 倍速播放
  • 自动静音
  • 自动切换流畅画质(摸鱼时网络更加通畅)
  • 自动关闭网课中弹题
  • 自动切换下一节、下一章
  • 自动点击之前,会随机等待0~60秒,模拟人类操作延迟

使用方法

  1. 下载Chrome(理论上只要有控制台的浏览器皆可。)

  2. 打开智慧树视频播放地址

  3. 按下F12

  4. 找到Console《2022年3月24日更新-新版智慧树自动答题,跳过,调倍速(挂机)》

  5. 输入以下代码后回车

    (function () {
    const MAX_DELAY = 60 // 切课时的最大延迟,单位:秒
    
    const sleep = (time) => new Promise((resolve) => setTimeout(resolve, time))
    
    const start = async function () {
        console.log('智慧树助手已启动')
    
        while (true) {
            console.log('正在检查')
            const delay = Math.floor(Math.random() * MAX_DELAY * 1000) + 1000
    
            if (!/1\.5/.test($('.speedBox').attr('style'))) {
                console.log('提升到1.5倍速')
                $('.speedTab15').click()
            }
    
            if ($('.volumeBox').find('.passVolume').width() != 0) {
                console.log('静音')
                $('.volumeIcon').click()
            }
    
            if ($('.playButton').length > 0) {
                console.log('点击播放')
                $('.playButton').click()
            }
    
            if ($('.popbtn_cancel')[0]) {
                console.log('发现弹题,将在' + delay / 1000 + ' 秒后点击关闭')
                await sleep(delay / 2)
                const iframe = document.getElementById('tmDialog_iframe').contentWindow
                iframe.document.querySelector('.answerOption label').click()
                await sleep(delay / 2)
                $('.popbtn_cancel').click()
            }
    
            if ($('.current_play').find('.progressbar').width() == $('.current_play').find('.progressbar_box').width()) {
                console.log('本节完成,' + delay / 1000 + ' 秒后将切到下一课')
                await sleep(delay)
                $('.current_play').nextAll('.video')[0].click()
            }
    
            await sleep(1000)
        }
    }
    
    start()
    }())
    

    6.看到智慧树助手已启动,说明操作正确。

    7.此时就可以愉快的奔放咯。

注意

本文旨在讨论研究算法,请勿非法使用,使用者出现任何问题概不负责。本人保留法律追究的权利

点赞