本文介紹如何獲取愛奇藝手機(jī)版http://m.iqiyi.com/中視頻的播放源鏈接
前言
想編寫一個(gè) 可以獲取愛奇藝直播源的解析工具,遇到如下問題并抓包記錄下來
問題
尋找解析接口愛奇藝播放鏈接直連源
XXX平臺(tái)接口百度搜索一下vip接口很多硼端,
解析接口:XXX平臺(tái)/?url=http://m.iqiyi.com/v_19rqpl2i8w.html
電腦版:User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
分析抓包
通過瀏覽器抓包分析,F(xiàn)12 纵刘,首先訪問XXX平臺(tái)/player.php?url= GET方式提交后介劫,得到api.php 的7個(gè)參數(shù)如下,url回怜,referer店量,ref芜果,time,md5融师,type右钾,key,然后在通過post 方式提交這五個(gè)參數(shù)即可得到播放源的解析參數(shù),post 提交地址?XXX平臺(tái)/api.php
XXX平臺(tái) /player.php?url= GET方式提交后得到如下內(nèi)容
把上面7個(gè)參數(shù) 組合 post 方式 提交 XXX平臺(tái) /api.php 得到直連解析參數(shù)
Request URL: XXX平臺(tái)/api.phpurl=http%3A%2F%2Fm.iqiyi.com%2Fv_19rqpl2i8w.html&referer=aHR0cDovL2p4Lml0YW9qdS50b3AvP3VybD1odHRwOi8vbS5pcWl5aS5jb20vdl8xOXJxcGwyaTh3Lmh0bWw%3D&ref=0&time=1547937959&md5=2acbc4c7a5a0911db0d40328a5e918d7&type=&key=U6m7yVJvtLgXZpFimrdLL17fTn_j%2FG7aJ_yV_IJvJGQqxbJZ
{
? ? "code": "200",
? ? "url": "\/jp\/dash?tvid=1745487500&vid=785c82b2b8949a49c6be38876fede723&bid=300&abid=300&src=02020031010000000000&uid=&ut=1&ori=h5&ps=0&messageId=dash_9b0f71b7c544b76d7b2d2b0341158ce0&ost=0&preIdAll=&locale=zh_cn&dfp=&k_tag=1&k_ft1=18141941858304&k_err_retries=3&k_uid=6466b50c2a41c9e46a950a6436880dca&pt=0&lid=&cf=&ct=&qd_v=1&qdy=a&qds=0&tm=1547937960000&callback=Z1547937960000",
? ? "type": "iqiyi",
? ? "play": "ajax"
}
把直連解析參數(shù)組合GTE方式提交到 http://cache.video.iqiyi.com/jp/dash 會(huì)得到我們需要的直連視頻地址
http://cache.video.iqiyi.com/jp/dash?tvid=1745487500&vid=785c82b2b8949a49c6be38876fede723&bid=300&abid=300&src=02020031010000000000&uid=&ut=1&ori=h5&ps=0&messageId=dash_9b0f71b7c544b76d7b2d2b0341158ce0&ost=0&preIdAll=&locale=zh_cn&dfp=&k_tag=1&k_ft1=18141941858304&k_err_retries=3&k_uid=6466b50c2a41c9e46a950a6436880dca&pt=0&lid=&cf=&ct=&qd_v=1&qdy=a&qds=0&tm=1547937960000&vf=82973155af32b6ed1efd4dfc5e33833c&callback=Z1547937960000
try {
? ? Z1547937960000({
? ? ? ? "code": "A00000",
? ? ? ? "data": {
? ? ? ? ? ? "dm3u8": "http:\/\/cache.m.iqiyi.com\/dc\/dt\/",
? ? ? ? ? ? "st": 101,
? ? ? ? ? ? "dstl": "http:\/\/meta.video.iqiyi.com",
? ? ? ? ? ? "ctl": {
? ? ? ? ? ? ? ? "uip": "39.177.55.180",
? ? ? ? ? ? ? ? "vf": "82973155af32b6ed1efd4dfc5e33833c",
? ? ? ? ? ? ? ? "cached": true,
? ? ? ? ? ? ? ? "bid": 300,
? ? ? ? ? ? ? ? "uid": "",
? ? ? ? ? ? ? ? "ut": [1],
? ? ? ? ? ? ? ? "qd_vipdyn": 0,
? ? ? ? ? ? ? ? "num": "148"
? ? ? ? ? ? },
? ? ? ? ? ? "aid": 216266201,
? ? ? ? ? ? "dm": "http:\/\/meta.video.iqiyi.com",
? ? ? ? ? ? "drm": "http:\/\/drm.video.iqiyi.com\/drm\/",
? ? ? ? ? ? "parts": {},
? ? ? ? ? ? "bmsg": {
? ? ? ? ? ? ? ? "t": "20190120064402",
? ? ? ? ? ? ? ? "f": "web",
? ? ? ? ? ? ? ? "mid": "",
? ? ? ? ? ? ? ? "sp": "9051021601"
? ? ? ? ? ? },
? ? ? ? ? ? "svp": [],
? ? ? ? ? ? "cid": 2,
? ? ? ? ? ? "content": {
? ? ? ? ? ? ? ? "vipTypes": [0],
? ? ? ? ? ? ? ? "thdt": 1,
? ? ? ? ? ? ? ? "hdcp": 0,
? ? ? ? ? ? ? ? "isRs": 0,
? ? ? ? ? ? ? ? "exclusive": 0,
? ? ? ? ? ? ? ? "bossStatus": 0,
? ? ? ? ? ? ? ? "isProduced": 0
? ? ? ? ? ? },
? ? ? ? ? ? "dd": "http:\/\/data.video.iqiyi.com\/videos",
? ? ? ? ? ? "tvid": 1745487500,
? ? ? ? ? ? "program": {
? ? ? ? ? ? ? ? "audio": [],
? ? ? ? ? ? ? ? "video": [{
? ? ? ? ? ? ? ? ? ? "drmType": 1,
? ? ? ? ? ? ? ? ? ? "isdol": 0,
? ? ? ? ? ? ? ? ? ? "ff": "mp4",
? ? ? ? ? ? ? ? ? ? "mu": "",
? ? ? ? ? ? ? ? ? ? "dr": -1,
? ? ? ? ? ? ? ? ? ? "vid": "b2bae5e7a9f6cd54d831a1d772410827",
? ? ? ? ? ? ? ? ? ? "isPreview": 0,
? ? ? ? ? ? ? ? ? ? "ispre": 1,
? ? ? ? ? ? ? ? ? ? "lgt": 0,
? ? ? ? ? ? ? ? ? ? "code": 2,
? ? ? ? ? ? ? ? ? ? "lid": 1,
? ? ? ? ? ? ? ? ? ? "ists": 0,
? ? ? ? ? ? ? ? ? ? "bid": 200,
? ? ? ? ? ? ? ? ? ? "_selected": false,
? ? ? ? ? ? ? ? ? ? "m3u8Url": "",
? ? ? ? ? ? ? ? ? ? "duration": 2754,
? ? ? ? ? ? ? ? ? ? "vsize": 81759320,
? ? ? ? ? ? ? ? ? ? "name": "國(guó)語",
? ? ? ? ? ? ? ? ? ? "rp": 2
? ? ? ? ? ? ? ? }, {
? ? ? ? ? ? ? ? ? ? "drmType": 1,
? ? ? ? ? ? ? ? ? ? "isdol": 0,
? ? ? ? ? ? ? ? ? ? "ff": "mp4",
? ? ? ? ? ? ? ? ? ? "mu": "",
? ? ? ? ? ? ? ? ? ? "mp4Url": "http:\/\/data.video.iqiyi.com\/videos\/v0\/20190108\/56\/42\/ff3c988aa04e0aeb55d2dd0368be8521.mp4?m=v&qd_uri=dash&qd_sc=89a6fa342f6eca907c8f501274a0bc4c&pv=0.2&qd_tm=1547937960000&qd_p=27b137b4&qdv=1&dfp=&ssl=0&qd_vip=0&qd_src=02020031010000000000&dis_src=vrs&qd_uid=&qd_k=82973155af32b6ed1efd4dfc5e33833c&qd_ip=27b137b4",
? ? ? ? ? ? ? ? ? ? "duration": 2754,
? ? ? ? ? ? ? ? ? ? "dr": -1,
? ? ? ? ? ? ? ? ? ? "vid": "4cf0ec53a7e8c620202a35f6c06bbb85",
? ? ? ? ? ? ? ? ? ? "isPreview": 0,
? ? ? ? ? ? ? ? ? ? "ispre": 1,
? ? ? ? ? ? ? ? ? ? "unencryptedDuration": 0,
? ? ? ? ? ? ? ? ? ? "lgt": 0,
? ? ? ? ? ? ? ? ? ? "code": 2,
? ? ? ? ? ? ? ? ? ? "lid": 1,
? ? ? ? ? ? ? ? ? ? "fs": [],
? ? ? ? ? ? ? ? ? ? "scrsz": "640x360",
? ? ? ? ? ? ? ? ? ? "tag": {
? ? ? ? ? ? ? ? ? ? ? ? "vt": "",
? ? ? ? ? ? ? ? ? ? ? ? "at": ""
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? "p2p": "",
? ? ? ? ? ? ? ? ? ? "ists": 0,
? ? ? ? ? ? ? ? ? ? "bid": 300,
? ? ? ? ? ? ? ? ? ? "_selected": true,
? ? ? ? ? ? ? ? ? ? "ps": 0,
? ? ? ? ? ? ? ? ? ? "rp": 2,
? ? ? ? ? ? ? ? ? ? "vsize": 122022919,
? ? ? ? ? ? ? ? ? ? "name": "國(guó)語",
? ? ? ? ? ? ? ? ? ? "m3u8Url": ""
? ? ? ? ? ? ? ? }],
? ? ? ? ? ? ? ? "stl": []
? ? ? ? ? ? },
? ? ? ? ? ? "p": {
? ? ? ? ? ? ? ? "lgh": [],
? ? ? ? ? ? ? ? "lgp": 0,
? ? ? ? ? ? ? ? "wmarkPos": 0,
? ? ? ? ? ? ? ? "bt": -1,
? ? ? ? ? ? ? ? "raudio": false,
? ? ? ? ? ? ? ? "et": -1,
? ? ? ? ? ? ? ? "pano": {
? ? ? ? ? ? ? ? ? ? "type": 1
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? "ca": 0,
? ? ? ? ? ? ? ? "tsl": [{
? ? ? ? ? ? ? ? ? ? "stm": 969,
? ? ? ? ? ? ? ? ? ? "etm": 0
? ? ? ? ? ? ? ? }, {
? ? ? ? ? ? ? ? ? ? "stm": 1875,
? ? ? ? ? ? ? ? ? ? "etm": 0
? ? ? ? ? ? ? ? }]
? ? ? ? ? ? }
? ? ? ? }
? ? });
} catch (e) {}
;
獲取到的播放直連地址如下
"mp4Url": "http://data.video.iqiyi.com/videos/v0/20190108/56/42/ff3c988aa04e0aeb55d2dd0368be8521.mp4?m=v&qd_uri=dash&qd_sc=89a6fa342f6eca907c8f501274a0bc4c&pv=0.2&qd_tm=1547937960000&qd_p=27b137b4&qdv=1&dfp=&ssl=0&qd_vip=0&qd_src=02020031010000000000&dis_src=vrs&qd_uid=&qd_k=82973155af32b6ed1efd4dfc5e33833c&qd_ip=27b137b4",
vf 算法 本文引用了舀射,某大佬窘茁,納豆app視頻播放鏈解析教程,下面將原文貼在下面提供大家學(xué)習(xí)脆烟。
分析測(cè)試前期抓包山林。請(qǐng)求網(wǎng)站:http://m.toutiao.iqiyi.com/top_126hd0mujy.html
在app端抓包,兩次的不同的請(qǐng)求:
http://cache.m.iqiyi.com/jp/tmts/961149300/961149300/?uid=&cupid=&platForm=h5&qyid=&agenttype=13&type=mp4&rate=1&k_ft1=8&qdv=1&qdx=n&qdy=x&qds=0&__jsT=sgve&t=1521166692860&src=02020031010000000000&vf=0b53f9287e1b0a970ed1343392af05c2&callback=tmtsCallback
http://cache.m.iqiyi.com/jp/tmts/961149300/961149300/?uid=&cupid=&platForm=h5&qyid=&agenttype=13&type=mp4&rate=1&k_ft1=8&qdv=1&qdx=n&qdy=x&qds=0&__jsT=sgve&t=1521105711069&src=02020031010000000000&vf=1461673fa3ce9cc1cdef6308c9691171&callback=tmtsCallback
觀察其中的參數(shù)邢羔,只有t和vf不同驼抹,這個(gè)t很明顯能看出來是一個(gè)時(shí)間戳(13位的),而這個(gè)vf就得繼續(xù)研究了
找尋加密方法
猜想是不是由某個(gè)js文件加密生成的
于是我按下f12拜鹤,刷新了下頁面砂蔽,發(fā)現(xiàn)在這個(gè)播放鏈出來之前加載了如下幾個(gè)js文件
注:最下面的那個(gè)請(qǐng)求是獲取詳細(xì)播放鏈的url
在圖中的js文件中,很輕易便能看到有一個(gè)特別顯眼的js文件:app_detail_video.18f1b586.js
http://static.qiyi.com/assets/js/page/detail/app_detail_video.18f1b586.js
我們進(jìn)入到以上的js文件中署惯,檢索 vf= 這個(gè)關(guān)鍵詞,找到相關(guān)的代碼如下
function(e, t, a) {
? ? var i = window.cmd5xtmts ? window.cmd5xtmts() : {};
? ? $.extend(a || {}, i, {
? ? ? ? src: "02020031010000000000"
? ? });
? ? var n = "/jp/tmts/" + e + "/" + t + "/?" + $.param(a) + "&callback=tmtsCallback";
? ? return a.vf = window.cmd5x ? window.cmd5x(n) : "", a
}(e, t, a));
這里的 a.vf = window.cmd5x ? window.cmd5x(n) : “”, a
意思是:若window這個(gè)對(duì)象有cmd5x這個(gè)方法(屬性)镣隶,就返回window.cmd5x(n)极谊;否則返回””空字符串, 后面的a是第二個(gè)返回值
到這里就出現(xiàn)兩個(gè)問題:
1.cmd5x這個(gè)函數(shù)在哪兒?
2.這個(gè)n是怎么得到的?
找尋cmd5x這個(gè)加密函數(shù)
在所有加載的js文件中都找了一遍安岂,但是還沒有明確地看到cmd5x這個(gè)function轻猖,但是在網(wǎng)上查到的一份有關(guān)愛奇藝的vf算法js文件看到如下一段代碼
o.exports = {
? ? request: function(e, t, i) {
? ? ? ? var o = navigator.userAgent.match(/miuivideo\//i) || n.os.android && parseInt(n.os.version) > 4 && navigator.userAgent.match(/MiuiBrowser/i);
? ? ? ? u.sendVrsRequestPingback(),
? ? ? ? r.jsonp({
? ? ? ? ? ? url: c.h5tmtsUrl + e.tvid + "/" + e.vid + "/",
? ? ? ? ? ? params: function() {
? ? ? ? ? ? ? ? var t = {
? ? ? ? ? ? ? ? ? ? platForm: "h5",
? ? ? ? ? ? ? ? ? ? uid: d.getUid(),
? ? ? ? ? ? ? ? ? ? dfp: s.get(),
? ? ? ? ? ? ? ? ? ? cupid: e.cupid,
? ? ? ? ? ? ? ? ? ? src: p.getSrc(),
? ? ? ? ? ? ? ? ? ? codeflag: 1,
? ? ? ? ? ? ? ? ? ? type: n.os.mac && n.browser.SAFARI || n.browser.iPad || n.browser.iPhone || n.os.android && parseFloat(n.os.version) > 4 || o ? "m3u8": "mp4"
? ? ? ? ? ? ? ? };
? ? ? ? ? ? ? ? f.isBoss() && (t.nolimit = 1);
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? l(t, p.cmd5xtmts())
? ? ? ? ? ? ? ? } catch(e) {}
? ? ? ? ? ? ? ? return t
? ? ? ? ? ? } (),
? ? ? ? ? ? beforeSend: function(e) {
? ? ? ? ? ? ? ? var t = a.parse(e.url).host;
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? p.cmd5x && (e.url += "&vf=" + p.cmd5x(e.url.replace(new RegExp("^https?://" + t, "ig"), "")))
? ? ? ? ? ? ? ? } catch(e) {}
? ? ? ? ? ? ? ? return e
? ? ? ? ? ? },
? ? ? ? ? ? success: function(e) {
? ? ? ? ? ? ? ? u.sendVrsReadyPingback(),
? ? ? ? ? ? ? ? e && e.hasOwnProperty("code") ? "A00000" === e.code ? t(e) : i(e) : i({
? ? ? ? ? ? ? ? ? ? code: "P00001"
? ? ? ? ? ? ? ? })
? ? ? ? ? ? },
? ? ? ? ? ? failure: function() {
? ? ? ? ? ? ? ? i({
? ? ? ? ? ? ? ? ? ? code: "P00001"
? ? ? ? ? ? ? ? })
? ? ? ? ? ? }
? ? ? ? })
? ? }
}
能看出來以上是部分關(guān)于發(fā)送驗(yàn)證請(qǐng)求的代碼,主要看beforeSend這一部分域那,大概能夠知道
url: c.h5tmtsUrl + e.tvid + "/" + e.vid + "/",
var t = a.parse(e.url).host;
e.url += "&vf=" + p.cmd5x(e.url.replace(new RegExp("^https?://" + t, "ig"), ""))
以上咙边,我們還找到h5tmtsUrl這個(gè)未知的變量,又找到如下的代碼
注:e.url.replace(new RegExp(“^https?://“ + t, “ig”), “”)
這是將”https://“+e.url的域名 , “ig”表示不區(qū)分大小寫次员,統(tǒng)統(tǒng)替換成成空字符串败许,結(jié)合下面提到的來說,也就是將”https://cache.m.iqiyi.com/jp/tmts/" 這一段字符替換成空字符串
function(e, t, i) {
? ? var o;
? ? void 0 !== (o = function(e, t, i) {
? ? ? ? var o = window.location.protocol;
? ? ? ? i.exports = {
? ? ? ? ? ? vipauthUrl: "https://api.vip.iqiyi.com/services/cknsp.action",
? ? ? ? ? ? h5tmtsUrl: o + "http://cache.m.iqiyi.com/jp/tmts/",
? ? ? ? ? ? vmsUrl: o + "http://cache.video.iqiyi.com/jp/vms",
? ? ? ? ? ? vmsIPUrl1: "http://115.182.125.142/jp/vms",
? ? ? ? ? ? vmsIPUrl2: "http://124.250.53.164/jp/vms",
? ? ? ? ? ? pingbackUrl: "http://msg.71.am/core",
? ? ? ? ? ? isfanUrl: o + "http://sns-api.iqiyi.com/apis/friend/follow.action"
? ? ? ? }
? ? }.call(t, i, t, e)) && (e.exports = o)
}
可以知道
var o = window.location.protocol;
h5tmtsUrl: o + "http://cache.m.iqiyi.com/jp/tmts/"
h5tmtsUrl其實(shí)就是一個(gè)通信協(xié)議+指定字符串:”https” + “//cache.m.iqiyi.com/jp/tmts/“
所以淑蔚,到這里我們需要解決的是什么呢市殷?cmd5x這個(gè)函數(shù)我們依然不知道,且我們只能大概知道作為其參數(shù)的e.url是一個(gè)被替換掉了”https://cache.m.iqiyi.com/jp/tmts/" 的正常url字符串刹衫,其可能的參數(shù)有如下
url = c.h5tmtsUrl + e.tvid + "/" + e.vid + "/"
#以下這些拼接成字符串
{
? ? platForm: "h5",
? ? uid: d.getUid(),
? ? dfp: s.get(),
? ? cupid: e.cupid,
? ? src: p.getSrc(),
? ? codeflag: 1,
? ? type: n.os.mac && n.browser.SAFARI || n.browser.iPad || n.browser.iPhone || n.os.android && parseFloat(n.os.version) > 4 || o ? "m3u8": "mp4"
};
由于其js文件實(shí)在太混亂醋寝,所有參數(shù)都不知道怎么來的,沒法推算出我們應(yīng)該給這個(gè)cmd5x傳一個(gè)什么樣的值带迟,更重要的是js中的cmd5x在哪兒音羞,我該怎么用py去調(diào)用都不知道。最后還是在萬能的google上扎到了答案仓犬,感謝貢獻(xiàn)代碼的大佬嗅绰,一路帶我前行
來自大佬的微笑
參考了幾篇博客,自己也嘗試著構(gòu)造請(qǐng)求,也成功了办陷,大概有以下這些參數(shù)是必要的
head = "/jp/tmts/tvid/vid/?"
param = {
? ? ? ? "uid":"",
? ? ? ? "cupid":"",
? ? ? ? "platForm":"h5",
? ? ? ? "qyid":"",
? ? ? ? "agenttype":"13",
? ? ? ? "type":"mp4",
? ? ? ? "nolimit":"",
? ? ? ? "k_ft1":"8",
? ? ? ? "rate":"2",
? ? ? ? "sgti":"",
? ? ? ? "qdv":"1",
? ? ? ? "qdx":"n",
? ? ? ? "qdy":"x",
? ? ? ? "qds":"0",
? ? ? ? "__jsT":"sgve",
? ? ? ? "t":t,
? ? ? ? "src":"02020031010000000000",
? ? ? ? "callback":"tmtsCallback"
? ? }
將param構(gòu)造成一個(gè)字符串貌夕,再在頭部拼接上head即是一個(gè)正常的cmd5x需要的參數(shù),一個(gè)正常的出參數(shù)值為:
/jp/tmts/12476488409/12476488409/?src=02020031010000000000&callback=tmtsCallback&uid=&sgti=13_12e9e055c713deba092399c62d8cb2b2_1489561211612&agenttype=13&cupid=&t=1521388096000&qdv=1&platForm=h5&rate=2&__jsT=sgve&k_ft1=8&qds=0&nolimit=&qdy=x&type=mp4&qdx=n&qyid=&&vf=39f7f4c1b39089dbfe887ad15f1ffb7a
加上對(duì)應(yīng)的頭部文件:
“http://cache.m.iqiyi.com"
最后即是我們請(qǐng)求視頻鏈接的地址
http://cache.m.iqiyi.com/jp/tmts/12476488409/12476488409/?src=02020031010000000000&callback=tmtsCallback&uid=&sgti=13_12e9e055c713deba092399c62d8cb2b2_1489561211612&agenttype=13&cupid=&t=1521388096000&qdv=1&platForm=h5&rate=2&__jsT=sgve&k_ft1=8&qds=0&nolimit=&qdy=x&type=mp4&qdx=n&qyid=&&vf=39f7f4c1b39089dbfe887ad15f1ffb7a
其返回的數(shù)據(jù)格式化后如下:
{
"timestamp":"20180318234822",
"ctl":{
"area":1
},
"code":"A00000",
"data":{
"vipTypes":[
],
"screenSize":"854x480",
"vidl":[
{
"vd":1,
"screenSize":"854x480",
"vid":"e7eb1b37eeb029f6529bde6dc66a4815"
}
],
"aid":"",
"pano":{
"rType":0,
"type":1
},
"adDuration":0,
"messageId":"",
"head":0,
"previewType":"",
"ugc":1,
"clientIp":"114.248.64.91",
"prv":"",
"vd":1,
"vid":"12476488409",
"rTime":"",
"ds":"A00012",
"lgh":[
],
"duration":272,
"wmarkPos":0,
"bossStatus":0,
"cacheTime":1521388047491,
"tail":0,
"isProduced":0,
"cid":5,
"tipType":"",
"m3u":"http://222.134.2.36/videos/v1/20180210/59/d2/82ae8f5cf70d7093c1b4dbcfbe667e6b.mp4?key=09bf99dfe8d1239f4fd1deb1192c91f75&dis_k=244569a7f99feb6f8fde7414223cfb756&dis_t=1521388102&dis_dz=CNC-BeiJing&dis_st=40&src=iqiyi.com&uuid=a6e5338-5aae8a46-e&m=v&qd_k=39f7f4c1b39089dbfe887ad15f1ffb7a&sgti=13_12e9e055c713deba092399c62d8cb2b2_1489561211612&qd_ip=72f8405b&qd_p=72f8405b&dfp=&qd_src=02020031010000000000&ssl=&ip=114.248.64.91&qd_vip=0&dis_src=vrs&qd_uid=0&qdv=1&qd_tm=1521388102146",
"ad":1,
"exclusive":0,
"tvid":12476488409,
"previewTime":"",
"m3utx":"http://222.134.2.36/videos/v1/20180210/59/d2/82ae8f5cf70d7093c1b4dbcfbe667e6b.mp4?key=09bf99dfe8d1239f4fd1deb1192c91f75&dis_k=244569a7f99feb6f8fde7414223cfb756&dis_t=1521388102&dis_dz=CNC-BeiJing&dis_st=40&src=iqiyi.com&uuid=a6e5338-5aae8a46-e&m=v&qd_k=39f7f4c1b39089dbfe887ad15f1ffb7a&sgti=13_12e9e055c713deba092399c62d8cb2b2_1489561211612&qd_ip=72f8405b&qd_p=72f8405b&dfp=&qd_src=02020031010000000000&ssl=&ip=114.248.64.91&qd_vip=0&dis_src=vrs&qd_uid=0&qdv=1&qd_tm=1521388102146"
}
}
其中的m3u就是視頻真正的播放地址了
cmd5x也有破解好的對(duì)應(yīng)幾個(gè)版本民镜,其實(shí)也叫做vf的算法啡专,針對(duì)不同類型
import hashlib
#app端的vf算法
def cmd5x(str):
? ? vf = hashlib.new('md5', str + '3sj8xof48xof4tk9f4tk9ypgk9ypg5ul').hexdigest()
? ? return vf
#pc端的vf算法,針對(duì)愛奇藝的網(wǎng)頁播放
def getPcVf(str):
? ? vf = hashlib.new('md5', str + 'u6fnp3eok0dpftcq9qbr4n9svk8tqh7u').hexdigest()
? ? return vf
#針對(duì)vip用戶的vf算法
def getPcIbt(str):
? ? vf = hashlib.new('md5', str + 't6hrq6k0n6n6k6qdh6tje6wpb62v7654').hexdigest()
? ? return vf
這里我們使用第一個(gè)即可
代碼
代碼放在github了制圈,有需要的可以看看
2018/07/12更新
看了下日志们童,愛奇藝大概是從6月27號(hào)更新了策略。不知道是不是被抓的多了….
以上app端的加鹽md5算法失效了鲸鹦,花了點(diǎn)時(shí)間找到了cmd5x更新后的方法慧库,說下思路:其關(guān)鍵函數(shù)藏在一個(gè)js文件中,參數(shù)也更新了馋嗜,并且還需要注意某一個(gè)參數(shù)的先后順序.
注:我沒有使用新的cmd5x方法去加密原始的參數(shù)齐板,所以不知道原始的參數(shù)是不是能使用。最好還是都替換成新的吧葛菇,因?yàn)閍pp_detail_video.xxxx.js文件也換了新的
由于怕被封甘磨,暫時(shí)先不把方法寫到這里,還是那句話眯停,接口且用且珍惜.
發(fā)現(xiàn)更多好玩的樂趣济舆,百度一下 【 軟件隊(duì)長(zhǎng) 】