『B站API學(xué)習(xí)』不使用插件下載B站視頻

聲明:僅作技術(shù)交流,嚴(yán)禁用于盜視頻

前言
前幾天,發(fā)了個(gè)演示不用插件只用瀏覽器和aria2c下載器下載視頻的視頻。

發(fā)這個(gè)純粹是裝個(gè)B,之所以標(biāo)題里寫(xiě)著不包會(huì),是因?yàn)槲易约褐肋@個(gè)方法是有bug的。關(guān)鍵是https://api.bilibili.com/x/player/playurl這個(gè)接口的可被條抓取件。

但是它是可以輸入地址調(diào)用,大會(huì)員不是必須條件,不登錄帳號(hào)也是可以。
在瀏覽器的地址欄直接輸入:

也可以獲取到視頻的下載鏈接信息。
“?”后面是請(qǐng)求的各種參數(shù),并以“&”分割,下面來(lái)解釋下如何手動(dòng)構(gòu)造這個(gè)請(qǐng)求URL。

下載視頻分幾步?
在我看來(lái)這個(gè)過(guò)程有以下的步驟:(已知BV號(hào)或av的情況下)
通過(guò)BV號(hào)或者av號(hào)獲取稿件的P數(shù),以及每P視頻的cid
通過(guò)BV號(hào)或者av號(hào)加上畫(huà)質(zhì)參數(shù)(qn)來(lái)組合playurl接口的參數(shù),來(lái)獲取視頻的下載地址。
將下載地址導(dǎo)入下載器,添加referer請(qǐng)求標(biāo)頭,下載。
CID是個(gè)啥?咋獲取?
av號(hào)和bv號(hào)我們都很熟悉,但它們是稿件的唯一編號(hào)。
一個(gè)視頻稿件可能不會(huì)只有一個(gè)視頻(多P),你只告訴服務(wù)器av號(hào)或bv號(hào),服務(wù)器其實(shí)并不知道你要獲取哪個(gè)視頻。于是就需要另一種編號(hào)來(lái)指定視頻,這就是cid。
cid不會(huì)在正常訪問(wèn)時(shí)查看到,于是也需要調(diào)用特定接口來(lái)獲取。
https://api.bilibili.com/x/web-interface/view
這個(gè)接口使用很簡(jiǎn)單,只有一個(gè)參數(shù):aid(av號(hào))或bvid(BV號(hào))二選一。

其返回的json數(shù)據(jù)(使用開(kāi)發(fā)者模式查看)

從中你可以看到該稿件的很多信息:BV號(hào)av號(hào)(可以用作兩者在線互轉(zhuǎn))、UP主、封面圖……
pages中存有稿件每一個(gè)P的信息,cid就保存在這里,擇其一。

構(gòu)建playurl接口請(qǐng)求
好了現(xiàn)在就有了能夠指定視頻的兩個(gè)最重要的參數(shù)了

這個(gè)時(shí)候你可以直接在接口地址后跟上兩個(gè)參數(shù)。

返回?cái)?shù)據(jù):

durl-url里的鏈接就是視頻下載鏈接了,這里由于其他參數(shù)缺省,獲取到的是flv封裝的720p視頻地址,包含音視頻。
如果要其他畫(huà)質(zhì)呢?那就是qn參數(shù)所確定的事了。
加上qn參數(shù):


返回同上,參數(shù)設(shè)定你會(huì)獲取到1080p+畫(huà)質(zhì)的flv視頻,如果視頻沒(méi)有對(duì)應(yīng)畫(huà)質(zhì)選項(xiàng),那么它會(huì)在大會(huì)員畫(huà)質(zhì)中選擇對(duì)應(yīng)數(shù)值小于112且最大的,比如一個(gè)60幀視頻,qn=112,返回720p60。
當(dāng)然這個(gè)請(qǐng)求會(huì)依賴(lài)于cookie,也就是它需要驗(yàn)證瀏覽器登錄的帳號(hào)是否有大會(huì)員,沒(méi)有則只會(huì)返回1080p畫(huà)質(zhì)。如果沒(méi)有登錄,則只有480p(也就是無(wú)賬號(hào)游客可觀看的最高畫(huà)質(zhì))。
(所以說(shuō)白嫖是不可能的啦……)
如果想要4K畫(huà)質(zhì)的視頻,按上面的方法(qn取120)是無(wú)法獲取的,這時(shí)候需添加參數(shù)fourk=1。

這時(shí)候獲取到的是4K分辨率的flv視頻。

下載視頻
通過(guò)以上的一通操作,我們現(xiàn)在已經(jīng)有了視頻的下載鏈接。

這時(shí)候,直接用瀏覽器訪問(wèn)該鏈接會(huì)報(bào)403。
這是因?yàn)槿鄙僬?qǐng)求referer標(biāo)頭。referer內(nèi)容是啥?從抓播放視頻時(shí)瀏覽器的請(qǐng)求記錄可知它就是播放頁(yè)的地址。(av號(hào)也可以)
https://www.bilibili.com/video/BV17p4y1D7dA
多P稿件需指定P的標(biāo)號(hào):(BV1Yv411z7q3?的2P)
https://www.bilibili.com/video/BV1Yv411z7q3?p=2
下載工具我使用aria2c,這是一個(gè)命令行(本體無(wú)圖形界面)的開(kāi)源多協(xié)議多線程下載器。功能類(lèi)似IDM,但還支持種子以及磁鏈的下載。使用它一是因?yàn)槲疫€算比較熟悉使用,二是它可以在添加下載任務(wù)時(shí)手動(dòng)加入標(biāo)頭。
aria2c下載:https://github.com/aria2/aria2/releases

下載即可得到flv視頻,包含音視頻。

進(jìn)階篇
下載dash源以及H265視頻
最開(kāi)始從瀏覽器抓下來(lái)的接口調(diào)用的參數(shù)好像不止以上的bvid(或avid)、cid、qn、fourk,之前的視頻中我是音視頻分開(kāi)下載再后期合并。

其實(shí)這些參數(shù)中有些是不必要手動(dòng)輸入(對(duì)于達(dá)成我們的目的來(lái)說(shuō))fnval算是一個(gè)有點(diǎn)用的參數(shù),這里就取值16

返回的數(shù)據(jù)結(jié)構(gòu)就與之前的相比差異比較大了。

這里獲取的是當(dāng)前網(wǎng)頁(yè)端以及APP端所使用的dash源視頻,特點(diǎn)是音視頻是分開(kāi)的,并且下載到的文件擴(kuò)展名為m4s,如果你經(jīng)常在安卓APP上緩存視頻,并查看過(guò)下載的文件,擴(kuò)展名是一樣的,且音視頻都是分開(kāi)的。dash下的audio和video分別就是音視頻,展開(kāi)獲得鏈接,下載方法與上面相同。
你應(yīng)該也發(fā)現(xiàn)了視頻video中每個(gè)id對(duì)應(yīng)著畫(huà)質(zhì),qn設(shè)定為120卻獲取到了所有的畫(huà)質(zhì)級(jí)別,并且每種畫(huà)質(zhì)都有兩條。
這兩條分別對(duì)應(yīng)著傳統(tǒng)H264的視頻源,以及新式的H265的視頻源


HEVC的規(guī)格為8bit,這個(gè)格式目前在WEB端沒(méi)有使用,APP在用。(不是所有視頻都有)
Aria2c?簡(jiǎn)單使用方法
從GitHub可以直接下載編譯好的windows版本。
解壓后只有一個(gè)可執(zhí)行程序?aria2c.exe?這個(gè)是本體了。
你可以選擇添加到環(huán)境變量,shell?cmd中可以快速調(diào)用,也可以直接拖到Powershell或cmd中,后面空格加上命令參數(shù)

Python?編程實(shí)現(xiàn)
有了上面思路步驟,基本上就可以依靠request模塊的get()以及json模塊來(lái)發(fā)起GET請(qǐng)求調(diào)用接口解析數(shù)據(jù)了,下載通過(guò)subprocess模塊調(diào)用aria2c下載以及ffmpeg合并音視頻。
在get()的使用上,添加了header(請(qǐng)求標(biāo)頭包含cookie以實(shí)現(xiàn)下載大會(huì)員視頻)
執(zhí)行效果:

源代碼:https://github.com/Daniel2022/bilibili_own_tools (本人的帳號(hào)cookie已剔除)

延伸

dash源不是所有時(shí)候都返回所有畫(huà)質(zhì)的鏈接

何為DASH

H265格式觸發(fā)的個(gè)人推測(cè)

API調(diào)用簡(jiǎn)單實(shí)戰(zhàn)

參考資料
https://segmentfault.com/a/1190000017511459 【關(guān)于bilibili視頻下載的一些小思路?原作者:shabby】
頭圖PID:69606244