Python的视频分析
????????很久都沒在這個公眾號進行更新了,分享一個最近折騰的東西吧。
? ? ? ? 此處聲明,該文章僅做技術交流。
????????最近通過某個培訓機構報名了一個課程,該課程的教學視頻是通過xxx平臺進行播放的。因為覺得這套課程講的很不錯,就想著把它搞下來,方便后期多次回看(視頻有播放時效性)。一開始是設想著和小伙伴一人錄播一個視頻,分工合作,不過大家都懶,這個計劃直接夭折了。后來又去淘寶問了下,發現有專門的商家是幫忙代下載的,聲稱登錄賬號后即可幫忙下載,本著勤(kou)儉(kou)持(sou)家(sou)的精神,就想自己動手爬下來。
????????言歸正傳,接下來大致分享我爬取的整個分析過程。
????????首先,這個課程是通過微信小程序登錄xxx,在登錄xxx后,點擊我購買的課程中會看到所有的課程,打開其中一個課程,選中第一個課程內容進行播放。此時我們在fiddler中會發現時不時就有一個視頻請求,如下圖所示。
????????通過分析第一個視頻請求的數據,我們可以較為清楚的看出每一次視頻請求,返回的都是一個ts視頻片段。如下圖所示,請求鏈接中存在.ts的字樣。
????????同時,我們可以在請求參數中看到start和end信息,幾乎就能肯定這是一個視頻片段,start和end代表這個片段在整個完整視頻中的開始時間和結束時間。因此,我們可以大致猜測,這是基于m3u8索引文件,進行的分段式的播放。
????????基于這樣的猜測,我們在該請求前僅找到了這樣的一條請求信息。該請求是一個get請求,參數為m3u8,返回了一串字符串。
?
????????初步猜測,返回中的字符串就是我們尋找的m3u8索引信息,但是這樣亂糟糟的一串字符,根本看不出什么有用的信息。對其進行一系列常見的解碼操作,都沒有得到有用的信息,其中進行base64解碼時,還提示有非法字符。sad,此時我們的線索在此中斷。
????????由于m3u8文件是有固定的格式,所以我們嘗試從網上找了一份明文的m3u8文件,通過這份文件進行各種加密嘗試,我們發現其中base64的加密和我們的請求結果中獲取到的字符串有極高的相似度。
網上找的m3u8文件進行base64加密
爬取到的m3u8加密數據
????????通過簡單比對即可斷定,該網站對m3u8數據進行了base64的加密,但如果直接對爬取到的數據進行base64解碼會提示編碼錯誤。細心排查一下,我們就會發現,該加密字符串進行了一些特殊字符的替換,替換如下:
| ? 特殊字符 | 被替換的字符 |
| @ | 1 |
| # | 2 |
| ¥ | 3 |
| % | 4 |
????????將替換后的字符串再進行base64解密,即得到了我們明文m3u8文件。
????????得到m3u8文件后,我們就需要弄清楚,在這個請求中帶的那一串字符是怎么來的,又代表什么含義呢,直接將這個字符串在所有的請求中進行搜索,并沒有找到相同的字符串,但根據以往的經驗,我們可以猜測出,相關的信息肯定就在這次請求的前幾條中。
????????其中這條video/base_info的請求引起了我們的注意。在這條請求的返回數據中,存在video_urls和videoUrl的字段,但這字段也是加密過的,如下圖所示。
????????通過上面替換特殊字符的方式,我們還原了video_urls字段信息,如下圖所示。其中encrypt字段和我們的m3u8請求的鏈接一模一樣,故我們找到了這個請求地址的由來了。
????????此處順帶提一下,這個請求中的m3u8所帶的參數是什么意思呢?它的組成也是很有意思的。它是由兩個字符串構成的,如下所示。
????????拆解后的第一部分字符串又暗藏著玄機,它是由兩串子串交替出現,子串1為base64加密的一個網址,子串2是一句話,大致的意思可能是說xxx的視頻加密是一個靚仔,是不是騷得很。
????????再往前面的一些請求包括微信掃碼登錄,已購課程列表獲取等等操作,此次就省略一萬字了,不再贅述了,留給各位讀者自己去研究吧,基本難度不大。
????????當我們獲取m3u8文件后,就可以逐個下載ts片段視頻,隨機播放一個ts片段,會發現,這個片段也是經過加密的,直接播放是行不通的,我們還需要逐個進行解密后才能播放。這邊是通過這條請求發現的,在請求獲取到m3u8文件后,又有一個get_video_key的請求了,如下圖所示。
????????可以看出這個key也是加密的,而且有了密鑰以后,我們對ts文件的加密方式也是一無所知的,此處再次省略一萬字分析過程,直接說結論。這里的ts的加密采用了AES加密的CBC模式,iv偏移為0,key的密鑰如上所示(每個課程的密鑰是不一樣),只要采用字節形式表示,無視所有亂碼,直接通吃。因此這邊的解密我們就不在話下了。對了這邊的密鑰獲取的請求地址,是在m3u8文件中獲取到的,具體可以查看解碼后的m3u8文件。
????????當我們逐個進行視頻解密后,我們就可以通過ffmpeg的concat命令進行視頻合并了。此次留個小思考,若直接通過ffmpeg進行視頻合并,會發現合并后的視頻在片段拼接處存在聲音卡頓現象,像是數據丟失的導致的,而網址上播放的課程是沒有該問題,小伙伴們可以思考下如何可以?解決該問題。
??????????終于,萬年一更的文章終于搞定了,如果覺得我的分享對你有收獲的話,可以幫忙點贊分享一波,感謝我的小伙伴們?。?
總結
以上是生活随笔為你收集整理的Python的视频分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习kaneboy的 sps区域列表的管
- 下一篇: ADO.NET 2.0 中的新增 Dat