您的位置:首页 > Web前端 > JavaScript

乐视视频真实地址解析

2017-05-31 17:50 190 查看

乐视视频真实地址解析

本文主要为了跳过广告,直接拿到真实视频地址

声明:不得将本文用于非法用途

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


如果本文帮助了你,请随意打赏,我们会继续努力的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息