From 64be2dd562c49c33e09891e376ad82eaedc0c9bd Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:08:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E5=BE=AE=E4=BF=A1=204?= =?UTF-8?q?.0.5+=20=E6=96=B0=E6=95=B0=E6=8D=AE=E7=9B=AE=E5=BD=95=E7=BB=93?= =?UTF-8?q?=E6=9E=84=20(Application=20Support/com.tencent.xinWeChat/2.0b4.?= =?UTF-8?q?0.x)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dbPathService.autoDetect: 自动枚举版本目录(如 2.0b4.0.9),优先检测新路径 - dbPathService.getDefaultPath: 同步返回新版本路径 - keyServiceMac.resolveXwechatRootFromPath: 兼容新路径标记 - keyServiceMac.getKvcommCandidates: 补充新路径下的 kvcomm 推导 Fixes #551 --- electron/services/dbPathService.ts | 50 +++++++++++++++++++++++------- electron/services/keyServiceMac.ts | 21 +++++++++++-- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/electron/services/dbPathService.ts b/electron/services/dbPathService.ts index b6fb973..592c9f9 100644 --- a/electron/services/dbPathService.ts +++ b/electron/services/dbPathService.ts @@ -93,27 +93,39 @@ export class DbPathService { const possiblePaths: string[] = [] const home = homedir() - // macOS 微信路径(固定) if (process.platform === 'darwin') { + // macOS 微信 4.0.5+ 新路径(优先检测) + const appSupportBase = join(home, 'Library', 'Containers', 'com.tencent.xinWeChat', 'Data', 'Library', 'Application Support', 'com.tencent.xinWeChat') + if (existsSync(appSupportBase)) { + try { + const entries = readdirSync(appSupportBase) + for (const entry of entries) { + // 匹配形如 2.0b4.0.9 的版本目录 + if (/^\d+\.\d+b\d+\.\d+/.test(entry) || /^\d+\.\d+\.\d+/.test(entry)) { + possiblePaths.push(join(appSupportBase, entry)) + } + } + } catch { } + } + // macOS 旧路径兜底 possiblePaths.push(join(home, 'Library', 'Containers', 'com.tencent.xinWeChat', 'Data', 'Documents', 'xwechat_files')) } else { // Windows 微信4.x 数据目录 possiblePaths.push(join(home, 'Documents', 'xwechat_files')) } - for (const path of possiblePaths) { - if (existsSync(path)) { - const rootName = path.split(/[/\\]/).pop()?.toLowerCase() - if (rootName !== 'xwechat_files' && rootName !== 'wechat files') { - continue - } + if (!existsSync(path)) continue - // 检查是否有有效的账号目录 - const accounts = this.findAccountDirs(path) - if (accounts.length > 0) { - return { success: true, path } - } + // 检查是否有有效的账号目录,或本身就是账号目录 + const accounts = this.findAccountDirs(path) + if (accounts.length > 0) { + return { success: true, path } + } + + // 如果该目录本身就是账号目录(直接包含 db_storage 等) + if (this.isAccountDir(path)) { + return { success: true, path } } } @@ -295,6 +307,20 @@ export class DbPathService { getDefaultPath(): string { const home = homedir() if (process.platform === 'darwin') { + // 优先返回 4.0.5+ 新路径 + const appSupportBase = join(home, 'Library', 'Containers', 'com.tencent.xinWeChat', 'Data', 'Library', 'Application Support', 'com.tencent.xinWeChat') + if (existsSync(appSupportBase)) { + try { + const entries = readdirSync(appSupportBase) + for (const entry of entries) { + if (/^\d+\.\d+b\d+\.\d+/.test(entry) || /^\d+\.\d+\.\d+/.test(entry)) { + const candidate = join(appSupportBase, entry) + if (existsSync(candidate)) return candidate + } + } + } catch { } + } + // 旧版本路径兜底 return join(home, 'Library', 'Containers', 'com.tencent.xinWeChat', 'Data', 'Documents', 'xwechat_files') } return join(home, 'Documents', 'xwechat_files') diff --git a/electron/services/keyServiceMac.ts b/electron/services/keyServiceMac.ts index 79f9cdc..647a28e 100644 --- a/electron/services/keyServiceMac.ts +++ b/electron/services/keyServiceMac.ts @@ -935,10 +935,17 @@ export class KeyServiceMac { private resolveXwechatRootFromPath(accountPath?: string): string | null { const normalized = String(accountPath || '').replace(/\\/g, '/').replace(/\/+$/, '') if (!normalized) return null + + // 旧路径:xwechat_files const marker = '/xwechat_files' const markerIdx = normalized.indexOf(marker) - if (markerIdx < 0) return null - return normalized.slice(0, markerIdx + marker.length) + if (markerIdx >= 0) return normalized.slice(0, markerIdx + marker.length) + + // 新路径(微信 4.0.5+):Application Support/com.tencent.xinWeChat/2.0b4.0.9 + const newMarkerMatch = normalized.match(/^(.*\/com\.tencent\.xinWeChat\/(?:\d+\.\d+b\d+\.\d+|\d+\.\d+\.\d+))(\/|$)/) + if (newMarkerMatch) return newMarkerMatch[1] + + return null } private pushAccountIdCandidates(candidates: string[], value?: string): void { @@ -1096,6 +1103,16 @@ export class KeyServiceMac { candidates.add(`${base}/app_data/net/kvcomm`) } + // 微信 4.0.5+ 新路径推导:版本目录同级的 net/kvcomm + const newMarkerMatch = normalized.match(/^(.*\/com\.tencent\.xinWeChat\/(?:\d+\.\d+b\d+\.\d+|\d+\.\d+\.\d+))/) + if (newMarkerMatch) { + const versionBase = newMarkerMatch[1] + candidates.add(`${versionBase}/net/kvcomm`) + // 上级目录也尝试 + const parentBase = versionBase.replace(/\/[^\/]+$/, '') + candidates.add(`${parentBase}/net/kvcomm`) + } + let cursor = accountPath for (let i = 0; i < 6; i++) { candidates.add(join(cursor, 'net', 'kvcomm'))