ZYMKJ 发表于 2023-2-7 13:17:19

求助:在线学习(保利威视播放器)加速的难点

1、继续教育在线学习,head部分引用了http://player.polyv.net/script/player.js,每隔10秒向服务器get数据,参数都在url中,
2、在body部分,有个script标签,内有多个function,其中一个为savePosition,也是每隔10秒向服务器post数据
3、get数据的响应值为1;
4、post响应为success;

思路一:先测试修改post数据,试试能不能达到实现加速的效果。
思路二:在思路一的基础上,同步修改get的url,看看能不能达到加速学习的效果。

难点一:在script标签多个function中,指定修改savePosition的sec1和sec2(player.j2s\_stayInVideoTime()为保利威视播放器函数接口,本次视频播放时间)
难点二:player.js,如何实现定时发送的? 未发现定时器? 如何实现劫持修改?

player.js的部分代码如下:

```
key: "sendData",
value: function() {
var t = this.video,
   e = this.duration,
   i = Math.min(Math.ceil(t.currentTime), e) || 0,
   n = Math.floor(this.pd),
   r = c.getTs(),
   a = n - this.prePd;
this.prePd = n;
var o = (r - this.sdts) / 1e3;
(o = Math.max(this.interval, Math.min(o, 60))) < a && (o = a);
var s = this.sd += o;
if (this.updateSdts(r), 0 !== n) {
var l = {
   pid: this.pid,
   vid: this.vid,
   uid: c.getUid(this.vid),
   flow: 0,
   ts: c.getTs(),
   href: this.href,
   duration: e,
   cts: i,
   sign: c.getSign("rtas.net", this.pid, this.vid, 0, n, i),
   sd: Math.floor(s),
   pd: n,
   pn: "HTML5",
   pv: this.pv
};
this.appId && (l.appId = this.appId), m()(l, this.data), 1 == ++this.sendCount && (this.viewerAvatar && (l.viewerAvatar = this.viewerAvatar), l.ute = "bop"), this.data.log && console.log(l), this.allowSend && M({
   url: this.URL || Xt,
   type: "get",
   data: l
})
}
}
```

script标签内代码如下:

```
<script type="text/javascript">
var player;
var lateInterval;
var leftTime;
var interTime = 10000;
var intervalsavePosition;
var allowFlag = "";
var sendTxt = "";
//共通方法
//new
function isIE(ver){
    var b = document.createElement('b');
    b.innerHTML = '<!--><i></i><!-->';
    return b.getElementsByTagName('i').length === 1;
}
//判断浏览器方法
//new
function isXpOrIe8(){
    var sUserAgent = navigator.userAgent;
    var isWinXP=false;
    isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows Xp") > -1;
    var isWinIE = isIE(6) ||isIE(7) ||isIE(8);
    return isWinXP && isWinIE;
}
//创建播放器方法   如果isXpOrIe8()方法返回true , 则flashvarsParam参数中要增加一个is_xp_ie8:'1' 的参数
function createPolyv(playPosition,banSeekByLimitTime){
    var flashvarsParam = {'autoplay':'true','watchStartTime':playPosition,'ban_seek_by_limit_time':banSeekByLimitTime,'ban_history_time':'on'};
    if(isXpOrIe8()){
      flashvarsParam = {'autoplay':'true','watchStartTime':playPosition,'ban_seek_by_limit_time':banSeekByLimitTime,'ban_history_time':'on',is_xp_ie8:'1'};
    }
                                                       
                                                                       
    player = polyvPlayer({
         wrap: '#polyvplayer02bfeb00e2ba940698c54cdf517aa9b6_0',
      'vid': '5c0ad4c56c8428644f270c51ae2d76ae_5',
            'width': '100%',
        'height': '640',
      'autoplay':true,
      'speed':false,
      'ban_seek_by_limit_time':banSeekByLimitTime,
      'ban_history_time':'on',
      'watchStartTime':playPosition
    });
}
                       
createPolyv('0','on');
function s2j_onVideoPlay(){
        intervalsavePosition = setInterval(savePosition,interTime);
}
function s2j_onVideoPause(){
        clearInterval(intervalsavePosition);
}
function s2j_onPlayOver(){
        clearInterval(intervalsavePosition);
      //if(isPlayEnd == "1") return false;
        isPlayEnd = "1";
        var path ="http://dlkj.edufe.cn:80/savePlayEndInteracted.action?logNo=15b22ebc-0da9-4e78-9d6a-a84980f77fe7";
      $.ajax({
                url: path,
                type:"post",
                dataType: "json",
                success: function (data) {
        }
    });               
}
function savePosition(){
    if(isPlayEnd == "1") return false;
    var path = "http://dlkj.edufe.cn:80/savePlayPositionInteracted.action?logNo=15b22ebc-0da9-4e78-9d6a-a84980f77fe7";
    var sec1=player.j2s_stayInVideoTime();
    var sec2=player.j2s_getCurrentTime();
    var param = "&totalSeconds="+sec1 + "&playPosition=" + sec2;
    $.ajax({
        url: path+param,
        type:"post",
        dataType: "json",
        success: function (data) {
    }
})
}
function getPlayer(movieName) {
   if (navigator.appName.indexOf("Microsoft") != -1) {
         var reObj=window;
         if(typeof(reObj)=="undefined"){
             return document;
         }
      try{
         if(reObj.length>0){
               return reObj;
         }else{
                return reObj;
         }
      }catch(e){}
      return ;
    }else {
      return document;
    }
}
</script>
```

李恒道 发表于 2023-2-7 13:17:20

ZYMKJ 发表于 2023-2-9 13:45
这么写?
Object.defineProperty (player,j2s_stayInVideoTime,{vaule:(j2s_stayInVideoTime*10})

不用define
直接复写就可以了

李恒道 发表于 2023-2-7 14:34:55

难点一:在script标签多个function中,指定修改savePosition的sec1和sec2(player.j2s_stayInVideoTime()为保利威视播放器函数接口,本次视频播放时间)
找到player对象劫持player.j2s_stayInVideoTime()这个函数
难点二:player.js,如何实现定时发送的? 未发现定时器? 如何实现劫持修改?
一般是对video事件做播放监听插点提交之类的
可以根据xhr的堆栈回溯找发包点和监控点

ZYMKJ 发表于 2023-2-7 15:10:32

本帖最后由 ZYMKJ 于 2023-2-7 15:20 编辑

李恒道 发表于 2023-2-7 14:34
难点一:在script标签多个function中,指定修改savePosition的sec1和sec2(player.j2s_stayInVideoTime()为 ...
懂了,又没懂。。。
最好使帮我写一下代码。

李恒道 发表于 2023-2-7 15:27:41

ZYMKJ 发表于 2023-2-7 15:10
懂了,又没懂。。。
最好使帮我写一下代码。

论坛问答区是学习互助哦
如果是单纯想要代码的话可以论坛发个单子报价看看有没有愿意接的

cxxjackie 发表于 2023-2-7 21:02:01

修改请求可以试试这个库:https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
难点1直接改url,难点2不用找定时器在哪,abort掉部分请求降低频率,或者利用Promise推迟请求,想提高频率就自己发请求好了。当然纯靠改请求不一定行的通,这个就要自己分析了。

ZYMKJ 发表于 2023-2-8 07:16:52

cxxjackie 发表于 2023-2-7 21:02
修改请求可以试试这个库:https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
难点1直接改url,难点2不 ...

谢谢,我试一试,之前ajaxHooer劫持库用过,但这个好像还不一样

ZYMKJ 发表于 2023-2-9 09:37:17

本帖最后由 ZYMKJ 于 2023-2-9 09:38 编辑

李恒道 发表于 2023-2-7 14:34
难点一:在script标签多个function中,指定修改savePosition的sec1和sec2(player.j2s_stayInVideoTime()为 ...
大概知道你说的劫持player对象的j2s_stayInVideoTime()函数,应该用Object.defineProperty这个函数对吗?
因为是引用player.js里的
j2s_stayInVideoTime: function() {return this.HTML5 ? Math.round(this.HTML5.statistics.pd) : this.flash.j2s_stayInVideoTime()}
所以我完全没必要分析player.js,直接劫持。代码大概如下,
Object.defineProperty (player,j2s_stayInVideoTime,
    {vaule:(return this.HTML5 ? Math.round(this.HTML5.statistics.pd) : this.flash.j2s_stayInVideoTime())*10}
)
大概是这样写对么?

李恒道 发表于 2023-2-9 09:49:09

ZYMKJ 发表于 2023-2-9 09:37
大概知道你说的劫持player对象的j2s_stayInVideoTime()函数,应该用Object.defineProperty这个函数对吗?
...

直接player.j2s_stayInVideoTime

ZYMKJ 发表于 2023-2-9 13:45:40

李恒道 发表于 2023-2-9 09:49
直接player.j2s_stayInVideoTime

这么写?
Object.defineProperty (player,j2s_stayInVideoTime,{vaule:(j2s_stayInVideoTime*10})
页: [1] 2
查看完整版本: 求助:在线学习(保利威视播放器)加速的难点