故事背景
作者:一個小透明,寫著差不多的程式碼,在前端群經常熱心幫忙解答問題,平時喜歡逛B站鬼畜區和科技區
過年前的某天午休,我一邊吃飯一邊逛B站,不小心手抖點進了B站畫友板塊,無意中發現這個板塊居然是用vue寫的。所以就習慣性地開啟了f12,所有的請求一目瞭然。因為之前曾學習過黃軼的音樂課程,就想著自己是否也可以做一個類似的移動端專案,這就是社群app的背景。
github倉庫地址
專案預覽地址
(阿里雲1Mbps的小水管,有可能資源載入比較慢,請大家多包涵= =)
一些預覽圖
ps.為了避免涉及侵權,所有私人作品均打碼,請猛擊專案預覽地址進行預覽。
資料準備
踩坑指南
- B站的請求比較奇怪,首頁輪播圖使用的是post請求,而評論資料使用的是jsonp請求,所以我們這裡要準備兩個庫,根據它的請求選擇合適的方式獲取資料
- 我們需要偽造Request Headers裡面的Host Origin Referer三個欄位來瞞過B站的伺服器,這裡使用axios在傳送請求之前改造一下我們的請求頭 這裡的HEADERS被我封裝了一下,因為大部分請求都是需要偽造的
如果我們想要實現一些互動功能,比如點贊、關注、收藏等功能,我們是需要登入狀態的,這裡我試驗了一下,我們註冊一個B站賬號,從cookie中把我們的資訊貼上到這裡,帶著跟著請求一起傳送過去,在真B站中是可以看到狀態的變更的。我只做了關注/取關功能,其他功能,比如收藏評論等,大家可以大開腦洞嘗試一下~
- axios預設的提交資料型別是json,但是有些api,比如輪播圖,請求需要的資料型別是application/x-www-form-urlencoded,這時我們就需要使用axios把我們的資料轉換一下
axios({
url: 'https://api.vc.bilibili.com/oper/v1/banner/getListOnline',
method: 'post',
data: {
'product': 2,
'platform': 'pc',
'position_id[0]': 8,
'csrf_token': '<token>',
},
transformRequest: [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}],
headers: Object.assign(common.HEADERS, {
'Content-Type': 'application/x-www-form-urlencoded',
})
}).then(response => {
res.json(response.data);
}).catch(e => console.log(e));
複製程式碼
- 在網頁端,大部分圖片經過優化,我們接收到的都是webp格式並且進行了裁剪,不過這裡我們移動端要注意:safari瀏覽器在ios端是不支援webp格式的圖片的。
- 首頁的推薦作品api端實現了分頁查詢,這裡我使用better-scroll的pullUpLoading功能實現了無縫載入,具體實現方式大家可以參看bs的文件和專案程式碼。
- 專案其實沒有很難的技術點,比較樸實,旨在個人練習以及拋磚引玉,希望大牛輕噴: )
- 最最重要的一點:最近推送的圖片有些。。。。怎麼說呢。。。。汙圖比較多,我也很絕望啊,我只是用了一下api,本人並不汙 x10086 (-。- ;)
最後。。。本專案中所有的資源均屬於B站以及作者所有,本專案全部程式碼已經開源,您的star是對我最大的鼓勵和支援~