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