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 · 82 天前 · 6732 次点击
    这是一个创建于 82 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求说明

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

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

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

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

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

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

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

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

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

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

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

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

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

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