From 388923257b44b382933a6b984cbc82105d6925b7 Mon Sep 17 00:00:00 2001 From: QingXiao <143726276+5xiao0qing5@users.noreply.github.com> Date: Fri, 23 Jan 2026 23:53:33 +0800 Subject: [PATCH] Handle more message types in exports --- electron/services/exportService.ts | 61 ++++++++++++++++++++++++++++++ src/pages/SettingsPage.tsx | 55 --------------------------- 2 files changed, 61 insertions(+), 55 deletions(-) diff --git a/electron/services/exportService.ts b/electron/services/exportService.ts index 16c52ab..37c467d 100644 --- a/electron/services/exportService.ts +++ b/electron/services/exportService.ts @@ -321,6 +321,33 @@ class ExportService { } return '[其他消息]' } + if (localType === 42) { + const normalized = this.normalizeAppMessageContent(safeContent) + const nickname = + this.extractXmlValue(normalized, 'nickname') || + this.extractXmlValue(normalized, 'displayname') || + this.extractXmlValue(normalized, 'name') + return nickname ? `[名片]${nickname}` : '[名片]' + } + if (localType === 43) { + const normalized = this.normalizeAppMessageContent(safeContent) + const lengthValue = + this.extractXmlValue(normalized, 'playlength') || + this.extractXmlValue(normalized, 'playLength') || + this.extractXmlValue(normalized, 'length') || + this.extractXmlValue(normalized, 'duration') + const seconds = lengthValue ? this.parseDurationSeconds(lengthValue) : null + return seconds ? `[视频]${seconds}s` : '[视频]' + } + if (localType === 48) { + const normalized = this.normalizeAppMessageContent(safeContent) + const location = + this.extractXmlValue(normalized, 'label') || + this.extractXmlValue(normalized, 'poiname') || + this.extractXmlValue(normalized, 'poiName') || + this.extractXmlValue(normalized, 'name') + return location ? `[定位]${location}` : '[定位]' + } if (localType === 10000 || localType === 266287972401) { return this.cleanSystemMessage(safeContent) } @@ -331,10 +358,31 @@ class ExportService { const typeMatch = /(\d+)<\/type>/i.exec(normalized) const subType = typeMatch ? parseInt(typeMatch[1], 10) : 0 const title = this.extractXmlValue(normalized, 'title') || this.extractXmlValue(normalized, 'appname') + if (subType === 3 || normalized.includes('= 1000) return Math.round(numeric / 1000) + return Math.round(numeric) + } + + private extractAmountFromText(text: string): string | null { + if (!text) return null + const match = /([¥¥]\s*\d+(?:\.\d+)?|\d+(?:\.\d+)?)/.exec(text) + return match ? match[1].replace(/\s+/g, '') : null + } + private stripSenderPrefix(content: string): string { return content.replace(/^[\s]*([a-zA-Z0-9_-]+):(?!\/\/)/, '') } diff --git a/src/pages/SettingsPage.tsx b/src/pages/SettingsPage.tsx index 93c7484..18b2979 100644 --- a/src/pages/SettingsPage.tsx +++ b/src/pages/SettingsPage.tsx @@ -61,7 +61,6 @@ function SettingsPage() { const [exportDefaultMedia, setExportDefaultMedia] = useState(false) const [exportDefaultVoiceAsText, setExportDefaultVoiceAsText] = useState(true) const [exportDefaultExcelCompactColumns, setExportDefaultExcelCompactColumns] = useState(true) - const [exportDefaultTxtColumns, setExportDefaultTxtColumns] = useState(['index', 'time', 'senderRole', 'messageType', 'content']) const [isLoading, setIsLoadingState] = useState(false) const [isTesting, setIsTesting] = useState(false) @@ -142,8 +141,6 @@ function SettingsPage() { const savedExportDefaultMedia = await configService.getExportDefaultMedia() const savedExportDefaultVoiceAsText = await configService.getExportDefaultVoiceAsText() const savedExportDefaultExcelCompactColumns = await configService.getExportDefaultExcelCompactColumns() - const savedExportDefaultTxtColumns = await configService.getExportDefaultTxtColumns() - const defaultTxtColumns = ['index', 'time', 'senderRole', 'messageType', 'content'] if (savedKey) setDecryptKey(savedKey) if (savedPath) setDbPath(savedPath) @@ -161,11 +158,6 @@ function SettingsPage() { setExportDefaultMedia(savedExportDefaultMedia ?? false) setExportDefaultVoiceAsText(savedExportDefaultVoiceAsText ?? true) setExportDefaultExcelCompactColumns(savedExportDefaultExcelCompactColumns ?? true) - setExportDefaultTxtColumns( - savedExportDefaultTxtColumns && savedExportDefaultTxtColumns.length > 0 - ? savedExportDefaultTxtColumns - : defaultTxtColumns - ) // 如果语言列表为空,保存默认值 if (!savedTranscribeLanguages || savedTranscribeLanguages.length === 0) { @@ -174,9 +166,6 @@ function SettingsPage() { await configService.setTranscribeLanguages(defaultLanguages) } - if (!savedExportDefaultTxtColumns || savedExportDefaultTxtColumns.length === 0) { - await configService.setExportDefaultTxtColumns(defaultTxtColumns) - } if (savedWhisperModelDir) setWhisperModelDir(savedWhisperModelDir) } catch (e) { @@ -911,16 +900,6 @@ function SettingsPage() { { value: 'compact', label: '精简列', desc: '序号、时间、发送者身份、消息类型、内容' }, { value: 'full', label: '完整列', desc: '含发送者昵称/微信ID/备注' } ] - const exportTxtColumnOptions = [ - { value: 'index', label: '序号' }, - { value: 'time', label: '时间' }, - { value: 'senderRole', label: '发送者身份' }, - { value: 'messageType', label: '消息类型' }, - { value: 'content', label: '内容' }, - { value: 'senderNickname', label: '发送者昵称' }, - { value: 'senderWxid', label: '发送者微信ID' }, - { value: 'senderRemark', label: '发送者备注' } - ] const getOptionLabel = (options: { value: string; label: string }[], value: string) => { return options.find((option) => option.value === value)?.label ?? value @@ -1097,40 +1076,6 @@ function SettingsPage() { -
- - 默认与 Excel 精简列一致,可多选调整输出字段 -
- {exportTxtColumnOptions.map((column) => { - const checked = exportDefaultTxtColumns.includes(column.value) - return ( - - ) - })} -
-
) }