Skip to content

Commit fc6a8ac

Browse files
committed
fix: 将首页推荐接口改为最新的wbi接口 #524
1 parent 60d90f5 commit fc6a8ac

File tree

3 files changed

+67
-24
lines changed

3 files changed

+67
-24
lines changed

src/background/messageListeners/api/video.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ import type { APIMAP } from '../../utils'
22
import { AHS } from '../../utils'
33

44
const API_VIDEO = {
5+
// https://socialsisteryi.github.io/bilibili-API-collect/docs/video/recommend.html#%E8%8E%B7%E5%8F%96%E9%A6%96%E9%A1%B5%E8%A7%86%E9%A2%91%E6%8E%A8%E8%8D%90%E5%88%97%E8%A1%A8-web%E7%AB%AF
56
getRecommendVideos: {
6-
url: 'https://api.bilibili.com/x/web-interface/index/top/feed/rcmd',
7+
url: 'https://api.bilibili.com/x/web-interface/wbi/index/top/feed/rcmd',
78
_fetch: {
89
method: 'get',
910
},
1011
params: {
11-
fresh_idx: 0,
12-
feed_version: 'V2',
13-
fresh_type: 4,
14-
ps: 30,
15-
plat: 1,
12+
fresh_type: 4, // 相关性控制
13+
feed_version: 'V8', // Feed版本
14+
homepage_ver: 1, // 首页版本
15+
ps: 12, // 单页记录数,默认12,最大30(调用时可覆盖)
16+
fresh_idx: 1, // 翻页号,从1开始(调用时会动态传入)
1617
},
1718
afterHandle: AHS.J_D,
1819
},

src/contentScripts/views/Home/components/ForYou.vue

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -236,15 +236,15 @@ function transformWebVideo(item: VideoItem): VideoCardDisplayData {
236236
title: decodeHtmlEntities(item.title),
237237
cover: item.pic,
238238
author: {
239-
name: decodeHtmlEntities(item.owner.name),
240-
authorFace: item.owner.face,
239+
name: decodeHtmlEntities(item.owner?.name || ''),
240+
authorFace: item.owner?.face || '',
241241
followed: !!item.is_followed,
242-
mid: item.owner.mid,
242+
mid: item.owner?.mid || 0,
243243
},
244244
tag: decodeHtmlEntities(item?.rcmd_reason?.content),
245-
view: item.stat.view,
246-
danmaku: item.stat.danmaku,
247-
like: item.stat.like,
245+
view: item.stat?.view || 0,
246+
danmaku: item.stat?.danmaku || 0,
247+
like: item.stat?.like,
248248
publishedTimestamp: item.pubdate,
249249
bvid: item.bvid,
250250
cid: item.cid,
@@ -520,20 +520,41 @@ async function getRecommendVideos() {
520520
521521
const beforeLoadCount = videoList.value.filter(video => video.item).length
522522
523+
// 使用当前的 refreshIdx,只在成功时才递增
524+
const currentRefreshIdx = refreshIdx.value
523525
const response: forYouResult = await api.video.getRecommendVideos({
524-
fresh_idx: refreshIdx.value++,
526+
fresh_idx: currentRefreshIdx,
525527
ps: PAGE_SIZE,
526528
})
527529
530+
if (!response) {
531+
console.error('Failed to load web recommendations: Response is undefined')
532+
noMoreContent.value = true
533+
return
534+
}
535+
528536
if (!response.data) {
529537
noMoreContent.value = true
530538
return
531539
}
532540
533541
if (response.code === 0) {
542+
// 只在成功时递增 refreshIdx
543+
refreshIdx.value++
544+
534545
const resData = [] as VideoItem[]
535546
536547
response.data.item.forEach((item: VideoItem) => {
548+
// 过滤掉广告卡片
549+
if (item.goto === 'ad')
550+
return
551+
552+
// 过滤掉缺少必要字段的数据(owner 或 stat 为 null)
553+
if (!item.owner || !item.stat) {
554+
console.warn('[ForYou] Filtered out item with null owner or stat:', item.id, item.goto)
555+
return
556+
}
557+
537558
if (!filterFunc.value || filterFunc.value(item))
538559
resData.push(item)
539560
})
@@ -591,12 +612,17 @@ async function getRecommendVideos() {
591612
else if (response.code === 62011) {
592613
needToLoginFirst.value = true
593614
}
615+
else {
616+
// 其他错误码也应该停止加载,避免无限重试
617+
console.error('API returned error code:', response.code, response.message)
618+
noMoreContent.value = true
619+
}
594620
}
595621
finally {
596622
const filledItems = videoList.value.filter(video => video.item)
597623
videoList.value = filledItems
598624
599-
if (!needToLoginFirst.value) {
625+
if (!needToLoginFirst.value && !noMoreContent.value) {
600626
await nextTick()
601627
602628
const hasScrollbar = await haveScrollbar()
@@ -627,6 +653,13 @@ async function getAppRecommendVideos() {
627653
return
628654
}
629655
656+
// 检查是否有有效的 access token
657+
if (!appAuthTokens.value.accessToken) {
658+
console.warn('APP 推荐模式需要登录,access token 为空')
659+
needToLoginFirst.value = true
660+
return
661+
}
662+
630663
const batchesToLoad = APP_LOAD_BATCHES.value
631664
const beforeLoadCount = appVideoList.value.length
632665
@@ -646,6 +679,11 @@ async function getAppRecommendVideos() {
646679
idx: lastIdx,
647680
})
648681
682+
if (!response) {
683+
console.error('Failed to load batch', batch, 'Response is undefined')
684+
break
685+
}
686+
649687
if (response.code === 0) {
650688
response.data.items.forEach((item: AppVideoItem) => {
651689
// Remove banner & ad cards

src/models/video/forYou.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// https://app.quicktype.io/?l=ts
2+
// 更新以适配B站新的WBI推荐接口
23

34
export interface forYouResult {
45
code: number
@@ -10,9 +11,9 @@ export interface forYouResult {
1011
export interface Data {
1112
item: Item[]
1213
side_bar_column: any[]
13-
business_card: null
14-
floor_info: null
15-
user_feature: null
14+
business_card: null | any
15+
floor_info: null | any
16+
user_feature: null | any
1617
preload_expose_pct: number
1718
preload_floor_expose_pct: number
1819
mid: number
@@ -29,24 +30,27 @@ export interface Item {
2930
title: string
3031
duration: number
3132
pubdate: number
32-
owner: Owner
33-
stat: Stat
34-
av_feature: null
33+
owner: Owner | null // 广告卡片时可能为 null
34+
stat: Stat | null // 广告卡片时可能为 null
35+
av_feature: null | any
3536
is_followed: number
36-
rcmd_reason: RcmdReason
37+
rcmd_reason: RcmdReason | null // 可能为 null
3738
show_info: number
3839
track_id: string
3940
pos: number
40-
room_info: null
41-
ogv_info: null
42-
business_info: null
41+
room_info: null | any
42+
ogv_info: null | any
43+
business_info: null | any // 广告卡片时为对象
4344
is_stock: number
4445
enable_vt: number
4546
vt_display: string
47+
dislike_switch?: number // 可选字段
48+
dislike_switch_pc?: number // 可选字段
4649
}
4750

4851
export enum Goto {
4952
AV = 'av',
53+
AD = 'ad', // 广告卡片
5054
}
5155

5256
export interface Owner {

0 commit comments

Comments
 (0)