From a7ee21bfd8789dc82aed1b7548a26e754d4bd700 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: Tue, 4 Feb 2025 14:34:55 +0800 Subject: [PATCH] fix: #757 --- napcat.webui/src/types/onebot/event.ts | 2 +- src/core/apis/file.ts | 47 +++++++++++++------ src/onebot/api/group.ts | 4 +- src/onebot/api/msg.ts | 5 +- .../notice/OB11GroupUploadNoticeEvent.ts | 1 - 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/napcat.webui/src/types/onebot/event.ts b/napcat.webui/src/types/onebot/event.ts index dff7d4b9..5b6ac5c4 100644 --- a/napcat.webui/src/types/onebot/event.ts +++ b/napcat.webui/src/types/onebot/event.ts @@ -195,7 +195,7 @@ export interface OneBot11GroupUpload extends NoticeBase { name: string /** 文件大小(字节数) */ size: number - /** busid(目前不清楚有什么作用) */ + /** busid 无作用 */ busid: number } } diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index bca3dbd8..4909316c 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -34,6 +34,8 @@ export class NTQQFileApi { core: NapCatCore; rkeyManager: RkeyManager; packetRkey: Array<{ rkey: string; time: number; type: number; ttl: bigint }> | undefined; + private fetchRkeyFailures: number = 0; + private readonly MAX_RKEY_FAILURES: number = 8; constructor(context: InstanceContext, core: NapCatCore) { this.context = context; @@ -41,10 +43,26 @@ export class NTQQFileApi { this.rkeyManager = new RkeyManager([ 'https://rkey.napneko.icu/rkeys' ], - this.context.logger + this.context.logger ); } + private async fetchRkeyWithRetry() { + if (this.fetchRkeyFailures >= this.MAX_RKEY_FAILURES) { + throw new Error('Native.FetchRkey 已被禁用'); + } + try { + let ret = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); + this.fetchRkeyFailures = 0; // Reset failures on success + return ret; + } catch (error) { + this.fetchRkeyFailures++; + this.context.logger.logError('FetchRkey 失败', (error as Error).message); + throw error; + } + } + + async copyFile(filePath: string, destPath: string) { await this.core.util.copyFile(filePath, destPath); } @@ -182,7 +200,6 @@ export class NTQQFileApi { } } context.deleteAfterSentFiles.push(thumbPath); - const thumbSize = (await fsPromises.stat(thumbPath)).size; const thumbMd5 = await calculateFileMD5(thumbPath); context.deleteAfterSentFiles.push(thumbPath); @@ -283,18 +300,18 @@ export class NTQQFileApi { element.elementType === ElementType.FILE ) { switch (element.elementType) { - case ElementType.PIC: + case ElementType.PIC: element.picElement!.sourcePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.VIDEO: + break; + case ElementType.VIDEO: element.videoElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.PTT: + break; + case ElementType.PTT: element.pttElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; - case ElementType.FILE: + break; + case ElementType.FILE: element.fileElement!.filePath = elementResults?.[elementIndex] ?? ''; - break; + break; } elementIndex++; } @@ -421,7 +438,7 @@ export class NTQQFileApi { const rkey_expired_private = !this.packetRkey || this.packetRkey[0].time + Number(this.packetRkey[0].ttl) < Date.now() / 1000; const rkey_expired_group = !this.packetRkey || this.packetRkey[0].time + Number(this.packetRkey[0].ttl) < Date.now() / 1000; if (rkey_expired_private || rkey_expired_group) { - this.packetRkey = await this.core.apis.PacketApi.pkt.operation.FetchRkey(); + this.packetRkey = await this.fetchRkeyWithRetry(); } if (this.packetRkey && this.packetRkey.length > 0) { rkeyData.group_rkey = this.packetRkey[1]?.rkey.slice(6) ?? ''; @@ -430,7 +447,7 @@ export class NTQQFileApi { } } } catch (error: unknown) { - this.context.logger.logError('获取rkey失败', (error as Error).message); + this.context.logger.logDebug('获取native.rkey失败', (error as Error).message); } if (!rkeyData.online_rkey) { @@ -439,11 +456,11 @@ export class NTQQFileApi { rkeyData.group_rkey = tempRkeyData.group_rkey; rkeyData.private_rkey = tempRkeyData.private_rkey; rkeyData.online_rkey = tempRkeyData.expired_time > Date.now() / 1000; - } catch (e) { - this.context.logger.logDebug('获取rkey失败 Fallback Old Mode', e); + } catch (error: unknown) { + this.context.logger.logDebug('获取remote.rkey失败', (error as Error).message); } } - + // 进行 fallback.rkey 模式 return rkeyData; } diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 1051856c..0018e05f 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -22,7 +22,6 @@ import { OB11GroupEssenceEvent } from '@/onebot/event/notice/OB11GroupEssenceEve import { OB11GroupTitleEvent } from '@/onebot/event/notice/OB11GroupTitleEvent'; import { OB11GroupUploadNoticeEvent } from '../event/notice/OB11GroupUploadNoticeEvent'; import { OB11GroupNameEvent } from '../event/notice/OB11GroupNameEvent'; -import { pathToFileURL } from 'node:url'; import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { OB11GroupIncreaseEvent } from '../event/notice/OB11GroupIncreaseEvent'; @@ -202,8 +201,7 @@ export class OneBotGroupApi { id: FileNapCatOneBotUUID.encode({ chatType: ChatType.KCHATTYPEGROUP, peerUid: msg.peerUid, - }, msg.msgId, elementWrapper.elementId, elementWrapper?.fileElement?.fileUuid, element.fileName), - url: pathToFileURL(element.filePath).href, + }, msg.msgId, elementWrapper.elementId, elementWrapper?.fileElement?.fileUuid, element.fileMd5 ?? element.fileUuid), name: element.fileName, size: parseInt(element.fileSize), busid: element.fileBizId ?? 0, diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 8213c2a7..ffc3c3d1 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -1,6 +1,5 @@ import { FileNapCatOneBotUUID } from '@/common/file-uuid'; import { MessageUnique } from '@/common/message-unique'; -import { pathToFileURL } from 'node:url'; import { NTMsgAtType, ChatType, @@ -146,7 +145,6 @@ export class OneBotMsgApi { data: { file: file, path: element.filePath, - url: pathToFileURL(element.filePath).href, file_id: file, file_size: element.fileSize, }, @@ -334,7 +332,7 @@ export class OneBotMsgApi { data: { file: fileCode, path: videoDownUrl, - url: videoDownUrl ?? pathToFileURL(element.filePath).href, + url: videoDownUrl, file_size: element.fileSize, }, }; @@ -352,7 +350,6 @@ export class OneBotMsgApi { data: { file: fileCode, path: element.filePath, - url: pathToFileURL(element.filePath).href, file_size: element.fileSize, }, }; diff --git a/src/onebot/event/notice/OB11GroupUploadNoticeEvent.ts b/src/onebot/event/notice/OB11GroupUploadNoticeEvent.ts index 524cc483..ba433292 100644 --- a/src/onebot/event/notice/OB11GroupUploadNoticeEvent.ts +++ b/src/onebot/event/notice/OB11GroupUploadNoticeEvent.ts @@ -6,7 +6,6 @@ export interface GroupUploadFile { name: string, size: number, busid: number, - url:string; } export class OB11GroupUploadNoticeEvent extends OB11GroupNoticeEvent {