【B站API研究】客戶端分享視頻API研究歷程
眾所周知,bilibili帳號的LV等級是身份的重要象征,而由于B站每日獲取經(jīng)驗值數(shù)量方法有限,高等級的bilibili帳號往往較為稀有。為了快速升級LV,不少小伙伴選擇堅持完成大部分“每日任務”來獲得更多經(jīng)驗值。但“每日任務”列表中的任務有些簡單,有些較為復雜,像如每日在客戶端分享視頻這項任務,顯然比較耗費時間與精力。為了節(jié)省時間、提高效率,筆者結(jié)合少許HTML相關知識與網(wǎng)絡抓包技術(shù)經(jīng)驗,對B站客戶端分享視頻的API做了略微研究,借助JS腳本實現(xiàn)了每日任務完成的自動化過程,在此略作分享,如有不當,敬請批評指正!
了解任務要求
在PC Web端打開個人中心,即可查看每項任務及對應的完成情況。這里注意最后一個每日分享視頻任務,以前并沒有客戶端分享的要求,更新要求之后,Web端分享無效,也就是說,如果想要通過網(wǎng)絡抓包方式獲取API,必須借助App客戶端。

明確了這個限制,下面我們開始著手搭建App抓包環(huán)境。筆者這里結(jié)合自身實踐經(jīng)歷,選擇了安卓模擬器方案。
所用所有軟件及環(huán)境(不必完全一致,僅作示例):安卓模擬器(以雷電模擬器為例),Xposed(安裝JustTrustMe插件),嗶哩嗶哩App(普通版),BurpSuite
準備基礎環(huán)境:安裝模擬器+Xposed+JustTrustMe插件
這一步主要是準備App軟件安裝和網(wǎng)絡抓包的基礎環(huán)境,Xposed+JustTrustMe可以實現(xiàn)安卓App的近乎無感http/https抓包,是后面抓包的必要條件。
網(wǎng)上教程不勝枚舉,這里不再詳細概述,有興趣可以自行上網(wǎng)搜索,或參考下面的文章:
https://blog.csdn.net/sinat_28371057/article/details/118518850
Tips:很多教程給出的是用Fiddler進行抓包,而筆者則出于個人習慣選擇了BurpSuite,經(jīng)測試兩種軟件都可以正常抓包,這里可以根據(jù)自身習慣和喜好進行選擇。
配置抓包環(huán)境:安裝配置Fiddler/BurpSuite+安裝對應證書
這一步的目的是讓Android系統(tǒng)信任抓包軟件(的證書),從而可以使用抓包軟件解析加密流量的內(nèi)容。
——配置Burp:
新建一個Burp實例,轉(zhuǎn)到Proxy-Intercept選項卡,點擊Intercept is on的藍色按鈕使其變成白色的Intercept is off,從而關閉http/https流量的截獲功能。
轉(zhuǎn)到Proxy-Options選項卡,在Proxy Listeners處點擊 Add
在彈出的窗口的Binding選項卡中,Bind to port填寫要監(jiān)聽的端口(可以是任意一個不會被其他程序使用的端口,例如8080、8443等),Bind to address這里可以選擇 All Interfaces(在所有網(wǎng)絡接口上抓包),也可以選擇Specific address(指定要監(jiān)聽的IP),完成后點擊OK
勾選新建項目的Running前面的復選框,同時取消勾選其他項目的復選框(以避免數(shù)據(jù)包過多影響分析判斷),Burp配置完成。


——安裝證書:
首先說一句,Burp默認提供的證書類型為der后綴,Android系統(tǒng)無法直接安裝。為求方便,筆者選擇了網(wǎng)頁在線轉(zhuǎn)換證書,轉(zhuǎn)換經(jīng)歷是:der->pem->cer,而Fiddler默認的證書則可以直接安裝到Android系統(tǒng)中,省去了轉(zhuǎn)換這一步驟。筆者對證書研究有限,如果有更好的方式,歡迎留言反饋!
打開瀏覽器,訪問上一步已經(jīng)勾選Running的項目的IP:Port地址,例如筆者勾選了10.0.0.10:8080的Running復選框,則訪問10.0.0.10:8080,如下圖。然后點擊右上角的 CA Certificate,在彈出的下載窗口中選擇保存,即可獲得證書。
Tips:當然,你也可以選擇上一步中的Import / export CA certificate,通過導出證書的方式獲取證書。

之后使用網(wǎng)頁在線服務,轉(zhuǎn)換der證書到pem類型,再從pem類型轉(zhuǎn)換到cer/crt類型。筆者使用的網(wǎng)站:http://web.chacuo.net/netsslcer2pem
最后,你應該會成功獲得后綴名為crt/cer的證書文件,將其使用共享文件夾功能共享到Android系統(tǒng)文件夾中,然后打開它,按照提示完成安裝即可。
安裝App客戶端
恕筆者能力有限,這一章節(jié)實在想不出什么好講的內(nèi)容來。
打開網(wǎng)絡代理轉(zhuǎn)發(fā)
這一步是將Android系統(tǒng)的流量轉(zhuǎn)發(fā)到抓包軟件。
這里以雷電模擬器為例,筆者使用adb調(diào)試功能打開網(wǎng)絡代理轉(zhuǎn)發(fā):
找到雷電模擬器的快捷方式指向位置,在同目錄下存在名為adb.exe的程序。
按住Shift的同時右鍵該目錄的空白處,選擇 在此處打開powershell窗口,在窗口內(nèi)輸入以下命令并回車:
adb shell settings put global http_proxy [ip]:[port]
[ip]替換為在第一步中設置的IP地址(筆者的IP地址為10.0.0.10)。如果第一步中選擇了All interface,則隨意填寫一個本機IP地址。
[port]替換為第一步中設置的端口。
最終的命令應該像這樣:adb shell settings put global http_proxy 10.0.0.10:8080
注意:powershell可能不允許直接以應用程序名稱作為命令的開頭,因此你可能需要輸入為這樣:.\adb shell settings put global http_proxy 10.0.0.10:8080
如果你想關閉轉(zhuǎn)發(fā)功能,只需要將上文中的[ip]:[port]替換為 :0即可,如:adb shell settings put global http_proxy :0

到此處,你應該可以在代理軟件中觀察到些許流量記錄。對于Burpsuite,可以在Proxy-HTTP Proxy中查看,如下圖所示。點擊任意一個HTTPS數(shù)據(jù)包,你應該可以直接查看數(shù)據(jù)包的明文信息。

如果沒有任何流量記錄,嘗試打開App并刷新幾下,以此產(chǎn)生一些網(wǎng)絡流量。
觸發(fā)任務行為,觀察網(wǎng)絡流量
Tips:為了提高效率、減少無用數(shù)據(jù)包的干擾,建議你在開始操作之前再打開網(wǎng)絡代理轉(zhuǎn)發(fā)功能,在完成操作之后立刻關閉網(wǎng)絡代理轉(zhuǎn)發(fā)功能!
為了獲取我們所需要的流量,我們需要在App中進行相應的操作。以分享視頻為例,我們可以打開App,在使用自己的賬戶登錄App后,選擇任意一個視頻,點擊“分享”-“動態(tài)”-“發(fā)布”,如下圖所示:


完成分享后,回到抓包軟件,分析流量記錄??梢钥吹剑诜窒硗瓿珊蟮膸缀跻凰查g,有一個URL中帶有 finish 名稱的記錄,這有可能是我們所需要的API。右鍵這條記錄,選擇Highlight,點擊一種顏色來把它突出顯示出來。單擊這條記錄,可以查看數(shù)據(jù)包的詳細信息。

這里我們可以在Response一欄看到返回數(shù)據(jù)的詳細信息,有一行字引起我們高度注意:“每天首次分享成功,等級經(jīng)驗值+5”,這在一定程度上確認了我們的猜測。
接下來,重點分析Request內(nèi)容??梢钥吹?,請求內(nèi)容中有大量未知參數(shù)。部分參數(shù)可以通過查找資料獲得相應信息,而部分參數(shù)則沒有相關介紹。這里提一下筆者的研究結(jié)果:
Headers頭部只保留HTTP包的基本信息即可,自定義頭可以全部去掉
Body中的參數(shù)的必要性尚未研究,有興趣可以自行刪減參數(shù)進行測試
Body中access_key需要手動生成,appkey對于普通版本Android App為1d8b6e7d45233436,oid=aid,sid=cid,ts=時間戳(毫秒舍去),sign=md5(body內(nèi)容+appsec),appsec=560c52ccd288fed045859ed18bffd973,share_session_id可選
如果有興趣深入研究,可以參考Github上的API收集項目:https://github.com/SocialSisterYi/bilibili-API-collect
另外的兩個每日任務研究思路類似,在此不做贅述,讀者大可以舉一反三。
制作JS腳本,實現(xiàn)自動化
為了節(jié)省大家的時間,筆者已經(jīng)制作了一個JS腳本,可以自動完成登錄、觀看、分享視頻,有興趣可以去筆者的Github(主頁鏈接在個人簡介中有)下載:https://github.com/ICONQUESTION/BilibiliJS
使用方法:掛載到油猴即可,具體教程網(wǎng)上甚多,不再重復。
經(jīng)過筆者一段時間嘗試,腳本運行情況穩(wěn)定,每日任務均可以自動完成,至此目的達成。

關于b站每日任務API的研究就到此告一段落了。如果你有更好的方法,或?qū)Ρ疚闹械挠^點看法有不同的見解,歡迎在下方的評論區(qū)留言!
感謝閱讀。