V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
DreamDreamer
V2EX  ›  JavaScript

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

  •  2
     
  •   DreamDreamer · 2022-11-14 22:22:06 +08:00 · 11808 次点击
    这是一个创建于 742 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求说明

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

    几个思路

    • BurpSuite 抓包直接改 POST 数据体

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

    • 加速网页视频播放速度

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

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

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

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

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

    不过也只能算半自动,因为刷课前需要刷脸验证一次,只能让对方先刷脸,然后手动登录,有点麻烦,否则连登录都能全自动~
    DreamDreamer
        19
    DreamDreamer  
    OP
       2022-11-14 23:11:02 +08:00
    @Joishh 暂时我是让我朋友三个浏览器,每个都开隐私,六个窗口在刷。
    DreamDreamer
        20
    DreamDreamer  
    OP
       2022-11-14 23:11:27 +08:00
    @Huelse 好的好的谢谢
    DreamDreamer
        21
    DreamDreamer  
    OP
       2022-11-14 23:12:19 +08:00
    @XIU2 雀食牛皮。我就准备借这个机会好好学习一下。
    723X
        22
    723X  
       2022-11-14 23:14:49 +08:00 via Android
    @DreamDreamer #14 现在机器性能都过剩,多端同时刷就完事了,就是操作麻烦点,都得一个个登录

    @Joishh #17 好像是不行,听说同一设备 ie 和 edge 同时刷会被检测出来,多端就不会,感觉也加入了 ip 地址的判定(?)
    HikariLan
        23
    HikariLan  
       2022-11-14 23:18:18 +08:00 via Android
    @kyuuseiryuu 我也是哈哈,我用 selenium 写了一个刷课的自动化测试程序
    https://github.com/shaokeyibb/AutoZhiHuiShu
    723X
        24
    723X  
       2022-11-14 23:19:34 +08:00 via Android
    @XIU2 #18 好家伙,现在学习课程之前还要刷脸?太离谱了,感觉已经本末倒置了
    Herry001
        25
    Herry001  
       2022-11-14 23:22:04 +08:00   ❤️ 1
    这玩意的核心是有没有后端的检测(比如在后端用完成时间减去开始时间)……要是有的话只能慢慢刷,顶多写个脚本自动下一页。
    DreamDreamer
        26
    DreamDreamer  
    OP
       2022-11-14 23:23:03 +08:00
    @723X 用 headeredit 那个插件应该就能绕过
    leonshaw
        27
    leonshaw  
       2022-11-14 23:25:28 +08:00   ❤️ 2
    虚假的物理开刷:开虚机挂脚本
    真实的物理开刷:自己加速到 0.8 倍光速挂脚本,从而用 54 小时刷完 90 小时的课
    723X
        28
    723X  
       2022-11-14 23:28:29 +08:00 via Android
    @DreamDreamer #26 按这个趋势,他们下一步就是禁止多端同时登录了🤣
    XIU2
        29
    XIU2  
       2022-11-14 23:30:12 +08:00
    @723X 我就经历过这一次网课,不清楚其他网课是什么样子的~

    其实我一开始没那么大方,只是想着我自己省力写了脚本,刷完自己的后感觉挺好用,就顺便帮关系好的刷刷,结果过了一段时间,临近截止日期时,发现就特么我们刷完了,其他人都稀稀拉拉的,最后我被迫帮忙刷了一百多个人的,这期间还有更多其他地的人想找我,但我都直接无视了。。。

    反正当时这网课也是走个流程,后续的考试也相当于直接填答案一样。。。
    Eiden
        30
    Eiden  
       2022-11-14 23:33:07 +08:00
    没有什么发包解决不了的, 大不了花真实的时间发包
    Joishh
        31
    Joishh  
       2022-11-14 23:56:55 +08:00 via Android
    感觉我们都在钻小聪明,漏洞,后面想想这应该是哪个精神需要 24 小时正常证明制定的课程吧
    MMMMMMMMMMMMMMMM
        32
    MMMMMMMMMMMMMMMM  
       2022-11-15 00:40:16 +08:00
    用 ce 附加浏览器改
    emric
        33
    emric  
       2022-11-15 00:51:00 +08:00
    可以看看我大学做的这个。https://github.com/17/erya
    思路是用浏览器书签注入 JS 修改,第二版我直接替换播放器 swf 了。
    ericgui
        34
    ericgui  
       2022-11-15 03:04:06 +08:00   ❤️ 3
    你这还只是上课而已,你见过那种每小节都有测试题,然后上完了有个小型考试的网课吗?
    xyjincan
        35
    xyjincan  
       2022-11-15 08:18:08 +08:00 via Android
    电脑开着慢慢跑就行了,
    lanwairen123
        36
    lanwairen123  
       2022-11-15 08:45:18 +08:00
    抓包模拟提交,观察一段时间内听课时浏览器提交的数据,再用程序模拟提交,一般都可以的,之前我做过一个客户端和服务端都有验证的,用程序挂后台,也得挂实际课时的时间。
    liuidetmks
        37
    liuidetmks  
       2022-11-15 08:58:57 +08:00   ❤️ 1
    后端检测到作弊直接按挂科处理。调试机会都不给你
    xuanbg
        38
    xuanbg  
       2022-11-15 09:09:00 +08:00   ❤️ 4
    网课防刷这个我干过,嘿嘿。。。
    1 、后端根据服务器上的时间校验播放时长,加速狗有一个跪一个。
    2 、账号只能单设备登录,多开狗急得跳脚。
    susunus
        39
    susunus  
       2022-11-15 09:16:33 +08:00
    通常我都是打开 video 标签,然后把扫速调到最高,加上 control 属性
    root01
        40
    root01  
       2022-11-15 09:18:16 +08:00   ❤️ 1
    多开几个网页+加速插件 我就是这样帮我女朋友刷的
    biubiu001
        41
    biubiu001  
       2022-11-15 09:22:06 +08:00   ❤️ 1
    我觉得最简单的就是调一定阈值的播放速度: https://github.com/polywock/globalSpeed ;再写脚本做连续播放
    oppoic
        42
    oppoic  
       2022-11-15 09:28:44 +08:00
    据说有风险。我是开着家里电脑放视频,工作的时候过会连上去点击下一课
    yaphets666
        43
    yaphets666  
       2022-11-15 09:36:35 +08:00
    不行的,视频是一个计时,还有其他计时代码的。你跳了就会记录你作弊。
    kkk123
        44
    kkk123  
       2022-11-15 09:45:20 +08:00
    广州的以前可以多开,今年开始不行了,估计是引进了#38 那种狗吧
    killva4624
        45
    killva4624  
       2022-11-15 09:58:58 +08:00
    这么一想我们大学时候的英语视听作业还真是朴素,甚至能用变速精灵...
    christin
        46
    christin  
       2022-11-15 10:07:15 +08:00
    建议搞个学生云服务器,装个 Windows 系统,把课挂上去就行了。
    你也可以帮同学挂课,收个 5 块 10 块的,服务器本也能收回来。
    DreamDreamer
        47
    DreamDreamer  
    OP
       2022-11-15 10:16:47 +08:00
    感谢大佬们的回复,不一一回了。现在的情况就是我开了火狐+Chrome 浏览器隐私,外加一个虚拟机,一共八个页面在给他正常物理刷。
    276562578
        48
    276562578  
       2022-11-15 10:20:37 +08:00
    我是用它的播放器的 seek 功能以每秒 call 一次它的心跳函数,这玩意还有发包时间和总时长的比较,你发包快了也不行。所以除非课程很多,还是物理刷比较快
    ufan0
        49
    ufan0  
       2022-11-15 10:27:22 +08:00
    好多年前了,是不是有个平台叫智慧树?

    直接干到人家的提交接口了,物理超度。
    zpfhbyx
        50
    zpfhbyx  
       2022-11-15 10:45:41 +08:00
    https://github.com/xxxily/h5player 这个啊, 油猴脚本, 贼好使
    ljsh093
        51
    ljsh093  
       2022-11-15 10:58:38 +08:00
    你的这几个思路我看了都怕,秋后算账直接全校通报了。我以前上学的时候就通报过一批,老老实实挂着吧
    openmynet
        52
    openmynet  
       2022-11-15 10:59:32 +08:00   ❤️ 1
    @DreamDreamer 既然都用 ff 了直接使用 Multi-Account Containers 拓展进行多不更方便
    Greenm
        53
    Greenm  
       2022-11-15 11:01:00 +08:00
    只要是通用平台,基本都有现成的刷课脚本的,我最近才帮人刷了两节课。
    Ritr
        54
    Ritr  
       2022-11-15 13:11:50 +08:00
    按键精灵吧
    Light3
        55
    Light3  
       2022-11-15 13:32:35 +08:00
    别的网课没上过 不知道
    就按照公司 分配给每个人的 首善之都某企业学习平台来说

    1 微信刷脸登陆
    2 访问时间限定(只可早 8-6 )
    3 心跳连接
    4 定时弹窗 再刷脸验证 (电脑端基本半小时一次)
    5 看完了再考试 (每次题还不一样)

    看完 100 个小时 首善之都 zf 奖励公司 1000 补贴?

    反正那时候硬挂 想钻空子也没的钻
    timedivision
        56
    timedivision  
       2022-11-15 13:53:22 +08:00
    写个自动切换的脚本然后硬挂吧,这样最稳妥,这些都有定时上送观看记录的,想破可以,麻烦点罢了
    wangxiaoaer
        57
    wangxiaoaer  
       2022-11-15 14:06:40 +08:00
    我用到的几个平台目前都升级了,不再是过去简单粗暴的上传个时间、课程就完事儿。

    而是定时( 5s )向后台发日志,请求参数包括课程、当前时间之类,然后非对称加密后放到 后台,后台应该根据这些日志计算进度。
    wangxiaoaer
        58
    wangxiaoaer  
       2022-11-15 14:10:49 +08:00
    @723X #12 有的平台禁止多 session 登录就不行了。
    rodrick
        59
    rodrick  
       2022-11-15 14:16:08 +08:00
    现在很多禁止了多端登录和加速观看了 服务端会对比实际的时间 只能硬挂着 甚至有挂一会跳出来弹窗做个题的..
    kamin
        60
    kamin  
       2022-11-15 14:23:21 +08:00
    以前挂课是用按键精灵,我刷的网课看完后屏幕固定位置会有下一课按钮,所以先大概看一下最长的课是多长。然后通过按键精力设置时间,定时按下屏幕对应按钮位置。
    Jirajine
        61
    Jirajine  
       2022-11-15 14:27:35 +08:00   ❤️ 2
    @xuanbg 一般程序员做这种缺德需求都会甩锅给产品和老板,像你这样直接承认的比较少见。
    DreamDreamer
        62
    DreamDreamer  
    OP
       2022-11-15 15:01:39 +08:00
    @Jirajine 真的,我都不知道该说啥了=。=
    willsank0430
        63
    willsank0430  
       2022-11-15 15:08:38 +08:00
    来来来 这里可以刷程序员面试题免费的

    https://www.developers.pub/wiki
    benjaminliangcom
        64
    benjaminliangcom  
       2022-11-15 16:03:57 +08:00 via iPhone
    某学习好像 ios 客户端能拖动
    hai046
        65
    hai046  
       2022-11-15 16:10:35 +08:00
    我突然又一个邪恶的改进想法😄
    例如
    1 、请弹幕回复“我已学习了 xx 章 xxx 知识点”
    2 、随机事件弹出 dialog ,请按照轨迹画曲线
    3 、请休息 10 分支后再来
    4 、请总结刚才我说的知识点
    40kecedwixyCdM81
        66
    40kecedwixyCdM81  
       2022-11-15 16:13:14 +08:00
    以前直接写 py 脚本一顿 post ,一分钟刷完整套水课
    AmiKara
        67
    AmiKara  
       2022-11-15 16:24:02 +08:00
    我的建议是挂着刷,如果后台校验时长,脚本做再多也是浪费时间,还是求稳吧
    quantumbyte
        68
    quantumbyte  
       2022-11-15 16:26:18 +08:00 via iPhone
    本科刷课的时候不仅不能快进,还要每十几分钟填验证码🙄
    kett
        69
    kett  
       2022-11-15 16:55:11 +08:00   ❤️ 1
    你折腾脚本的时间都够挂完的了
    nicotine
        70
    nicotine  
       2022-11-15 18:24:52 +08:00
    黑掉服务器直接改数据库可好
    crab
        71
    crab  
       2022-11-15 18:34:17 +08:00   ❤️ 1
    直接设置下 Chrome 快捷方式的启动命令行参数,指定不同的 cookies 和缓存,就不用开其他浏览器和虚拟机了.
    xuanbg
        72
    xuanbg  
       2022-11-15 18:36:12 +08:00
    @Jirajine 不不不,我是写代码的产品经理,我不甩锅,也没人能把锅甩给我。。。其实我本来还想搞个随机弹窗刷脸的功能,和 12123 的学法减分一样。考虑到上天有好生之德,于是乎罢了这个想法。🐶
    geebos
        73
    geebos  
       2022-11-15 18:37:33 +08:00
    为什么不写个脚本自动下一集呢,放到后台挂着,也只要挂几天就能刷完吧
    Believer
        74
    Believer  
       2022-11-15 19:20:35 +08:00
    后台有防作弊,拖动这种直接记录。
    Ansen
        75
    Ansen  
       2022-11-15 19:47:57 +08:00
    多装几个浏览器、或者 chrome 多创建用户同时刷
    xiyuesaves
        76
    xiyuesaves  
       2022-11-15 19:49:19 +08:00 via Android
    其实不用管进度条,去截取他的心跳包,直接修改里面的已观看时间就行了
    opengps
        77
    opengps  
       2022-11-15 19:54:51 +08:00
    开按量付费服务器,挂机刷呗
    guanzhangzhang
        78
    guanzhangzhang  
       2022-11-16 11:01:17 +08:00
    最稳妥的就是利用 cdp 协议驱动 chrome 登录网站,然后播放视频期间不停晃动鼠标,然后自动等下一课或者等它自动播放到下一课,然后关闭电脑声音晚上挂着就行。
    找接口和加速感觉就是赌作死概率
    Damn
        79
    Damn  
       2022-11-16 12:35:11 +08:00
    @xiyuesaves 我遇到过改心跳包成功,服务器也保存了进度,甚至你刷新了页面之后就是你修改的进度,但完成按钮有后台校验,点不过。。
    wyxls
        80
    wyxls  
       2022-11-16 13:39:38 +08:00
    来来回回感觉最后会逼得校方动用生物认证
    DreamDreamer
        81
    DreamDreamer  
    OP
       2022-11-17 11:34:26 +08:00
    @Damn 我去。真的没有最 BT ,只有更 BT 。我以前有个网站发包改成功过,后来人家也增加了一条异或然后 RSA 加密验证。真的难
    DreamDreamer
        82
    DreamDreamer  
    OP
       2022-11-18 10:14:28 +08:00
    最终还是集合了各位师傅们的意见,通过 Multi-Account Containers (Firefox) 和 SessionBox (Chrome)扩展,配合 Global Speed 视频加速插件,多开不同身份标签页同时手动物理刷最简单粗暴。要注意,内存要是 16 个 G 以下这样操作可能就要跑满了。。坑点是视频加速插件最多加速到 3.5 倍速,否则进度条会一直跳回。脚本和 Selenium 以后再尝试吧。。。还是懒了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:02 · PVG 12:02 · LAX 20:02 · JFK 23:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.