1. 程式人生 > >Python指令碼下載今日頭條視訊(附加Android版本輔助下載器)

Python指令碼下載今日頭條視訊(附加Android版本輔助下載器)

一、前言

今日頭條有毒,這句話不是虛的,現在資訊類app中也就大黃易和今日頭條可以博取使用者一點喜好了,我所說的喜好不是指內容精彩,而是評論,玩過這兩個app的人都知道,看的不是新聞本生內容,而是他逗逼的評論,也不得不服中國網友很有才。在今日頭條和黃易中我學到了很多段子,成功的成為一個逗逼。

二、手動下載視訊

喜歡今日頭條的同學都知道今日頭條的視訊時有毒的,原因是沒廣告,而且內容是你想要的,網友都這麼說:我在今日頭條中看完了火影,不僅如此,現在加入了更多的自媒體,才華一個比一個牛逼,那短視訊看的你樂乎的不要不要的,有時候想把一些精彩的視訊分享到朋友圈或者微信好友,但是如果單純的分享連結,感覺有點low逼了,所以本文就來介紹如何把今日頭條的原生視訊同步到微信中。

下面不多說了,直奔主題,我們隨便開啟一個今日頭條的視訊網頁,發現並沒有下載的按鈕:

其實這時候我們可以人工的操作的,直接在這個頁面按下F12鍵,檢視這個頁面的元素資訊:


看到用的是video標籤播放視訊的,直接拿到他的src屬性值就是視訊的連結了,在用一個新視窗開啟即可:


然後右擊可以看到有一個選單儲存視訊,將視訊儲存到本地即可。然後如果想把這個視訊弄到微信中,那就更方便了,登入PC端微信,有一個檔案傳輸助手,拖進去即可,手機端微信就可以儲存這個視訊分享給好友就可以了,不過這個視訊大小是有限制的。然後如果想把視訊分享到朋友圈:關於iOS中微信已經有可以分享本地視訊的功能了,而Android這邊沒有這個功能可能需要藉助外掛,這個外掛功能我在之前的文章說過了,不瞭解的同學可以點選這裡進行檢視:

Android中如何實現分享本地視訊到朋友圈中

三、分析視訊連結構造過程

好了到這裡我們發現這麼幾步就可以把視訊弄到微信中了,但是這麼看來是不是有點費勁,而且還需要手動,完全不符合一個程式猿的做事風格,所以咋們得寫程式實現自動化。我們為了方便現在PC端上寫指令碼實現自動化下載這個視訊,原理也很簡單,用Python指令碼進行網頁爬蟲,得到視訊原連結即可,關於爬蟲知識點不多介紹了,網上多的很,而用Python來爬非常方便的,不到100行程式碼即可。爬蟲原理很簡單:使用api獲取整個頁面內容,然後用正則表示式得到你想要的標籤內容或者純文字內容即可。下面就來看一下Python指令碼中獲取頁面內容的程式碼:


看到了,這個是不是很簡單,三行程式碼即可得到頁面內容。我們把這個內容先儲存到本地,然後進行分析:


執行完這個指令碼之後,檢視video.html內容,直接查詢player那個div標籤內容:


可惜的是,並沒有發現player標籤下面有video標籤內容,所以這裡就猜想這段html內容使用js動態生成的,所以我們繼續檢視這個頁面請求的js檔案內容,直接通過瀏覽器中F12鍵弄出來的元素頁面檢視這個頁面的所有:


這裡有好幾個js,通過分析發現是這個tt-video.js最可疑,我們把他的內容拷貝到WebStorm中,然後Ctrl+Alt+L格式化操作一下,這個WebStorm是前端開發的軟體,可以自行裝一個即可:


看到這段程式碼,應該就是造就那個video標籤內容的地方了,主要看getVideos部分,這裡可能需要一些js基礎了,不瞭解的也沒關係,這個語法不難,我們看到有一個核心的地方就是那個crc32函式:


這塊的程式碼大致的意思是:有一個remoteURL+視訊id字串,然後用crc32函式處理,得到一個連結,然後用jsonp訪問這個連結得到一個json資料,然後解析這個json資料,data節點中的video_list節點中的main_url這個key值,在用base64進行解碼得到視訊的原始連結。那麼這裡的remoteURL上面已經有了:


下面可以進入crc32函式看看:


這裡程式碼格式化不是很標準,但是如果有js基礎,還是可以大致看懂的,邏輯大致如下:通過外部傳入的字串內容(remoteURL+視訊id),然後獲取這個url的path字串內容在憑藉一個欄位r,這個欄位值是個隨機數值,然後在用crc32演算法計算(看到那個n(o)這個函式呼叫得到的是i值,而且還需要做移位操作的),然後在將這個i值也就是crc32校驗值用s欄位值拼接即是最後的連結,這裡為了更好的驗證,我們先用charles來進行抓包看看這個結果:


看到請求的連結了,攜帶的r和s引數值,這裡抓包主要看:http://i.snssdk.com/video/urls/v/1/toutiao/mp4/,這個就是上面的remoteURL值,在js中可以查到的。然後在檢視返回值:


果然是個json資料,和我們分析的差不多,這裡為了驗證正確性,我們可以用main_url值,線上base64解碼:


果然沒錯了,解碼之後就是原始視訊連結了。


四、總結視訊連結獲取流程

到這裡我們就分析完了今日頭條的視訊連結構造邏輯,下面來總結一下:

1、將/video/urls/v/1/toutiao/mp4/{videoid}?r={Math.random()},進行crc32加密。

2、將上面得到的加密值拼接到上面的連結中即可,最終的連結形式是:

http://i.snssdk.com/video/urls/v/1/toutiao/mp4/{videoid}?r={Math.random()}&s={crc32值}

3、訪問這個連結得到一個json資料,需要解析video_list陣列中的main_url值,然後用base64解碼得到最終的原始視訊連結。

看到上面的步驟並不複雜,但是在操作過程中還是有些地方需要注意的,主要是上面的那個隨機數和crc32加密邏輯,為了掩飾簡單,這裡依然選擇python指令碼進行實踐,其實用哪種語言沒有任何關係的,原理都是一樣的。從上面的步驟分析結果可以知道,如果我們想要得到最終的視訊url,有一個資訊必須得到就是視訊的id值,這個我們需要回頭看開始得到的那個頁面內容,在那裡應該會有這個視訊id值:


檢視檔案之後發現的確有這個值,所以我們需要用正則表示式把他弄出來即可。

五、python指令碼操作實踐

下面咋們就來開始用python進行操作吧:

第一步:獲取整個頁面的內容


直接使用urllib.urlopen方法即可。

第二步:獲取視訊id


在第一步的基礎上解析頁面內容,用正則表示式獲取視訊id值:


第三步:拼接url計算crc32值


這裡注意獲取隨機值是用的random.random()方法,這個獲取到的是0-1之間的小數,所以需要轉化成字串,然後去除小數點,也就是從字串的下標2開始擷取內容。這個需要看之前分析js中的那個隨機數獲取邏輯:


這個就是js程式碼實現的隨機邏輯。Math.random()是獲取0-1之間的小數,然後轉化成10進位制的字串內容,在進行擷取內容即可。得到隨機數之後開始拼接,同時拼接videoid值。然後在計算crc32值,這裡需要注意的是,用python自帶的binascii.crc32演算法之後還得移位,這個也是分析js程式碼得到的結果:


這個就是js程式碼進行移位的邏輯。這裡python指令碼保持一致即可。

第四步:解析json獲取視訊url

這裡主要是簡單的解析json資料即可:


第五步:解碼視訊url


直接使用base64進行解碼即可

第六步:下載視訊


下載檔案就比較簡單了:


儲存到本地mp4檔案,檔名是個隨機數值。這裡沒有詳細處理了,應該解析上面那個json資料得到視訊的詳細資訊,比如型別,然後在這裡在規定儲存檔案的型別。

下面不多解釋了,直接跑python指令碼看看效果:


看到列印的值了,視訊url獲取成功了,看看本地儲存的視訊檔案:


這樣就成功了,不多解釋了。程式猿幹事就是這麼任性,不做重複工作,以後有了這個指令碼工具再也不用那麼費勁了。而且後續感興趣的同學可以改造一下這個指令碼,實現爬取今日頭條整個視訊tab頁面的所有視訊。這裡不再折騰了,主要還是人家那個重要的視訊url值獲取過程。其他沒難度哈!

注意:在操作的過程中可能會遇到這樣的錯誤:


這個是沒有找到對應的videoid視訊id值,這時候可以選擇再次執行指令碼,或者把需要爬取資料的連結放到瀏覽器中進行瀏覽檢視資料是否正確。

六、移動端下載器

前面介紹瞭如何使用python指令碼爬取視訊,但是我們現在大部分都是用移動端的app看今日頭條視訊,如果這時候要是有一個輔助工具那就最好了,所以我就弄了一個Android版本的輔助下載工具,用法非常簡單,安裝小工具之後,開啟今日頭條視訊頁面,點選分享,選擇轉發連結,選擇[今日頭條下載器]即可:

       

看到了,這樣就非常輕鬆的將今日頭條視訊儲存到本地了。

如果在使用過程中遇到任何問題,請加微信或者微信公眾號留言諮詢,我會及時解決!如果覺得工具好用請多多支援,非常感謝!

Android原始碼可進入小密圈中檢視下載地址!

七、總結

本文就簡單的分析了今日頭條視訊連結的構造過程,主要知識點也是這個,然後藉助python指令碼簡單的實現了這個邏輯,將頁面中的視訊下載到本地了,不用之前那麼手動的進行操作了。加上有了Android版本的輔助小工具,可以在手機端想怎麼儲存就怎麼儲存!如果覺得文章不錯,就記得多多擴散分享,如果有打賞那就更好了!

《Android應用安全防護和逆向分析》

點選立即購買:京東  天貓

更多內容:點選這裡

關注微信公眾號,最新技術乾貨實時推送

編碼美麗技術圈微信掃一掃進入我的"技術圈"世界
掃一掃加小編微信
新增時請註明:“編碼美麗”非常感謝!