From e7d0f6d6dae02874ec95cb853af4b72fec7e9536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 19 Jan 2025 15:55:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E5=90=88=E9=80=82=E7=9A=84?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=8Erkey=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/file.ts | 2 +- src/core/helper/rkey.ts | 26 +++++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 926ba64a..dd0a4766 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -462,7 +462,7 @@ export class NTQQFileApi { rkeyData.private_rkey = tempRkeyData.private_rkey; rkeyData.online_rkey = tempRkeyData.expired_time > Date.now() / 1000; } catch (e) { - this.context.logger.logError('获取rkey失败 Fallback Old Mode', e); + this.context.logger.logDebug('获取rkey失败 Fallback Old Mode', e); } } diff --git a/src/core/helper/rkey.ts b/src/core/helper/rkey.ts index 4b952b44..25e6e8e2 100644 --- a/src/core/helper/rkey.ts +++ b/src/core/helper/rkey.ts @@ -15,6 +15,10 @@ export class RkeyManager { private_rkey: '', expired_time: 0, }; + private failureCount: number = 0; + private lastFailureTimestamp: number = 0; + private readonly FAILURE_LIMIT: number = 8; + private readonly ONE_DAY: number = 24 * 60 * 60 * 1000; constructor(serverUrl: string[], logger: LogWrapper) { this.logger = logger; @@ -22,11 +26,21 @@ export class RkeyManager { } async getRkey() { + const now = new Date().getTime(); + if (now - this.lastFailureTimestamp > this.ONE_DAY) { + this.failureCount = 0; // 重置失败计数器 + } + + if (this.failureCount >= this.FAILURE_LIMIT) { + this.logger.logError(`[Rkey] 服务存在异常, 图片使用FallBack机制`); + throw new Error('获取rkey失败次数过多,请稍后再试'); + } + if (this.isExpired()) { try { await this.refreshRkey(); } catch (e) { - throw new Error(`获取rkey失败: ${e}`);//外抛 + throw new Error(`${e}`);//外抛 } } return this.rkeyData; @@ -34,7 +48,6 @@ export class RkeyManager { isExpired(): boolean { const now = new Date().getTime() / 1000; - // console.log(`now: ${now}, expired_time: ${this.rkeyData.expired_time}`); return now > this.rkeyData.expired_time; } @@ -48,14 +61,17 @@ export class RkeyManager { private_rkey: temp.private_rkey.slice(6), expired_time: temp.expired_time }; + this.failureCount = 0; + return; } catch (e) { - this.logger.logError(`[Rkey] Get Rkey ${url} Error `, e); + this.logger.logError(`[Rkey] 异常服务 ${url} 异常 / `, e); + this.failureCount++; + this.lastFailureTimestamp = new Date().getTime(); //是否为最后一个url if (url === this.serverUrl[this.serverUrl.length - 1]) { throw new Error(`获取rkey失败: ${e}`);//外抛 } } } - } -} +} \ No newline at end of file