iambus / youku-lixian

优酷下载脚本,顺便支持其他……
Other
849 stars 265 forks source link

pptv获取到的分段的MP4下载链接无效,获取最终下载地址key的算法貌似变了,原有的算法失效了 #37

Open clarck opened 12 years ago

clarck commented 12 years ago

iambus,按照你的python脚本去执行的,获取到的分段的MP4链接无效,后来我去抓包了一下,发现它获取key的算法貌似变了,获取到的最终的下载MP4地址失效了,求解释。 测试链接:http://v.pptv.com/show/KZvXVb0jk9E0sho.html

iambus commented 12 years ago

这个很久没用过了。刚才简单试了下,一时看不出来是怎么算的。可能要稍后找时间再细看了。

cscscheng commented 11 years ago

key的计算变复杂了很多..用st时间减去60秒再做了内部的一些自己写的算法.破解了pptv的播放器swf.大概看了下.. 哪天我给你贴代码...flash的代码..我不太看得懂... 看你忙不过来啊...呵呵..加油啊

cscscheng commented 11 years ago

config.dMillis = Date.parse(xmldown.servertime) - 60 * 1000 - Date.parse(new Date().toUTCString()); _loc_1 = Utils.constructKey((config.dMillis + Date.parse(new Date().toUTCString())) / 1000); public static const SERVER_KEY:String = "qqqqqww";

public static function getkey(param1:String) : uint { var _loc_5:String = null; var _loc_6:uint = 0; var _loc_7:uint = 0; var _loc_2:* = param1.split(""); var _loc_3:uint = 0; var _loc_4:Number = 0; while (_loc_4 < _loc_2.length) {

            _loc_5 = _loc_2[_loc_4];
            _loc_6 = _loc_5.charCodeAt(0);
            _loc_7 = _loc_6 << _loc_4 % 4 * 8;
            _loc_3 = _loc_3 ^ _loc_7;
            _loc_4 = _loc_4 + 1;
        }
        return _loc_3;
    }// end function

   static function encrypt(param1:String, param2:String) : String
    {
        var _loc_5:uint = 0;
        var _loc_6:uint = 0;
        var _loc_7:uint = 0;
        var _loc_13:uint = 0;
        var _loc_14:uint = 0;
        var _loc_15:uint = 0;
        var _loc_16:uint = 0;
        var _loc_17:uint = 0;
        var _loc_18:uint = 0;
        var _loc_19:uint = 0;
        var _loc_20:uint = 0;
        var _loc_21:uint = 0;
        var _loc_22:uint = 0;
        var _loc_23:uint = 0;
        var _loc_24:int = 0;
        var _loc_25:uint = 0;
        var _loc_26:uint = 0;
        var _loc_27:uint = 0;
        var _loc_28:uint = 0;
        var _loc_29:uint = 0;
        var _loc_30:uint = 0;
        var _loc_31:uint = 0;
        var _loc_32:uint = 0;
        var _loc_33:uint = 0;
        var _loc_34:uint = 0;
        var _loc_35:uint = 0;
        var _loc_36:uint = 0;
        var _loc_37:uint = 0;
        var _loc_38:uint = 0;
        var _loc_39:uint = 0;
        var _loc_40:uint = 0;
        var _loc_41:uint = 0;
        var _loc_3:int = 16;
        var _loc_4:* = getkey(param2);
        var _loc_8:* = param1.split("");
        var _loc_9:* = param2.split("");
        var _loc_10:* = _loc_4;
        _loc_5 = _loc_4 << 8 | _loc_10 >>> 24;
        _loc_6 = _loc_10 << 16 | _loc_10 >>> 16;
        _loc_7 = _loc_10 << 24 | _loc_10 >>> 8;
        var _loc_11:String = "";
        var _loc_12:uint = 0;
        while (_loc_12 + _loc_3 <= _loc_8.length)
        {

            _loc_13 = _loc_8[_loc_12].charCodeAt(0) << 0;
            _loc_14 = _loc_8[(_loc_12 + 1)].charCodeAt(0) << 8;
            _loc_15 = _loc_8[_loc_12 + 2].charCodeAt(0) << 16;
            _loc_16 = _loc_8[_loc_12 + 3].charCodeAt(0) << 24;
            _loc_17 = _loc_8[_loc_12 + 4].charCodeAt(0) << 0;
            _loc_18 = _loc_8[_loc_12 + 5].charCodeAt(0) << 8;
            _loc_19 = _loc_8[_loc_12 + 6].charCodeAt(0) << 16;
            _loc_20 = _loc_8[_loc_12 + 7].charCodeAt(0) << 24;
            _loc_21 = 0 | _loc_13 | _loc_14 | _loc_15 | _loc_16;
            _loc_22 = 0 | _loc_17 | _loc_18 | _loc_19 | _loc_20;
            _loc_23 = 0;
            _loc_24 = 0;
            while (_loc_24 < 32)
            {

                _loc_23 = _loc_23 + DELTA;
                _loc_33 = (_loc_22 << 4) + _loc_4;
                _loc_34 = _loc_22 + _loc_23;
                _loc_35 = (_loc_22 >>> 5) + _loc_5;
                _loc_36 = _loc_33 ^ _loc_34 ^ _loc_35;
                _loc_21 = _loc_21 + _loc_36;
                _loc_37 = (_loc_21 << 4) + _loc_6;
                _loc_38 = _loc_21 + _loc_23;
                _loc_39 = _loc_21 >>> 5;
                _loc_40 = _loc_39 + _loc_7;
                _loc_41 = _loc_37 ^ _loc_38 ^ _loc_40;
                _loc_22 = _loc_22 + _loc_41;
                _loc_24++;
            }
            _loc_25 = _loc_21 >>> 0 & 255;
            _loc_26 = _loc_21 >>> 8 & 255;
            _loc_27 = _loc_21 >>> 16 & 255;
            _loc_28 = _loc_21 >>> 24 & 255;
            _loc_29 = _loc_22 >>> 0 & 255;
            _loc_30 = _loc_22 >>> 8 & 255;
            _loc_31 = _loc_22 >>> 16 & 255;
            _loc_32 = _loc_22 >>> 24 & 255;
            _loc_11 = _loc_11 + getCharFromAscii(_loc_21 >>> 0 & 255);
            _loc_11 = _loc_11 + getCharFromAscii(_loc_21 >>> 8 & 255);
            _loc_11 = _loc_11 + getCharFromAscii(_loc_21 >>> 16 & 255);
            _loc_11 = _loc_11 + getCharFromAscii(_loc_21 >>> 24 & 255);
            _loc_11 = _loc_11 + getCharFromAscii(_loc_22 >>> 0 & 255);
            _loc_11 = _loc_11 + getCharFromAscii(_loc_22 >>> 8 & 255);
            _loc_11 = _loc_11 + getCharFromAscii(_loc_22 >>> 16 & 255);
            _loc_11 = _loc_11 + getCharFromAscii(_loc_22 >>> 24 & 255);
            _loc_12 = _loc_12 + _loc_3;
        }
        _loc_11 = _loc_11 + param1.substr(8, 8);
        return _loc_11;
    }// end function

    public static function Str2Hex(param1:String) : String
    {
        var _loc_7:Number = NaN;
        var _loc_8:Number = NaN;
        var _loc_2:String = "0123456789abcdef";
        var _loc_3:* = _loc_2.split("");
        var _loc_4:* = param1.split("");
        var _loc_5:* = new Array(2 * _loc_4.length + 1);
        var _loc_6:* = _loc_4.length;
        var _loc_9:int = 0;
        while (_loc_9 < _loc_6)
        {

            if (_loc_9 < 8)
            {
                _loc_7 = _loc_4[_loc_9].charCodeAt(0) & 15;
                _loc_8 = _loc_4[_loc_9].charCodeAt(0) >>> 4 & 15;
                _loc_5[2 * _loc_9] = _loc_3[_loc_4[_loc_9].charCodeAt(0) & 15];
                _loc_5[2 * _loc_9 + 1] = _loc_3[_loc_4[_loc_9].charCodeAt(0) >>> 4 & 15];
            }
            else
            {
                _loc_5[2 * _loc_9] = _loc_3[Math.floor(Math.random() * 15)];
                _loc_5[2 * _loc_9 + 1] = _loc_3[Math.floor(Math.random() * 15)];
            }
            _loc_9++;
        }
        return _loc_5.join("");
    }// end function

    public static function time2String(param1:Number) : String
    {
        var _loc_8:Number = NaN;
        var _loc_2:* = new Array(8);
        var _loc_3:* = new ByteArray();
        var _loc_4:String = "0123456789abcdef";
        var _loc_5:* = "0123456789abcdef".split("");
        var _loc_6:uint = 0;
        while (_loc_6 < 8)
        {

            _loc_8 = param1 >>> 28 - _loc_6 % 8 * 4 & 15;
            _loc_2[_loc_6] = _loc_5[_loc_8];
            _loc_6 = _loc_6 + 1;
        }
        var _loc_7:* = _loc_2.join("");
        return _loc_2.join("");
    }// end function

    public static function constructKey(param1:Number) : String
    {
        var _loc_2:* = time2String(param1);
        var _loc_3:* = _loc_2.split("");
        if (_loc_3.length < 16)
        {
            _loc_2 = add(_loc_2, 16 - _loc_3.length);
        }
        var _loc_4:String = "";
        var _loc_5:* = Utils.SERVER_KEY;
        if (Utils.SERVER_KEY.length < 16)
        {
            _loc_5 = add(_loc_5, 16 - _loc_5.length);
        }
        _loc_4 = Utils.encrypt(_loc_2, _loc_5);
        _loc_4 = Utils.Str2Hex(_loc_4);
        return _loc_4;
    }// end function

    public static function add(param1:String, param2:Number) : String
    {
        var _loc_3:Number = 0;
        while (_loc_3 < param2)
        {

            param1 = param1 + getCharFromAscii(0);
            _loc_3 = _loc_3 + 1;
        }
        return param1;
    }// end function
hack2012 commented 9 years ago

同求,你目前的这个算法已经不能使用了。