乐视视频真实地址解析

来源:互联网 发布:房子平面设计软件 编辑:程序博客网 时间:2024/06/05 12:01

乐视视频真实地址解析

本文主要为了跳过广告,直接拿到真实视频地址
声明:不得将本文用于非法用途


乐视视频[http://www.le.com/ptv/vplay/29770479.html]
其中vid是29770479
我们要将它转换成M站的url[http://m.le.com/vplay_29770479.html]
为什么?因为好破解。
把m站的url通过浏览器访问,并抓包,得到这个重要的接口
[http://player-pc.le.com/mms/out/video/playJson.json?platid=3&splatid=301&tss=no&id=29770479&detect=0&dvtype=1000&accessyx=1&domain=m.le.com&tkey=-1050776182&devid=0F47D3C0F41ADFF5BB490C0876D7F69A9FE9EDD7&source=1001&lang=cn&region=cn&isHttps=0&callback=vjs_149622460663864]
当然你访问我这个链接肯定是没有结果的,因为有时间戳限制。
我们看下这个接口的组成部分,id就是视频的vid,其他参数可以固定,重要的是tkey,
这个参数是通过算法算出来的,具体的算法在这个js中http://jstatic.letvcdn.com/sdk/player.js
代码截图这里写图片描述
下面我们来具体了解这个算法的过程。
可以看到tkey:i,然后i = n.getMmsKey(e);
其中e是时间戳,格式是这样的1496225866.311
下面是getMmsKey精简过的代码,可以看出getMmsKey用到rotateRight以及S2v,
有兴趣及耐心的可以把算法翻译成想要的语言,更好的办法是通过V8引擎,用自己用的语言
如python,c++,go等直接执行js脚本。作者用的是python,所以选择pyv8,具体方法见博文
http://blog.csdn.net/qiaodoutec/article/details/72821250

function getMmsKey(e)            {                var _1 = "d", _2 = "rotateRight", _3 = "O";                var t = 185025305                 r = 8                n = e                n = rotateRight(n, r);                var o = S2v[_3](n, t);                return o            }            function rotateRight(e, t)            {                var _1 = "g", _2 = "o";                for (var r, n = 0; S2v[_1](t, n); n++)                    r = S2v[_2](1, e), e >>= 1, r <<= 31, e += r;                return e            }            var S2v = {                D: function(Y, r) {                    return Y | r                },                d: function(Y, r) {                    return Y % r                },                O: function(Y, r) {                    return Y ^ r                },                k: function(Y, r) {                    return Y < r                },                J: function(Y, r) {                    return Y >> r                },                R: function(Y, r) {                    return Y === r                },                g: function(Y, r) {                    return Y > r                },                o: function(Y, r) {                    return Y & r                },                l: function(Y, r) {                    return Y !== r                },                L: function(Y, r) {                    return Y != r                },                a: function(Y, r) {                    return Y - r                },                u: function(Y, r) {                    return Y == r                },                e: function(Y, r) {                    return Y << r                }            };

好这样我们就计算出tkey了,然后再拼成刚才的api,它的返回结果如图
这里写图片描述
我们要将domain和具体的清晰度的url拼接
http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzI5LzYwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTAzODM3Mjg0LWF2Yy00MTY2MjAtYWFjLTQ4MDAwLTg5OTYwLTUzNjQzMDctNGFjMTU3MWEzZTg3YjAxODI4NDMyZDAzMDdiOTg5NWUtMTQ5NjE4ODg5NTYyMy5tcDQ=?b=476&mmsid=65147212&tm=1496223574&key=2c699fc99fb56511359de715f212731b&platid=3&splatid=304&playid=0&tss=no&vtype=13&cvid=736248594819&payff=0&pip=3e33dfad4b00c2c7f7ca5ea55cc012f9
你以为这样就能拿到播放地址了吗太年轻了,他会给你返回一段广告。还要再url后面加上以下参数&p2=04&p1=0&uuid=&vid=29770479&format=1&hwtype=un&termid=2&expect=3&jsonp=&ostype=android
其中vid是视频的vid,这样最终我们拿到了视频的cdn地址,返回json串如下图
这里写图片描述
这个location才是视频的真实地址。
好了乐视视频真实地址获取完毕。

—————更新————
有人问原网页内容是什么,现贴出来

var x2O = (function() {    var j3 = (0x33,    86.8E2) < 0x19 ? 47 : 56.5E1 < 19 ? (0x5b,    0x56) : (0x17,    0x2a) < (0x61,    50.3E0) ? (81,    0x1e04890bccee) : (81,    0x1d)      , k2 = (function(a4, D4) {        var b2 = ""          , A5 = 93.57E+0 > (0x45,        51.23E3) ? (79.096E1,        67.729E+0) : 42.9E3 <= (35.8E2,        76.) ? (22.7E1,        40.4E+2) : (0x1,        0x18) <= (72.1E2,        84.64E3) ? false : (15,        0x4f);        if (a4.length > (67.95E2,        99) < (22.,        21.) ? (68,        44.433E2) : (0x9,        0x3a) <= (71.11E+0,        26.) ? 0x53 : (0x47,        21.) <= 91. ? (35,        0xc) : (0xd,        69.68E1))            for (var I2 = (36.86E+1,            62.) > (19.5E2,            52.5E2) ? (43,            31.) : 0x27 < 29.82E0 ? (0x5d,            47.672E0) : 0x50 < 86.3E3 ? (88.91E3,            0xd) : (0x29,            88.33E3) > (56.,            0x51) ? (57.5E+1,            12.88E+3) : 32E2 > (29.6E1,            0x29) ? (41.428E+3,            0x26) : 0x53 <= 0x1d ? (29,            19.) : 72.23E1 >= 0x37 ? (0x10,            0x1b) : (42.,            90.); I2 > 1; )                b2 += (A5 = A5 ? (0x5b,                64.) >= (80.,                11.415E1) ? 7.747E2 : (0x32,                85) >= (52.641E1,                11.033E2) ? (78.07E+2,                0x31) : 40. <= (0x19,                0x15) ? 95. : (86.196E2,                80.43E0) >= (74.45E0,                23) ? (73.8E0,                false) : (0x44,                0xc) >= (60.39E2,                0x11) ? 0x3 : (0x4,                69.99E2) <= (43.,                45.2E1) ? (70.396E0,                0x3c) : (0x7,                20) > (18.577E1,                0x4e) ? (58,                56E1) : (0x7,                3) >= 66.3E+0 ? (36.1E0,                57.19E3) : (0x10,                0x1a) : (0x4f,                9E+2) <= (87.,                0x5d) ? (8,                0x3f) : 0x22 >= (0x47,                10.29E1) ? (0x9,                0x4b) : 6.243E1 > 0x53 ? (94,                0x4d) : (0x4b,                97.9E2) < 0x6 ? (48.8E1,                51.61E3) : (27.,                42.529E+1) < 0x4e ? (0x58,                60.189E+2) : true) ? a4.charAt(I2) : "@%)eitg)(tDwn".charAt(I2--);        return D4 === null  ? eval(b2) : D4 ^ a4    })("_9(mTe.)ea e(", (72.2E2,    32.26E2) >= 21.9E0 ? null  : (42.8E3,    75) < 0x1c ? 62 : (0x4f,    0x4) < 67. ? (55.056E0,    13.14E2) : (85E2,    10.5E2) < (73.81E3,    40.269E0) ? (89.274E+2,    36.3E0) : (0x51,    0x22) < (0x18,    5.28E0) ? (0x2b,    0x25) : 0x58);    return {        h8: function(p5) {            var T5, t7 = (0x15,            31.364E3) <= 33 ? (94,            97) : (98.8E2,            0x1f) < 0x4e ? (19,            0x0) : (0x14,            0x9) <= 64.3E2 ? 65.4E2 : (0x31,            0x49) >= (0x39,            88) ? 28.443E2 : 94. < 29 ? (0x34,            0x52) : (46E2,            0x1a), n6 = j3 > k2, T9;            for (; t7 < p5.length; ) {                T9 = (parseInt(p5.charAt(t7), 17.7E2 < 24. ? (0x62,                0x6) : (93.31E3,                54.4E2) >= (40.51E0,                0x3d) ? (81,                0x10) : (0x38,                73.41E+0) >= (27.91E1,                81.) ? (81,                76E2) : 0x48 <= (0x3b,                88) ? (76,                90) : (0x31,                0x1d) > (92.77E+3,                75.) ? 78. : (83.41E1,                0x2c) >= 61.7E2 ? 94 : (21.112E2,                0x5) < (0x25,                72.9E3) ? 0x17 : (27.23E1,                68.948E1))).toString((89,                0x62) < (0x27,                0x45) ? (26.214E1,                23.5E3) : (2.26E1,                64) >= 70.9E1 ? (76.189E1,                0x43) : (0x25,                96) < (37.321E1,                1.2E1) ? (0x1d,                0x33) : (0x3f,                0x7) > (0x13,                0x3) ? 0x2 : (0x13,                92E3) >= (0x4f,                48.) ? 82. : (48.435E+2,                0x3f) <= (79.049E1,                91.) ? (81.6E3,                0x4e) : 0x4c >= 46.853E+3 ? 44.24E3 : 75);                T5 = t7++ == (0x28,                80.254E1) <= (61.,                0x12) ? (18.,                36.29E3) : (31.88E1,                0x2a) > (60.,                0x5f) ? 0x1d : (18.871E3,                38.3E+2) > 0x59 ? (0x5f,                0x0) : 48.7E+2 < (64.43E1,                98) ? 70.1E2 : 0x46 > 86.5E0 ? (0x4a,                79) : (0x55,                82.3E1) >= (66.,                0x34) ? (39.9E1,                0x3b) : 42.12E3 < (0x14,                56.) ? 43 : 36. ? T9.charAt(T9.length - (78.1E2,                0x5d) >= (77.,                36.099E+3) ? (59.01E2,                76.54E1) : 4.55E1 < (81,                10.14E1) ? 0x1 : (0x4f,                0x42) > (0x47,                39.) ? (27.,                0x40) : (0x13,                95.) >= 0x1 ? (0x4e,                0x24) : (12.188E2,                0x1d)) : T5 ^ T9.charAt(T9.length - (0x26,                86.28E+1) < (88.93E1,                21.9E0) ? (76.421E1,                73) : (80.,                0x29) <= 0x2c ? (70.35E2,                0x1) : (0x18,                0x1) > (48.97E3,                61.39E2) ? 85.07E1 : 0x23)            }            return T5 ? !n6 : n6        }    }})();var _1 = "feda8dd6e0127da88f3487a646fe8a6b"  , _2 = "jjuy9567dfj6bkksomnnghwokjlu0o"  , _3 = "tYt2bxik";var x2q = {    D: function(Y, r) {        return Y | r    },    d: function(Y, r) {        return Y % r    },    O: function(Y, r) {        return Y ^ r    },    k: function(Y, r) {        return Y < r    },    J: function(Y, r) {        return Y >> r    },    R: function(Y, r) {        return Y === r    },    g: function(Y, r) {        return Y > r    },    o: function(Y, r) {        return Y & r    },    l: function(Y, r) {        return Y !== r    },    L: function(Y, r) {        return Y != r    },    a: function(Y, r) {        return Y - r    },    u: function(Y, r) {        return Y == r    },    e: function(Y, r) {        return Y << r    }};var Key = {    liveKey: _1,    APIKey: _2,    secret_key: _3,    getAPIKey: function(e) {        var _1 = "AES"          , _2 = "decrypt"          , _3 = "APIKey"          , _4 = x2O.h8("01") ? "toString" : "AES"          , _5 = "enc"          , _6 = "Utf8"          , _7 = "error";        try {            return Encode[_1][_2](e, this[_3])[_4](Encode[_5][_6])        } catch (t) {            return _7        }    },    getCl: function(e) {        var _1 = "MD5"          , _2 = x2O.h8("303w") ? "showmethemoney" : "join"          , _3 = x2O.h8("9127") ? "error" : "liveKey";        try {            return Encode[_1](e + _2)        } catch (t) {            return _3        }    },    getMmsKey: function(e) {        var _1 = x2O.h8("49") ? "d" : "MD5"          , _2 = "rotateRight"          , _3 = "O";        var t = 47.3E2 <= (67.01E3,        78.4E1) ? ("d",        37.2E2) : 4.1E2 <= (0x2b,        95) ? 0x63 : (13.956E2,        42.453E2) <= 0x2 ? (93.79E2,        "error") : (0x28,        97.) < ("error",        8.) ? (",",        "g") : (96.31E3,        92.926E0) >= (0x35,        0x5d) ? 0x62 : 10. >= (64.5E1,        55.) ? 79.671E1 : 62.2E2 <= 0x2a ? (20.908E1,        93.) : (0x1b,        2.49E1) < 0x5e ? (52,        0xb074319) : (11,        75.1E1) < (60.,        55.42E1) ? (0x11,        50.66E1) : (85.224E+2,        0x5d)          , r = x2q[_1](t, 17)          , n = e;        n = this[_2](n, r);        var o = x2q[_3](n, t);        return o    },    rotateRight: function(e, t) {        var _1 = x2O.h8("91") ? "g" : "tYt2bxik"          , _2 = "o";        for (var r, n = 0; x2q[_1](t, n); n++)            r = x2q[_2](1, e),            e >>= 1,            r <<= 31,            e += r;        return e    },    getLiveTkey: function(e, t) {        var _1 = "MD5"          , _2 = "liveKey"          , _3 = "join"          , _4 = ","          , _5 = "toString";        return Encode[_1]([e, t, this[_2]][_3](_4))[_5]()    },    getPingBackKey: function(e, t, r, n) {        var _1 = x2O.h8("mo48") ? "MD5" : "rotateRight"          , _2 = x2O.h8("8889") ? "secret_key" : "MD5"          , _3 = "toString";        return Encode[_1](e + t + r + n + this[_2])[_3]()    }};

如果本文帮助了你,请随意打赏,我们会继续努力的
这里写图片描述