diff --git a/lib/v2/bilibili/cache.js b/lib/v2/bilibili/cache.js index 7f233d8ed..866904272 100644 --- a/lib/v2/bilibili/cache.js +++ b/lib/v2/bilibili/cache.js @@ -1,30 +1,53 @@ const got = require('@/utils/got'); module.exports = { + getCookie: (ctx) => { + const key = 'bili-cookie'; + return ctx.cache.tryGet(key, async () => { + const response = await got(`https://www.bilibili.com/`); + return response.headers['set-cookie']; + }); + }, getUsernameFromUID: (ctx, uid) => { const key = 'bili-username-from-uid-' + uid; return ctx.cache.tryGet(key, async () => { - const { data: nameResponse } = await got(`https://api.bilibili.com/x/space/acc/info?mid=${uid}&jsonp=jsonp`, { + const cookie = await module.exports.getCookie(ctx); + await got(`https://space.bilibili.com/${uid}/`, { headers: { - Referer: `https://space.bilibili.com/${uid}`, - }, + Referer: 'https://www.bilibili.com/', + Cookie: cookie + } + }); + const {data: nameResponse} = await got(`https://api.bilibili.com/x/space/acc/info?mid=${uid}&token=&platform=web&jsonp=jsonp`, { + headers: { + Referer: `https://space.bilibili.com/${uid}/`, + Cookie: cookie + } }); return nameResponse.data.name; }); }, getUsernameAndFaceFromUID: async (ctx, uid) => { + const cookie = await module.exports.getCookie(ctx); const nameKey = 'bili-username-from-uid-' + uid; const faceKey = 'bili-userface-from-uid-' + uid; let name = await ctx.cache.get(nameKey); let face = await ctx.cache.get(faceKey); - if (!name) { - const nameResponse = await got(`https://api.bilibili.com/x/space/acc/info?mid=${uid}&jsonp=jsonp`, { + if (!name || !face) { + await got(`https://space.bilibili.com/${uid}/`, { headers: { - Referer: `https://space.bilibili.com/${uid}`, - }, + Referer: `https://www.bilibili.com/`, + Cookie: cookie + } }); - name = nameResponse.data.data.name; - face = nameResponse.data.data.face; + const {data: nameResponse} = await got(`https://api.bilibili.com/x/space/acc/info?mid=${uid}&token=&platform=web&jsonp=jsonp`, { + headers: { + Referer: `https://space.bilibili.com/${uid}/`, + Cookie: cookie + } + }); + name = nameResponse.data.name; + face = nameResponse.data.face; ctx.cache.set(nameKey, name); ctx.cache.set(faceKey, face); } diff --git a/lib/v2/bilibili/video-all.js b/lib/v2/bilibili/video-all.js index f025119ed..b1a1a73f1 100644 --- a/lib/v2/bilibili/video-all.js +++ b/lib/v2/bilibili/video-all.js @@ -6,27 +6,45 @@ const { parseDate } = require('@/utils/parse-date'); module.exports = async (ctx) => { const uid = ctx.params.uid; const disableEmbed = ctx.params.disableEmbed; + const cookie = await cache.getCookie(ctx); const [name, face] = await cache.getUsernameAndFaceFromUID(ctx, uid); - const response = await got(`https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp`, { + await got(`https://space.bilibili.com/${uid}/video?tid=0&page=1&keyword=&order=pubdate`, { headers: { Referer: `https://space.bilibili.com/${uid}/`, + Cookie: cookie + }, + }); + const response = await got(`https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp`, { + headers: { + Referer: `https://space.bilibili.com/${uid}/video?tid=0&page=1&keyword=&order=pubdate`, + Cookie: cookie }, }); const vlist = [...response.data.data.list.vlist]; const pageTotal = Math.ceil(response.data.data.page.count / response.data.data.page.ps); + + const getPage = async (pageId) => { + await got(`https://space.bilibili.com/${uid}/video?tid=0&page=${pageId}&keyword=&order=pubdate`, { + headers: { + Referer: `https://space.bilibili.com/${uid}/`, + Cookie: cookie + }, + }); + return await got(`https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=30&tid=0&pn=${pageId}&keyword=&order=pubdate&jsonp=jsonp`, { + headers: { + Referer: `https://space.bilibili.com/${uid}/video?tid=0&page=${pageId}&keyword=&order=pubdate`, + Cookie: cookie + }, + }); + }; + const promises = []; if (pageTotal > 1) { for (let i = 2; i <= pageTotal; i++) { - promises.push( - got(`https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=30&tid=0&pn=${i}&keyword=&order=pubdate&jsonp=jsonp`, { - headers: { - Referer: `https://space.bilibili.com/${uid}/`, - }, - }) - ); + promises.push(getPage(i)); } const rets = await Promise.all(promises); rets.forEach((ret) => { diff --git a/lib/v2/bilibili/video.js b/lib/v2/bilibili/video.js index ec0b77117..f10855fad 100644 --- a/lib/v2/bilibili/video.js +++ b/lib/v2/bilibili/video.js @@ -5,13 +5,19 @@ const utils = require('./utils'); module.exports = async (ctx) => { const uid = ctx.params.uid; const disableEmbed = ctx.params.disableEmbed; + const cookie = await cache.getCookie(ctx); const [name, face] = await cache.getUsernameAndFaceFromUID(ctx, uid); - const response = await got({ - method: 'get', - url: `https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=10&tid=0&pn=1&order=pubdate&jsonp=jsonp`, + await got(`https://space.bilibili.com/${uid}/video?tid=0&page=1&keyword=&order=pubdate`, { headers: { Referer: `https://space.bilibili.com/${uid}/`, + Cookie: cookie + }, + }); + const response = await got(`https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp`, { + headers: { + Referer: `https://space.bilibili.com/${uid}/video?tid=0&page=1&keyword=&order=pubdate`, + Cookie: cookie }, }); const data = response.data;