對於喜歡看日本節目的朋友,應該相當熟悉 嗶哩嗶哩,不過現在已經沒有日劇上架,只有非日劇的日本節目。個人每天是固定

會看幾個日本晨間節目例如 Vivit Zip! 等等,這些都有熱心的網友都會當日就上傳,只需搜索這些影片後,然後添加這些上傳網友

到關注,就會自動接受這些關注朋友的上傳通知。

 

嗶哩嗶哩 在 手機版的網頁是用 mp4 影片,不過那個是低解析的,雖然很容易解析下載,但是既然要下載了自然是選擇最高清的

影片來下載離綫觀看。高解析的影片在電腦版的網頁,是用 flv 格式來播放,播放器自然是網頁的 flv player。

 

以今天早上的 Vivit 影片為例:https://www.bilibili.com/video/av20747563

 

用 Chrome F12 可以看到一個 json 影片列表下載下來,這個網址的生成公式是,先在影片網頁裏查找 cid 值,然後用 md5

加密生成以下字串:

 

cid=33973827&player=1&quality=0&ts=1521021138

 

quality 設0表示是最高解析度,ts後面帶的時間就是當前的 unix time 秒,md5 後生成的 signature 是 

ed3cf74d37e718b43b83bda9c396c42c

 

這樣合成的 json 影片列表網址就是:

 

http://interface.bilibili.com/playurl?cid=33973827&player=1&quality=0&ts=1521021138&sign=ed3cf74d37e718b43b83bda9c396c42c

 

打開後可以看到影片列表是如此:

 

QQ截圖20180314095936  

 

先取出最高視頻的 quality id, 

"accept_quality":[80,64,32,15]

這個例子最高的值就是 80

 

然後再合成一次這個 interface url link:

 

https://interface.bilibili.com/v2/playurl?cid=34634594&appkey=84956560bc028eb7&otype=json&type=&quality=80&qn=80&sign=76686117dc639fd1376957bc35f99282

 

appkey 是固定值,合成 sign 的公式是 把 appkey=84956560bc028eb7&cid=34634594&otype=json&qn=80&quality=80&type=94aba54af9065f71de72f5508f1cd42e

這個字串作 md5 就是最後面的 sign 值,下載 xml 後就可以看到最高視頻的影片下載列表。

 

嗶哩嗶哩 的影片列表有分為兩個,一個是正選的視頻網址,一個是備份,兩個都需要作存儲,因為有時下載過程需要在兩個視頻網址切換,一個不行

就換另外一個。

 

flv 通常是好幾個 flv 檔案,所以最後還需要作 flv 合併的一個 flv 檔案的設計,這個設計比 mp4 合併簡單,只要瞭解 flv 的架構,

就可以設計出來。

 

按照上面的列表,把 http header 的 referer 設置原來視頻網址,就可以依序下載,如果要斷點續傳,就是多設

http header 的 range 初始數值。

 

不過 嗶哩嗶哩 剛對 視頻流下載作了限制,有時下載開始幾秒後就會限速為 1KB/sec 所以需要作特殊的解法,因為這個限制才

剛加,所以就不寫是如何解決這個限制的方法,避免又再有更新的限制需要解決。。。

 

 

 

 

相關文章