From ed1142ce2811206c65d0647a15f4aaf8ff8fa17f Mon Sep 17 00:00:00 2001 From: andywang425 <56548456+andywang425@users.noreply.github.com> Date: Mon, 29 Jun 2026 19:33:07 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E2=9C=A8=20feat(LikeTask):=20=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E7=82=B9=E8=B5=9E=E6=95=B0=E9=87=8F=E4=B8=8A=E9=99=90?= =?UTF-8?q?=EF=BC=885000=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 细分了AfterExecutionAction的语义 --- CHANGELOG.md | 4 ++ src/library/help-info/index.ts | 15 +++- src/library/storage/defaultValues.ts | 2 + .../liveTasks/medalTasks/MedalModule.ts | 4 +- .../liveTasks/medalTasks/danmuTask.ts | 30 ++++---- .../liveTasks/medalTasks/likeTask.ts | 68 ++++++++++++------- .../liveTasks/medalTasks/types.d.ts | 14 +++- src/types/storage.d.ts | 2 + 8 files changed, 90 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a9805c3..5e373245 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### 新增 + +- 直播任务【点赞】新增每日点赞数量上限 5000(因为每天能完成任务的有效点赞数量为 5000 次) + ## [7.3.1] - 2026-6-25 ### 新增 diff --git a/src/library/help-info/index.ts b/src/library/help-info/index.ts index e59f1163..49970a72 100644 --- a/src/library/help-info/index.ts +++ b/src/library/help-info/index.ts @@ -119,7 +119,7 @@ const helpInfo: HelpInfo = { h('li', '点赞、发弹幕和观看直播任务都会等点亮熄灭勋章任务完成后再执行。'), h( 'li', - '熄灭的勋章被点亮后,通过完成任务获得的亲密度会被储蓄,且储蓄量存在上限(根据目前观察上限是100)。需要投喂一个粉丝灯牌才能领取这些亲密度。脚本会在控制台日志中提示储蓄的亲密度量以及是否达到上限。', + '熄灭的勋章被点亮后,通过完成任务获得的亲密度会被储蓄,且储蓄量存在上限(根据观察上限是100)。需要投喂一个粉丝灯牌才能领取这些亲密度。脚本会在控制台日志中提示储蓄的亲密度量以及是否达到上限。', ), ]), ]), @@ -131,7 +131,7 @@ const helpInfo: HelpInfo = { h('p', [ h( 'div', - '一轮指通过完成任务获得 +1 亲密度所需的最小操作量。具体值脚本会在运行过程中实时获取。根据观察目前每轮的操作量如下:', + '一轮指通过完成任务获得 +1 亲密度所需的最小操作量。具体值脚本会在运行过程中实时获取。根据观察每轮的操作量如下:', ), h('ul', [ h('li', '点赞:30 次'), @@ -153,7 +153,16 @@ const helpInfo: HelpInfo = { message: () => h('p', [ h('div', '为已点亮的粉丝勋章完成粉丝团升级任务中的点赞任务。'), - h('div', '只有主播开播时点赞才会计入任务进度。'), + h('ul', [ + h( + 'li', + '只有在主播开播时点赞才会计入任务进度,因此脚本默认只给正在直播的主播点赞。', + ), + h( + 'li', + '根据观察每个账号一天最多进行 5000 次有效点赞(能完成任务的点赞),达到点赞上限后点赞任务视为完成。', + ), + ]), ]), }, likeWaitUntilLiving: { diff --git a/src/library/storage/defaultValues.ts b/src/library/storage/defaultValues.ts index e76e52a3..ecac28c3 100644 --- a/src/library/storage/defaultValues.ts +++ b/src/library/storage/defaultValues.ts @@ -72,6 +72,8 @@ const defaultValues: DefaultValues = { waitUntilLiving: false, isWhiteList: false, roomidList: [], + _lastSuccessLikeTime: 0, + _todayLikeCount: 0, _lastCompleteTime: 0, }, danmu: { diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts b/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts index 528315cf..72c0011e 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts @@ -572,8 +572,8 @@ class MedalModule extends BaseModule { ) const action = await runOne(medal) - if (action === 'stop') { - return { stop: true } + if (action === 'stop' || action === 'stopAndMarkUncompleted') { + return { stop: true, markUncompleted: action === 'stopAndMarkUncompleted' } } else if (action === 'markUncompleted') { markUncompleted = true } diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts b/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts index 69a149df..1e12c706 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts @@ -77,7 +77,7 @@ class DanmuTask extends MedalModule { ): Promise> { if (MedalModule.shouldStopForCrossDay()) { this.logger.log('即将或刚刚发生跨天,提早结束本轮发弹幕任务') - return 'stop' + return 'stopAndMarkUncompleted' } const room_id = medal.room_info.room_id @@ -150,7 +150,7 @@ class DanmuTask extends MedalModule { for (let j = 0; j < remaining; j++) { if (MedalModule.shouldStopForCrossDay()) { this.logger.log('即将或刚刚发生跨天,提早结束本轮发弹幕任务') - return 'stop' + return 'stopAndMarkUncompleted' } const danmuText = this.config.danmuList[danmuIndexRef.value++ % this.config.danmuList.length] @@ -197,8 +197,8 @@ class DanmuTask extends MedalModule { for (let i = 0; i < medals.length; i++) { const action = await this.executeDanmuTask(medals[i], danmuIndexRef) - if (action === 'stop') { - return { stop: true } + if (action === 'stop' || action === 'stopAndMarkUncompleted') { + return { stop: true, markUncompleted: action === 'stopAndMarkUncompleted' } } else if (action === 'requeue') { requeueRoomids.push(medals[i].room_info.room_id) } else if (action === 'markUncompleted') { @@ -238,29 +238,25 @@ class DanmuTask extends MedalModule { danmuIndexRef, ) - if (stop) { + if (markUncompleted) { allCompleted = false - } else { - if (markUncompleted) { - allCompleted = false - } - if (requeueRoomids) { - pendingRoomids.push(...requeueRoomids) - } - + } + if (requeueRoomids) { + pendingRoomids.push(...requeueRoomids) + } + if (!stop) { while (pendingRoomids.length > 0) { const { stop, markUncompleted, requeueRoomids } = await this.runWaitingRound( pendingRoomids, (liveStatus) => liveStatus !== 1, (medal) => this.executeDanmuTask(medal, danmuIndexRef, true), ) - if (stop) { - allCompleted = false - break - } if (markUncompleted) { allCompleted = false } + if (stop) { + break + } pendingRoomids = requeueRoomids! diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts b/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts index 0fc059ec..7265ec37 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts @@ -9,6 +9,13 @@ import type { AfterExecutionAction, BatchExecutionResult, GroupedMedals } from ' class LikeTask extends MedalModule { config = this.medalTasksConfig.like + /** + * 每日点赞次数上限 + * + * 每个账号一天最多进行 5000 次有效点赞(能完成任务的点赞) + */ + private static readonly DAILY_LIKE_LIMIT = 5000 + set status(s: ModuleStatusTypes) { useModuleStore().moduleStatus.DailyTasks.LiveTasks.medalTasks.like = s } @@ -69,7 +76,7 @@ class LikeTask extends MedalModule { ): Promise> { if (MedalModule.shouldStopForCrossDay()) { this.logger.log('即将或刚刚发生跨天,提早结束本轮点赞任务') - return 'stop' + return 'stopAndMarkUncompleted' } const room_id = medal.room_info.room_id @@ -140,11 +147,13 @@ class LikeTask extends MedalModule { for (let j = 0; j < remaining; j++) { if (MedalModule.shouldStopForCrossDay()) { this.logger.log('即将或刚刚发生跨天,提早结束本轮点赞任务') - return 'stop' + return 'stopAndMarkUncompleted' } if (await this.like(medal, times)) { hasSuccessfulLike = true + this.config._todayLikeCount += times + this.config._lastSuccessLikeTime = tsm() } if (j < remaining - 1) { @@ -153,13 +162,24 @@ class LikeTask extends MedalModule { } if (hasSuccessfulLike) { - return (await this.confirmTaskCompletedAfterUpdate( - medal, - 'like', - this.config.useTargetRounds ? target : undefined, - )) - ? null - : 'markUncompleted' + if ( + await this.confirmTaskCompletedAfterUpdate( + medal, + 'like', + this.config.useTargetRounds ? target : undefined, + ) + ) { + if (this.config._todayLikeCount >= LikeTask.DAILY_LIKE_LIMIT) { + this.logger.log( + `今日已点赞 ${this.config._todayLikeCount} 次,达到每日点赞次数上限(${LikeTask.DAILY_LIKE_LIMIT}),跳过剩余点赞任务`, + ) + return 'stop' + } else { + return null + } + } else { + return 'markUncompleted' + } } // 所有点赞尝试均失败,估计是有什么异常状况,跳过 @@ -179,8 +199,8 @@ class LikeTask extends MedalModule { for (let i = 0; i < medals.length; i++) { const action = await this.executeLikeTask(medals[i]) - if (action === 'stop') { - return { stop: true } + if (action === 'stop' || action === 'stopAndMarkUncompleted') { + return { stop: true, markUncompleted: action === 'stopAndMarkUncompleted' } } else if (action === 'requeue') { requeueRoomids.push(medals[i].room_info.room_id) } else if (action === 'markUncompleted') { @@ -199,6 +219,10 @@ class LikeTask extends MedalModule { this.logger.log('点赞模块开始运行') if (!isTimestampToday(this.config._lastCompleteTime)) { + if (!isTimestampToday(this.config._lastSuccessLikeTime, 0, 0)) { + this.config._todayLikeCount = 0 + } + await this.waitForLightTask() if (!(await MedalModule.waitForFansMedals())) { @@ -216,29 +240,25 @@ class LikeTask extends MedalModule { const { stop, markUncompleted, requeueRoomids } = await this.executeLikeTasks(readyMedals) - if (stop) { + if (markUncompleted) { allCompleted = false - } else { - if (markUncompleted) { - allCompleted = false - } - if (requeueRoomids) { - pendingRoomids.push(...requeueRoomids) - } - + } + if (requeueRoomids) { + pendingRoomids.push(...requeueRoomids) + } + if (!stop) { while (pendingRoomids.length > 0) { const { stop, markUncompleted, requeueRoomids } = await this.runWaitingRound( pendingRoomids, (liveStatus) => liveStatus === 1, (medal) => this.executeLikeTask(medal, true), ) - if (stop) { - allCompleted = false - break - } if (markUncompleted) { allCompleted = false } + if (stop) { + break + } pendingRoomids = requeueRoomids! diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/types.d.ts b/src/modules/dailyTasks/liveTasks/medalTasks/types.d.ts index 152638a7..11993dd0 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/types.d.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/types.d.ts @@ -41,12 +41,20 @@ type PreExecuteVerdict = 'pass' | 'fail' | 'error' /** * 直播间任务执行后操作 * - * - `stop`:终止后续直播间任务(也意味着当前任务未完成) - * - `requeue`:把直播间放到等待队列 + * - `stop`:终止后续直播间任务 * - `markUncompleted`:把当前任务(点赞/发弹幕)标记为未完成 + * - `stopAndMarkUncompleted`:终止后续直播间任务并且把当前任务标记为未完成 + * - `requeue`:把直播间放到等待队列 * - `skipSleep`:跳过执行下一个直播间任务之间的等待时间 + * - `null`:无操作 */ -type AfterExecutionAction = 'stop' | 'requeue' | 'markUncompleted' | 'skipSleep' | null +type AfterExecutionAction = + | 'stop' + | 'markUncompleted' + | 'stopAndMarkUncompleted' + | 'requeue' + | 'skipSleep' + | null /** 直播间任务批量执行结果 */ interface BatchExecutionResult { diff --git a/src/types/storage.d.ts b/src/types/storage.d.ts index 3a6ff8df..0219f498 100644 --- a/src/types/storage.d.ts +++ b/src/types/storage.d.ts @@ -35,6 +35,8 @@ interface ModuleConfig { waitUntilLiving: boolean isWhiteList: boolean roomidList: number[] + _lastSuccessLikeTime: number + _todayLikeCount: number _lastCompleteTime: number } danmu: { From b34561ec5cc8be8511c71dd717e187b4fe2dc3e2 Mon Sep 17 00:00:00 2001 From: andywang425 <56548456+andywang425@users.noreply.github.com> Date: Tue, 30 Jun 2026 15:00:09 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=90=9E=20fix:=20=E4=BF=AE=E5=A4=8Drun?= =?UTF-8?q?WaitingRound=E5=9B=A0=E8=B7=A8=E5=A4=A9=E6=8F=90=E6=97=A9?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E6=97=B6=E6=9C=AA=E8=BF=94=E5=9B=9E`markUnco?= =?UTF-8?q?mpleted:=20true`=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts b/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts index 72c0011e..89577719 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/MedalModule.ts @@ -533,7 +533,7 @@ class MedalModule extends BaseModule { for (let i = 0; i < roomids.length; i++) { if (MedalModule.shouldStopForCrossDay()) { this.logger.log('即将或刚刚发生跨天,不再等待剩余直播间,提早结束本轮任务') - return { stop: true } + return { stop: true, markUncompleted: true } } const roomid = roomids[i] From 643eae55ff59d5d13be18b523d2d2102f19f8bb5 Mon Sep 17 00:00:00 2001 From: andywang425 <56548456+andywang425@users.noreply.github.com> Date: Tue, 30 Jun 2026 15:46:42 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=90=B3=20chore:=20Update=20element-pl?= =?UTF-8?q?us=20dark=20css?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/css/element-dark-css-vars.css | 92 ++++++++++++------------ 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/src/assets/css/element-dark-css-vars.css b/src/assets/css/element-dark-css-vars.css index 3d1ed495..5d580bc0 100644 --- a/src/assets/css/element-dark-css-vars.css +++ b/src/assets/css/element-dark-css-vars.css @@ -3,53 +3,54 @@ html[lab-style*='dark'] { color-scheme: dark; + --lightningcss-light: ; + --lightningcss-dark: initial; --el-color-primary: #409eff; - --el-color-primary-light-3: rgb(51 117 185); - --el-color-primary-light-5: rgb(42 89 138); - --el-color-primary-light-7: rgb(33 61 91); - --el-color-primary-light-8: rgb(29 48 67); - --el-color-primary-light-9: rgb(24 34 43); - --el-color-primary-dark-2: rgb(102 177 255); + --el-color-primary-light-3: #3375b9; + --el-color-primary-light-5: #2a598a; + --el-color-primary-light-7: #213d5b; + --el-color-primary-light-8: #1d3043; + --el-color-primary-light-9: #18222b; + --el-color-primary-dark-2: #66b1ff; --el-color-success: #67c23a; - --el-color-success-light-3: rgb(78 142 47); - --el-color-success-light-5: rgb(62 107 39); - --el-color-success-light-7: rgb(45 72 31); - --el-color-success-light-8: rgb(37 55 28); - --el-color-success-light-9: rgb(28 37 24); - --el-color-success-dark-2: rgb(133 206 97); + --el-color-success-light-3: #4e8e2f; + --el-color-success-light-5: #3e6b27; + --el-color-success-light-7: #2d481f; + --el-color-success-light-8: #25371c; + --el-color-success-light-9: #1c2518; + --el-color-success-dark-2: #85ce61; --el-color-warning: #e6a23c; - --el-color-warning-light-3: rgb(167 119 48); - --el-color-warning-light-5: rgb(125 91 40); - --el-color-warning-light-7: rgb(83 63 32); - --el-color-warning-light-8: rgb(62 48 28); - --el-color-warning-light-9: rgb(41 34 24); - --el-color-warning-dark-2: rgb(235 181 99); + --el-color-warning-light-3: #a77730; + --el-color-warning-light-5: #7d5b28; + --el-color-warning-light-7: #533f20; + --el-color-warning-light-8: #3e301c; + --el-color-warning-light-9: #292218; + --el-color-warning-dark-2: #ebb563; --el-color-danger: #f56c6c; - --el-color-danger-light-3: rgb(178 82 82); - --el-color-danger-light-5: rgb(133 64 64); - --el-color-danger-light-7: rgb(88 46 46); - --el-color-danger-light-8: rgb(65 38 38); - --el-color-danger-light-9: rgb(42 29 29); - --el-color-danger-dark-2: rgb(247 137 137); + --el-color-danger-light-3: #b25252; + --el-color-danger-light-5: #854040; + --el-color-danger-light-7: #582e2e; + --el-color-danger-light-8: #412626; + --el-color-danger-light-9: #2a1d1d; + --el-color-danger-dark-2: #f78989; --el-color-error: #f56c6c; - --el-color-error-light-3: rgb(178 82 82); - --el-color-error-light-5: rgb(133 64 64); - --el-color-error-light-7: rgb(88 46 46); - --el-color-error-light-8: rgb(65 38 38); - --el-color-error-light-9: rgb(42 29 29); - --el-color-error-dark-2: rgb(247 137 137); + --el-color-error-light-3: #b25252; + --el-color-error-light-5: #854040; + --el-color-error-light-7: #582e2e; + --el-color-error-light-8: #412626; + --el-color-error-light-9: #2a1d1d; + --el-color-error-dark-2: #f78989; --el-color-info: #909399; - --el-color-info-light-3: rgb(107 109 113); - --el-color-info-light-5: rgb(82 84 87); - --el-color-info-light-7: rgb(57 58 60); - --el-color-info-light-8: rgb(45 45 47); - --el-color-info-light-9: rgb(32 33 33); - --el-color-info-dark-2: rgb(166 169 173); - --el-box-shadow: 0px 12px 32px 4px rgb(0 0 0 / 36%), 0px 8px 20px rgb(0 0 0 / 72%); - --el-box-shadow-light: 0px 0px 12px rgb(0 0 0 / 72%); - --el-box-shadow-lighter: 0px 0px 6px rgb(0 0 0 / 72%); - --el-box-shadow-dark: - 0px 16px 48px 16px rgb(0 0 0 / 72%), 0px 12px 32px #000, 0px 8px 16px -8px #000; + --el-color-info-light-3: #6b6d71; + --el-color-info-light-5: #525457; + --el-color-info-light-7: #393a3c; + --el-color-info-light-8: #2d2d2f; + --el-color-info-light-9: #202121; + --el-color-info-dark-2: #a6a9ad; + --el-box-shadow: 0px 12px 32px 4px #0000005c, 0px 8px 20px #000000b8; + --el-box-shadow-light: 0px 0px 12px #000000b8; + --el-box-shadow-lighter: 0px 0px 6px #000000b8; + --el-box-shadow-dark: 0px 16px 48px 16px #000000b8, 0px 12px 32px #000, 0px 8px 16px -8px #000; --el-bg-color-page: #0a0a0a; --el-bg-color: #141414; --el-bg-color-overlay: #1d1e1f; @@ -70,17 +71,18 @@ html[lab-style*='dark'] { --el-fill-color-light: #262727; --el-fill-color-lighter: #1d1d1d; --el-fill-color-extra-light: #191919; - --el-fill-color-blank: transparent; - --el-mask-color: rgb(0 0 0 / 80%); - --el-mask-color-extra-light: rgb(0 0 0 / 30%); + --el-fill-color-blank: #141414; + --el-mask-color: #000c; + --el-mask-color-extra-light: #0000004d; } html[lab-style*='dark'] .el-button { - --el-button-disabled-text-color: rgb(255 255 255 / 50%); + --el-button-disabled-text-color: #ffffff80; } html[lab-style*='dark'] .el-card { --el-card-bg-color: var(--el-bg-color-overlay); + --el-fill-color-blank: var(--el-card-bg-color); } html[lab-style*='dark'] .el-empty { From e63045c98c3e6a9395cdbdc987cbccd14ac104a7 Mon Sep 17 00:00:00 2001 From: andywang425 <56548456+andywang425@users.noreply.github.com> Date: Wed, 8 Jul 2026 04:02:23 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=F0=9F=90=9E=20fix:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=82=B9=E8=B5=9E=E6=95=B0=E9=87=8F=E4=B8=8A=E9=99=90=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E7=BD=AE=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liveTasks/medalTasks/danmuTask.ts | 8 +++--- .../liveTasks/medalTasks/likeTask.ts | 28 ++++++++----------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts b/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts index 1e12c706..bfd22a13 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/danmuTask.ts @@ -170,13 +170,13 @@ class DanmuTask extends MedalModule { } if (hasSuccessfulDanmu) { - return (await this.confirmTaskCompletedAfterUpdate( + const taskCompleted = await this.confirmTaskCompletedAfterUpdate( medal, 'sendDanmu', this.config.useTargetRounds ? target : undefined, - )) - ? null - : 'markUncompleted' + ) + + return taskCompleted ? null : 'markUncompleted' } // 所有发弹幕尝试均失败,估计是有什么异常状况,跳过 diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts b/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts index 7265ec37..613b1ae5 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/likeTask.ts @@ -162,24 +162,20 @@ class LikeTask extends MedalModule { } if (hasSuccessfulLike) { - if ( - await this.confirmTaskCompletedAfterUpdate( - medal, - 'like', - this.config.useTargetRounds ? target : undefined, + const taskCompleted = await this.confirmTaskCompletedAfterUpdate( + medal, + 'like', + this.config.useTargetRounds ? target : undefined, + ) + + if (this.config._todayLikeCount >= LikeTask.DAILY_LIKE_LIMIT) { + this.logger.log( + `今日已点赞 ${this.config._todayLikeCount} 次,达到每日点赞次数上限(${LikeTask.DAILY_LIKE_LIMIT}),跳过剩余点赞任务`, ) - ) { - if (this.config._todayLikeCount >= LikeTask.DAILY_LIKE_LIMIT) { - this.logger.log( - `今日已点赞 ${this.config._todayLikeCount} 次,达到每日点赞次数上限(${LikeTask.DAILY_LIKE_LIMIT}),跳过剩余点赞任务`, - ) - return 'stop' - } else { - return null - } - } else { - return 'markUncompleted' + return 'stop' } + + return taskCompleted ? null : 'markUncompleted' } // 所有点赞尝试均失败,估计是有什么异常状况,跳过 From 14e9193d7dea8eef35772bdd8c193c967ef9e10b Mon Sep 17 00:00:00 2001 From: andywang425 <56548456+andywang425@users.noreply.github.com> Date: Sat, 11 Jul 2026 15:23:26 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=F0=9F=90=B3=20chore:=20=E7=BB=86=E8=8A=82?= =?UTF-8?q?=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 注释 - 内置说明 - Referer末尾加/ - 删未使用的Request实例 --- src/library/bili-api/api.d.ts | 1 - src/library/bili-api/index.ts | 1 - src/library/help-info/index.ts | 2 +- src/library/request/index.ts | 11 +++++++---- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/library/bili-api/api.d.ts b/src/library/bili-api/api.d.ts index dffe63f0..95115147 100644 --- a/src/library/bili-api/api.d.ts +++ b/src/library/bili-api/api.d.ts @@ -4,7 +4,6 @@ import { Live, LiveTrace, Main } from './response' interface Requests { live: Request liveTrace: Request - passport: Request main: Request raw: Request } diff --git a/src/library/bili-api/index.ts b/src/library/bili-api/index.ts index d1967489..370cc0a7 100644 --- a/src/library/bili-api/index.ts +++ b/src/library/bili-api/index.ts @@ -8,7 +8,6 @@ import _ from 'lodash' const request: Requests = { live: new Request('https://api.live.bilibili.com', 'https://live.bilibili.com'), liveTrace: new Request('https://live-trace.bilibili.com', 'https://live.bilibili.com'), - passport: new Request('https://passport.bilibili.com', 'https://passport.bilibili.com'), main: new Request('https://api.bilibili.com', 'https://www.bilibili.com'), raw: new Request(), } diff --git a/src/library/help-info/index.ts b/src/library/help-info/index.ts index 49970a72..3604cebf 100644 --- a/src/library/help-info/index.ts +++ b/src/library/help-info/index.ts @@ -273,7 +273,7 @@ const helpInfo: HelpInfo = { h('div', '禁用直播流的P2P上传/下载'), h( 'div', - 'B站使用WebRTC技术把许多浏览器点对点(P2P)地连接起来,实现视频流和音频流的传输。这样做是为了减轻B站服务器的压力,但是会占用你一定的上行带宽(大约几百kb每秒)。如果你不想被占用上行带宽,可以开启该功能。若开启后发现观看直播时有明显卡顿,请关闭。', + 'B站使用WebRTC技术把许多浏览器点对点(P2P)地连接起来,实现视频流和音频流的传输。这样做是为了减轻B站服务器的压力,但是会占用你一定的上行带宽(大约几百KB每秒)。如果你不想被占用上行带宽,可以开启该功能。若开启后发现观看直播时有明显卡顿,请关闭。', ), ]), }, diff --git a/src/library/request/index.ts b/src/library/request/index.ts index 1e5590a2..d8610ab4 100644 --- a/src/library/request/index.ts +++ b/src/library/request/index.ts @@ -6,7 +6,9 @@ class Request { /** 请求 URL 的前缀 */ private readonly url_prefix: string /** - * 请求 Header 中 Origin 的值,为了方便同时也是 Referer 的值 + * 请求 Header 中 Origin 的值 + * + * 会在末尾添加 `/` 作为 Referer 的值 */ private readonly origin: string @@ -35,7 +37,7 @@ class Request { responseType: 'json', headers: { Accept: 'application/json, text/plain, */*', - Referer: this.origin, + Referer: this.origin + '/', Origin: this.origin, 'Sec-Fetch-Site': 'same-site', }, @@ -69,7 +71,7 @@ class Request { ): Promise { const headers: Record = { Accept: 'application/json, text/plain, */*', - Referer: this.origin, + Referer: this.origin + '/', Origin: this.origin, 'Sec-Fetch-Site': 'same-site', 'Content-Type': 'application/x-www-form-urlencoded', @@ -78,7 +80,8 @@ class Request { if (_.isNil(data)) { data = '' } else if (data instanceof FormData) { - // 如果要提交表单,删除 Content-Type 让浏览器自动生成 + // data 为 FormData 时以 multipart/form-data 形式提交, + // 删除手动设置的 Content-Type,交由底层 XHR 根据 FormData 自动生成带 boundary 的请求头 delete headers['Content-Type'] } else if (typeof data === 'string') { // data 类型为 string,不做处理 From 3193f346f5def680fdc65d6af2bb4da538c1dcfd Mon Sep 17 00:00:00 2001 From: andywang425 <56548456+andywang425@users.noreply.github.com> Date: Mon, 13 Jul 2026 15:33:25 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=F0=9F=90=B3=20chore:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=89=8D=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e373245..0f45f7b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [7.3.2] - 2026-7-13 + ### 新增 - 直播任务【点赞】新增每日点赞数量上限 5000(因为每天能完成任务的有效点赞数量为 5000 次) diff --git a/package-lock.json b/package-lock.json index 35565f3a..658305da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bilibili-live-tasks-helper", - "version": "7.3.1", + "version": "7.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bilibili-live-tasks-helper", - "version": "7.3.1", + "version": "7.3.2", "dependencies": { "ajax-hook": "^3.0.3", "crypto-js": "^4.2.0", diff --git a/package.json b/package.json index a941017c..b117a8c5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bilibili-live-tasks-helper", "private": true, - "version": "7.3.1", + "version": "7.3.2", "type": "module", "scripts": { "dev": "vite",