刷课网站,禁止了进度条拖动等功能,求编写油猴脚本覆盖思路

2022-11-14 22:22:06 +08:00
 DreamDreamer

需求说明

帮朋友刷课,网页版视频课,不能拖动进度条,要刷 90 个学时,太尼玛变态了,所以想到刷课。

几个思路

以前类似的需求我都是通过抓包工具 BurpSuite 改观看时长变量,然后放包实现的,也屡试不爽。但这次发现并不好使。。放包之后去课程页面看了,没有任何效果。看了源码也并没有研究清楚是哪里限制了,我都是按照 POST 数据的合法性放包的。

用扩展加速视频,发现也不好使,应该也是 js 禁止了视频加速

看了下网页源码发现是 js 控制禁用了许多功能,看来只有自己写 js 脚本 override 原有脚本了,可惜我 js 并不熟。前端大佬们帮忙看下,提供个思路。谢谢啦,我把源码贴出来,关键的地方应该也就是那几个。辛苦辛苦师傅们

 $(function(){
                        var time         = 0;
                        var is_hls       = "1";
                        var storage      = window.localStorage;
                        var learntime    = 0,player_seek_time = 0,setLearntime = null;
                        var is_drag      = parseInt("0"); // 控制拖动进度条 [ 1:可拖动,0:不可拖动] 
                        var content      = "成都 XX 科技有限公司所有权   ";
                        var learn_record = parseInt("40");

                        if(is_hls == 1){
                        
                        	var myPlayer   = videojs('my-video',{
                                 loop:false,
                                 controlBar: {
                                     LiveDisplay: false,
                                     playbackRateMenuButton:{
                                       //  playbackRates:[0.5,1.0,1.5,2.0,2.5]
                                     }
                                 }
                             },function(){
                                 $("#marquee_content").text(content);
                             });
                             //添加视频准备完成后的回调函数
                             myPlayer.on('loadedmetadata', function() {
                                
                          
                            	 //自动播放
                             if(learn_record){
                                     myPlayer.currentTime(learn_record);    //续播
                                     myPlayer.play();
                                     storage.setItem("play_time_155_1722_5091", learn_record);
                                 }
                                 // 初始化完成未播放时拖动进度
                              if(!is_drag){
                                     var play_time = parseInt(storage.getItem("play_time_155_1722_5091"));
                                     currentTime   = parseInt(myPlayer.currentTime());
                                     if( currentTime-play_time>1 ){
                                         myPlayer.currentTime(play_time);
                                     }
                                 }

                             });
                             //监听进度条时间
                             time = myPlayer.duration();
                             myPlayer.on('timeupdate',videojstimeupdate);
                            
                            
                            
                        }else{
                        	
                        	
                        	
                            var myPlayer = document.getElementById('my-video');
                            //添加视频准备完成后的回调函数
                            myPlayer.addEventListener('loadedmetadata', function() {
                                                          // 自动播放
                                $("#marquee_content").text(content);     // 跑马灯
               
                            if(learn_record){
                                    myPlayer.currentTime=learn_record;  // 续播
                                    myPlayer.play();
                                    storage.setItem("play_time_155_1722_5091", learn_record);
                                    
                                } 
                                // 初始化完成未播放时拖动进度
                            /*     if(!is_drag){
                                    var play_time = parseInt(storage.getItem("play_time_155_1722_5091"));
                                    currentTime   = parseInt(myPlayer.currentTime);
                                    if( currentTime-play_time>1 ){
                                        myPlayer.currentTime = play_time ;
                                    }
                                } */

                            });
                            
                            
                            
                            
                            //监听进度条时间
                            time = myPlayer.duration;
                            myPlayer.addEventListener('timeupdate',videotimeupdate);
                        }

                        //监听播放时间
                        function setTime(){
                            learntime = learntime+1;
                           }

                        //播放
                        function videojsplay() {
                        	
                        	  if(learn_record){
                                  myPlayer.currentTime(learn_record);    //续播
                                  myPlayer.play();
                                  storage.setItem("play_time_155_1722_5091", learn_record);
                              }else{
                            	  
                            	  setLearntime = setInterval(setTime, 1000);
                              }
                        	
                        	 
                          }

                         if(is_hls == 1){
                            myPlayer.on('play', videojsplay);
                            myPlayer.on('pause',videojspause);
                            myPlayer.on('ended', videojsended);
                            //暂停
                         function videojspause() {
                                clearInterval(setLearntime);
                                var times      = parseInt(myPlayer.currentTime());
                                var total_time = parseInt(myPlayer.duration());
                                if(times > 2){
                                    addLearnLog(times , total_time,1);
                                }
                            }
                            //结束
                            function videojsended() {
                                clearInterval(setLearntime);
                                var times      = parseInt(myPlayer.currentTime());
                                var total_time = parseInt(myPlayer.duration());
                                if(times > 2){
                                    addLearnLog(times , total_time,1);
                                }
                                if( total_time != 0 && times >= total_time ){
                                    // 获取下一解锁课时并跳转
                                    $.ajax({
                                        type: "POST",
                                        url:"http://xbzj.masterol.cn/index.php?app=course&mod=Video&act=getNextSection",
                                        data:{vid:"155",sid:"1722"},
                                        dataType:"json",
                                        success:function(data){
                                            if(data){
                                                var height = $('#vplayer').height();
                                                var width = $('#vplayer').width();
                                                var index = ui.open({
                                                    type:3,
                                                    icon:2,
                                                    shade: [0.7, '#fff'], //0.1 透明度的白色背景
                                                    offset: [height / 2+'px', width / 2+'px'],
                                                });
                                                setTimeout(function(){
                                                    window.location.href = data;
                                                }, 800);
                                            }
                                        }
                                    });
                                }
                            }
                        }else{
                            myPlayer.addEventListener('play',videojsplay);
                            myPlayer.addEventListener('pause',videojspause);
                            myPlayer.addEventListener('ended', videojsended);
                            //暂停
                            function videojspause() {
                                clearInterval(setLearntime);
                                var times      = parseInt(myPlayer.currentTime);
                                var total_time = parseInt(myPlayer.duration);
                                if(times > 2){
                                    addLearnLog(times , total_time,1);
                                }
                            }
                            //结束
                            function videojsended() {
                                clearInterval(setLearntime);
                                var times      = parseInt(myPlayer.currentTime);
                                var total_time = parseInt(myPlayer.duration);
                                if(times > 2){
                                    addLearnLog(times , total_time,1);
                                }
                                if( total_time != 0 && times >= total_time ){
                                    // 获取下一解锁课时并跳转
                                    $.ajax({
                                        type: "POST",
                                        url:"http://xbzj.masterol.cn/index.php?app=course&mod=Video&act=getNextSection",
                                        data:{vid:"155",sid:"1722"},
                                        dataType:"json",
                                        success:function(data){
                                            if(data){
                                                var height = $('#vplayer').height();
                                                var width = $('#vplayer').width();
                                                var index = ui.open({
                                                    type:3,
                                                    icon:2,
                                                    shade: [0.7, '#fff'], //0.1 透明度的白色背景
                                                    offset: [height / 2+'px', width / 2+'px'],
                                                });
                                                setTimeout(function(){
                                                    window.location.href = data;
                                                }, 800);
                                            }
                                        }
                                    });
                                }
                            }
                        }

                     
                  
                            
                         if(!is_drag){
                            var play_time = parseInt(storage.getItem("play_time_155_1722_5091"));

                             if(curr_times-times>1){
                        	    console.log('1307'+curr_times+'-'+play_time+'--'+times);
                        	    myPlayer.currentTime(play_time);
                        	    storage.setItem("play_time_155_1722_5091", play_time);
                               }   
        
                            }
                            
       
                            if( total_time != 0 && curr_times >= total_time ){
                                // 获取下一解锁课时并跳转
                                $.ajax({
                                    type: "POST",
                                    url:"http://xbzj.masterol.cn/index.php?app=course&mod=Video&act=getNextSection",
                                    data:{vid:"155",sid:"1722"},
                                    dataType:"json",
                                    success:function(data){
                                        if(data){
                                            var height = $('#vplayer').height();
                                            var width = $('#vplayer').width();
                                            var index = ui.open({
                                                type:3,
                                                icon:2,
                                                shade: [0.7, '#fff'], //0.1 透明度的白色背景
                                                offset: [height / 2+'px', width / 2+'px'],
                                            });
                                            setTimeout(function(){
                                                window.location.href = data;
                                            }, 800);
                                        }
                                    }
                                });
                            }

                            if( times     != parseInt(myPlayer.currentTime()) ){
                                times      = parseInt(myPlayer.currentTime());
                                if(times > 0 && times % 4 == 0 ){
                                    addLearnLog(times , total_time , 0);  //0 表示不及时更新学习记录,即 4 秒一次
                                }
                                storage.setItem( 'learn_curr_time', times);
                            }

                            if(is_free == 0 && free == 0){
                                if (times > test_time){
                                    myPlayer.pause();
                                    $("#vplayer").html('');
                                    $(".vedioPlay-msg").css("display","block");
                                }
                            }
                        }

                        //video 时间更新
                        function videotimeupdate() {
                            var test_time  = 5;
                            var is_free    = 1;//课程是否免费
                         var free       = 0;//课时是否免费

                         var total_time = parseInt(myPlayer.duration);
                            var times      = storage.getItem('learn_curr_time');
                            var curr_times = parseInt(myPlayer.currentTime);

                            // 拖动进度
                            if(!is_drag){
                                var play_time = parseInt(storage.getItem("play_time_155_1722_5091"));

                                 if(curr_times-times>1){
                            	    console.log('1307'+curr_times+'-'+play_time+'--'+times);
                            	    myPlayer.currentTime = play_time;
                            	    storage.setItem("play_time_155_1722_5091", play_time);
                                   }   
            
                                }

                            if( total_time != 0 && curr_times >= total_time ){
                                // 获取下一解锁课时并跳转
                                $.ajax({
                                    type: "POST",
                                    url:"http://xbzj.masterol.cn/index.php?app=course&mod=Video&act=getNextSection",
                                    data:{vid:"155",sid:"1722"},
                                    dataType:"json",
                                    success:function(data){
                                        if(data){
                                            var height = $('#vplayer').height();
                                            var width = $('#vplayer').width();
                                            var index = ui.open({
                                                type:3,
                                                icon:2,
                                                shade: [0.7, '#fff'], //0.1 透明度的白色背景
                                                offset: [height / 2+'px', width / 2+'px'],
                                            });
                                            setTimeout(function(){
                                                window.location.href = data;
                                            }, 800);
                                        }
                                    }
                                });
                            }

                            if( times     != parseInt(myPlayer.currentTime) ){
                                times      = parseInt(myPlayer.currentTime);
                                if(times > 0 && times % 4 == 0 ){
                                    addLearnLog(times , total_time , 0);  //0 表示不及时更新学习记录,即 4 秒一次
                                }
                                storage.setItem( 'learn_curr_time', times);
                            }

                            if(is_free == 0 && free == 0){
                                if (times > test_time){
                                    myPlayer.pause();
                                    $("#vplayer").html('');
                                    $(".vedioPlay-msg").css("display","block");
                                }
                            }
                        }

                        //添加观看记录
                        function addLearnLog(timespan , total_time , is_true){
                            var t          = parseInt(timespan);
                            var total_time = parseInt(total_time);
                            var video_type = "5";

                            if((t && (t % 4 == 0)) || is_true == 1){

                                $.ajax({
                                    type: "POST",
                                    url:"http://xbzj.masterol.cn/index.php?app=course&mod=Video&act=updateLearn",
                                    data:{time:t,player_seek_time:learntime,vid:"155",sid:"1722",totaltime:total_time,is_true:is_true,type:video_type},
                                    dataType:"json",
                                    success:function(data){
                                    	
                                      if(data.status=='0'){
                                       	    console.log('修正--'+t+'-'+data.time);
                                       	    
                                       	   if(is_hls == 1){
                                       		  myPlayer.currentTime(data.time);	
                                       	    }else{
                                       	      myPlayer.currentTime = data.time;
                                       	    }
                                       	    storage.setItem("play_time_155_1722_5091", data.time);
                                            ui.error('禁止多次拖动快进!');
                                            return;
                                       }else if(data.status=='-1'){
                                       	
                                       	    ui.error('您的登录已过期,请重新登录');
                                       	    var callbacklogin = "location.href ='/login.html'";
                                            setTimeout(callbacklogin,3000);
                                            return false;
                                       }else{
                                       	
                                       	
                                       }
                                    }
                                });

                            }
                        }
                    });
10015 次点击
所在节点    JavaScript
82 条回复
kyuuseiryuu
2022-11-14 22:28:46 +08:00
想起了以前我大学的时候也要刷网课。
我的解决思路就是当课程播放完以后自动点下一课。
然后晚上挂着第二天早上起床就刷完了。
DreamDreamer
2022-11-14 22:31:07 +08:00
@kyuuseiryuu 按键精灵吗?怎么操作 xd
angrylid
2022-11-14 22:31:12 +08:00
greasyfork 都能找到主流平台的脚本。不拖条,就是挂着刷。
qq316107934
2022-11-14 22:32:32 +08:00
这种一般都有时长统计和心跳汇报,按楼上思路走就行,做连续播放
shawndev
2022-11-14 22:33:43 +08:00
myPlayer.on('timeupdate',videojstimeupdate);
DreamDreamer
2022-11-14 22:34:40 +08:00
@angrylid 我搜了,确实有智慧树、超星等等,但他这个好像是找的外包做的,不知道用的是自有的平台还是哪套大平台的框架=。=
DreamDreamer
2022-11-14 22:37:15 +08:00
@shawndev 这就是一直在更新时长哈
lwjef
2022-11-14 22:43:16 +08:00
脚本猫上面看看呢 https://scriptcat.org/search
yankebupt
2022-11-14 22:49:54 +08:00
看了,挺变态,还拿当前时间相减防作弊,storage.setItem 把已看时间,心跳计数器全写入 cookie 了?
关网页直接改系统时间和 cookie 然后续播可行不?
需要算总视频秒数,learntime 变量有统计每秒一次……有够变态

然后是……建议刷满
解锁下一课时那个是服务器端,js 反作弊都做这么细,PHP 如果有反作弊你就挂了。
weiwoxinyou
2022-11-14 22:52:18 +08:00
1. 手动触发 播放器的 ended 事件,让脚本认为该视频看完了
2. storage.setItem("play_time_155_1722_5091", data.time) 好像是用来存储观看进度的,直接将 data.time 修改为视频时长不知是否可行
bobryjosin
2022-11-14 22:53:56 +08:00
超星更新倒是挺勤快的,前段时间也是挂了个脚本瞬间完成课时,然后看着全绿去睡觉了,早上一起来全给我打回了,被迫写了个小脚本挂着自动播放了
723X
2022-11-14 22:57:27 +08:00
想起来我学弟跟我说过,他当时刷什么消防安全课程要求当天结束,视频不能倍速,还限制单标签播放,后来他开浏览器无痕模式 double 一下再加五个虚拟机连同主机总共 12 视频同时播放,一小时不到结束,我直呼牛逼
DreamDreamer
2022-11-14 22:59:25 +08:00
@yankebupt 唉。准备放弃。确实规则好复杂。本来我就不熟悉 js
DreamDreamer
2022-11-14 23:00:06 +08:00
@723X 有道理,不然我就不研究了,直接物理开刷。。。
DreamDreamer
2022-11-14 23:00:30 +08:00
@weiwoxinyou 谢谢兄弟
Huelse
2022-11-14 23:05:29 +08:00
遇到这种复杂的就直接考虑模拟请求来完成了,当然 debug 过程可能很痛苦,最终也可能模拟请求也要间隔视频时长才有效,所以不如考虑后台自动刷满

当然如果是有学习意义的内容,能自己看完最好,这都是花钱买的
Joishh
2022-11-14 23:07:08 +08:00
@723X 多几个不同的浏览器也可以吧?也许这样就不需要虚拟机了
XIU2
2022-11-14 23:09:40 +08:00
我想起来两年前,也经历过一次,但比较简单,网页没啥限制,我直接写个脚本全程自动下一个视频、下一个合集,即登录后打开第一个视频就不用管了。
本来需要连续 10 天,每天看 8 小时才能看完,16 倍速 5 小时就刷完了。

因为就我多少懂一点这些,所以当时还帮了一百多人刷课,两台电脑上各挂 10 个,两天就解决了。。。

不过也只能算半自动,因为刷课前需要刷脸验证一次,只能让对方先刷脸,然后手动登录,有点麻烦,否则连登录都能全自动~
DreamDreamer
2022-11-14 23:11:02 +08:00
@Joishh 暂时我是让我朋友三个浏览器,每个都开隐私,六个窗口在刷。
DreamDreamer
2022-11-14 23:11:27 +08:00
@Huelse 好的好的谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/895249

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX