From 7bb5b4f8348061f4637322af6836253cd5a33ab0 Mon Sep 17 00:00:00 2001 From: xuncha <1658671838@qq.com> Date: Sat, 25 Apr 2026 14:11:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dchatlab=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=90=BA=E5=B8=A6wxid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/httpService.ts | 10 ++++++++-- electron/services/messagePushService.ts | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/electron/services/httpService.ts b/electron/services/httpService.ts index 863ed80..5715486 100644 --- a/electron/services/httpService.ts +++ b/electron/services/httpService.ts @@ -2045,6 +2045,12 @@ class HttpService { * 获取消息内容 */ private getMessageContent(msg: Message): string | null { + const normalizeTextContent = (value: string | null | undefined): string | null => { + const text = String(value || '') + if (!text) return null + return text.replace(/^[\s]*([a-zA-Z0-9_@-]+):(?!\/\/)(?:\s*(?:\r?\n|)\s*|\s*)/i, '').trim() + } + if (msg.localType === 49) { return this.getType49Content(msg) } @@ -2057,7 +2063,7 @@ class HttpService { // 根据类型返回占位符 switch (msg.localType) { case 1: - return msg.rawContent || null + return normalizeTextContent(msg.parsedContent || msg.rawContent) case 3: return '[图片]' case 34: @@ -2073,7 +2079,7 @@ class HttpService { case 49: return this.getType49Content(msg) default: - return msg.rawContent || null + return normalizeTextContent(msg.parsedContent || msg.rawContent) || null } } diff --git a/electron/services/messagePushService.ts b/electron/services/messagePushService.ts index cacdcf4..8a8c888 100644 --- a/electron/services/messagePushService.ts +++ b/electron/services/messagePushService.ts @@ -1325,13 +1325,19 @@ class MessagePushService { } private getMessageDisplayContent(message: Message): string | null { + const normalizeTextContent = (value: string | null | undefined): string | null => { + const text = String(value || '') + if (!text) return null + return text.replace(/^[\s]*([a-zA-Z0-9_@-]+):(?!\/\/)(?:\s*(?:\r?\n|)\s*|\s*)/i, '').trim() + } + const cleanOfficialPrefix = (value: string | null): string | null => { if (!value) return value return value.replace(/^\s*\[视频号\]\s*/u, '').trim() || value } switch (Number(message.localType || 0)) { case 1: - return cleanOfficialPrefix(message.rawContent || null) + return cleanOfficialPrefix(normalizeTextContent(message.parsedContent || message.rawContent)) case 3: return '[图片]' case 34: @@ -1347,7 +1353,7 @@ class MessagePushService { case 49: return cleanOfficialPrefix(message.linkTitle || message.fileName || '[消息]') default: - return cleanOfficialPrefix(message.parsedContent || message.rawContent || null) + return cleanOfficialPrefix(normalizeTextContent(message.parsedContent || message.rawContent) || null) } } From 2c01951791cfa85dc0836b71ef49ae57670ae6c2 Mon Sep 17 00:00:00 2001 From: xuncha <1658671838@qq.com> Date: Sat, 25 Apr 2026 14:17:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?chatlab=E4=BC=9A=E8=AF=9D=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/httpService.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/electron/services/httpService.ts b/electron/services/httpService.ts index 5715486..a2b5c72 100644 --- a/electron/services/httpService.ts +++ b/electron/services/httpService.ts @@ -26,7 +26,7 @@ interface ChatLabHeader { interface ChatLabMeta { name: string platform: string - type: 'group' | 'private' + type: ApiSessionType groupId?: string groupAvatar?: string ownerId?: string @@ -68,6 +68,7 @@ interface ApiMediaOptions { } type MediaKind = 'image' | 'voice' | 'video' | 'emoji' +type ApiSessionType = 'group' | 'private' | 'channel' | 'other' interface ApiExportedMedia { kind: MediaKind @@ -781,6 +782,17 @@ class HttpService { } } + private getApiSessionType(username: string): ApiSessionType { + const normalized = String(username || '').trim() + const lowered = normalized.toLowerCase() + if (!normalized) return 'other' + if (lowered.endsWith('@chatroom')) return 'group' + if (lowered.startsWith('gh_')) return 'channel' + if (lowered.includes('@openim')) return 'channel' + if (lowered.startsWith('weixin') && lowered !== 'weixin') return 'channel' + return 'private' + } + private async handleMessages(url: URL, res: http.ServerResponse): Promise { const talker = (url.searchParams.get('talker') || '').trim() const limit = this.parseIntParam(url.searchParams.get('limit'), 100, 1, 10000) @@ -910,7 +922,7 @@ class HttpService { id: s.username, name: s.displayName || s.username, platform: 'wechat', - type: s.username.endsWith('@chatroom') ? 'group' : 'private', + type: this.getApiSessionType(s.username), messageCount: s.messageCountHint || undefined, lastMessageAt: s.lastTimestamp })) @@ -925,6 +937,7 @@ class HttpService { username: s.username, displayName: s.displayName, type: s.type, + sessionType: this.getApiSessionType(s.username), lastTimestamp: s.lastTimestamp, unreadCount: s.unreadCount })) @@ -1882,7 +1895,7 @@ class HttpService { meta: { name: talkerName, platform: 'wechat', - type: isGroup ? 'group' : 'private', + type: this.getApiSessionType(talkerId), groupId: isGroup ? talkerId : undefined, groupAvatar: isGroup ? sessionAvatarInfo?.avatarUrl : undefined, ownerId: myWxid || undefined