乐视视频真实地址解析

乐视视频真实地址解析

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


乐视视频[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]()
    }
};

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

猜你喜欢

转载自blog.csdn.net/qiaodoutec/article/details/72822381