記錄一下西瓜視頻MP4地址的獲取步驟
目標:
指定西瓜視頻地址,如 https://www.ixigua.com/a6562763969642103303/#mid=6602323830,獲取其視頻MP4文件的下載地址
以下使用chrome瀏覽器
開始分析:
首先在瀏覽器中打開視頻頁面,打開審查元素(右鍵-> 審查元素 或 F12)並刷新頁面,查看network選項中抓到的包
技巧1:
由於我們獲取的是視頻文件的下載地址,而視頻文件一般比較大,所以可以在network的包列表中使用 Size 排序一下 查看最大的幾個包
如圖:
這里我們很容易就能確定視頻文件的地址
http://v11-tt.ixigua.com/5cc4c0ae0f7d6f87014dc0f0058157e0/5bcc7300/video/m/220f87599d445a14a53803fd01d86816e971157c7a70000cab5121742cc/
(你得到的地址和我得到的可能不一樣,不過url路徑中的最后一串字符串應該是一樣的)
下面我們就要尋找這個地址是從哪里獲取的,一般做法就是截取url中比較有代表的部分(這個看經驗,你應該懂的)來搜索,搜索可以使用chrome審查元素的Search功能
這個搜索會查找network欄中所有包的響應內容,如果搜到的話,我們就可以確定視頻文件地址的來源。
為什么這么做呢?
按照正常的想法,首先這個視頻文件的獲取請求是瀏覽器發起的,那么瀏覽器肯定在發起前就得到了視頻文件的地址,那么地址存在什么地方呢?一般來說,不外乎直接寫
在網頁源代碼中或者使用一個ajax請求之類的獲取一下視頻地址,所以這個地址肯定存在於我們目前所能看到的network列表中的包之中。
BUT,在這個例子中,搜索結果為空。嘗試各種截取方法 比如 220f87599d445a14a53803fd01d86816e971157c7a70000cab5121742cc、5cc4c0ae0f7d6f87014dc0f0058157e0、v11-tt.ixigua.com
都搜索不到。
好吧,既然搜不到,那我們就用暴力一點的辦法,好在這個網頁的network包列表並不多,我們就一個一個找就好了,找的過程一般可以忽略css、圖片、多媒體等文件,
優先查看json格式的文件
下面人工查看中。。。
查看一遍之后呢,我發現了一個可疑的鏈接
https://ib.365yg.com/video/urls/v/1/toutiao/mp4/v02004bd0000bc9po7aj2boojm5cta5g?r=048136401358795045&s=3128215333&aid=1190&callback=axiosJsonpCallback1&_=1540123000124
首先,url就很可疑,里面包含各種敏感關鍵詞,如 mp4、urls等
其次,內容可疑:
video_list都出來了,不是它還能是誰呢?但是,定睛一看,這個內容里面的url格式不大對,一看就像是加密過后的,怪不得搜不到呢
下面就是想辦法找到解密方法,來驗證一下,這里看到的是不是我們想要的視頻地址了
先捋一下思路,我們找到的這些數據是瀏覽器請求回來的,既然請求這些數據,肯定會有用到的地方,下面我們就來找一下這些數據在哪里被使用了,怎么找呢,還是搜索,拿這些數據中的變量名來搜
這些數據中可疑變量有兩個:backup_url_1、main_url,第一個一看就是備用的,所以我們拿第二個搜吧
搜索結果如圖:
下面在這些包中定位main_url所在的代碼,很幸運,第一個就是我們想要的(tt-video.js)
如圖:
從代碼中我們可以看到,main_url使用了base64decode來進行解密,下面使用代碼驗證(這個請自行驗證)一下,果然得到了我們想要的視頻地址
此時,我們已經有了從這個包中獲取視頻地址的方法了,那么下個問題是,這個包的地址是如何生成的?
首先分析一下這個包的url的組成:
https://ib.365yg.com/video/urls/v/1/toutiao/mp4/v02004bd0000bc9po7aj2boojm5cta5g?r=048136401358795045&s=3128215333&aid=1190&callback=axiosJsonpCallback1&_=1540123000124
首先去掉無關緊要的參數,方法很簡單,直接在瀏覽器中打開這個url,然后嘗試刪減參數,不斷測試就可以了,刪減后的url如下
https://ib.365yg.com/video/urls/v/1/toutiao/mp4/v02004bd0000bc9po7aj2boojm5cta5g?r=048136401358795045&s=3128215333
然后發現,其中有三個東西不知道哪里來的,下面繼續使用我們的搜索工具來尋找,一個一個來。
(注意:跟隨文章一步一步走的時候可能看到的參數和我這里寫的參數不一樣,請按照實際的來搜索)
先是 v02004bd0000bc9po7aj2boojm5cta5g,搜索結果如下:
原來這個參數是視頻的videoId,直接在網頁源碼中,好,第一個搞定
下面看第二個參數 048136401358795045 搜不到
下面看第三個參數 3128215333 搜不到
后面兩個參數都搜不到,可能是實時生成的或者加密了,所以換個思路,用 url的前半部分的關鍵詞去搜 https://ib.365yg.com/video/urls/v/1/toutiao/mp4, 看那里用到了這個
關於關鍵詞 當然是越長越准確,所以我選取的搜索詞是 video/urls/v/1/toutiao/mp4 搜索結果如下:
這里只能一個一個點開看源碼了。。。
看源碼的時候注意點有以下幾個:
1、查看上下文,看所在函數作用 所在文件作用
2、思考我們搜索的東西是什么,比如本例中搜索的是一個視頻資源的url,那么肯定要特別關注和視頻相關的關鍵詞,函數名之類的東西
哈哈,幸運的是,在第一個文件(tt-video.js)中我就找到了很可疑的代碼
這里面全是video相關的,更可疑的是這個 getVideosJson函數名,然后我發現有個crc32函數用到了目標url,那下面就看一下crc32函數在哪里定義的
(PS:標准crc32是一個公開算法,用於生成一段數據的校驗碼,不過一般這些反爬蟲的前端工程師們都會自己實現一下,所以還是以JS代碼為准)
通過搜索crc32關鍵詞,可以定位到如下代碼:
重點看圖中的標紅區域,苦尋不見的 r 和 s 參數在這里出現了,這說明我們的思路應該是正確的,然后發現r的值是隨機生成的,這個好辦,我們待會也隨機生成一個就行,最好完全按照JS代碼來模擬。
但是 s 的值好像略微復雜一下,嗯,下面就是考驗你腦力的時刻了。
s的值是由函數o生成的,但是o的代碼很復雜,這個怎么辦呢?
第一種辦法:
硬上唄,把JS代碼的算法完全模擬了,使用別的語言嘗試計算,或者使用js引擎比如pyv8, nodejs等來執行都可以
第二種辦法:
怎么說呢,換位思考一下,如果你是寫這段代碼的前端工程師,你會怎么做,難道你會去從零開始實現一個校驗算法???(當然不可否認,確實有某些情況下,算法是自創的)既然這個函數是
crc32這樣的公開算法,每種語言基本都有實現的標准庫,所以直接調用標准庫測試一下就可以了,如果加密結果一致,皆大歡喜,不一致,請參考第一種方法。
ok,到目前為止,分析已經完成了,下面就是寫代碼的時刻了。代碼如下:
代碼在哪里?
你難道還真想要代碼?自己動手,豐衣足食!!