diff --git a/4wm.jpg b/4wm.jpg new file mode 100644 index 0000000..ccfa3a1 Binary files /dev/null and b/4wm.jpg differ diff --git a/README.md b/README.md index 02185fb..cbf04cf 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,10 @@ WeFlow 是一个**完全本地**的微信**实时**聊天记录查看、分析
-
+
+
-
一群满了加二群
+扫到哪个算哪个
## 主要功能 diff --git a/electron/main.ts b/electron/main.ts index 58bc29f..8e45fb8 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -19,6 +19,7 @@ import { KeyService } from './services/keyService' import { voiceTranscribeService } from './services/voiceTranscribeService' import { videoService } from './services/videoService' import { snsService } from './services/snsService' +import { contactExportService } from './services/contactExportService' // 配置自动更新 @@ -137,6 +138,28 @@ function createWindow(options: { autoShow?: boolean } = {}) { win.loadFile(join(__dirname, '../dist/index.html')) } + // 拦截请求,修改 Referer 和 User-Agent 以通过微信 CDN 鉴权 + session.defaultSession.webRequest.onBeforeSendHeaders( + { + urls: [ + '*://*.qpic.cn/*', + '*://*.qlogo.cn/*', + '*://*.wechat.com/*', + '*://*.weixin.qq.com/*' + ] + }, + (details, callback) => { + details.requestHeaders['User-Agent'] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090719) XWEB/8351" + details.requestHeaders['Accept'] = "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8" + details.requestHeaders['Accept-Encoding'] = "gzip, deflate, br" + details.requestHeaders['Accept-Language'] = "zh-CN,zh;q=0.9" + details.requestHeaders['Referer'] = "https://servicewechat.com/" + details.requestHeaders['Connection'] = "keep-alive" + details.requestHeaders['Range'] = "bytes=0-" + callback({ cancel: false, requestHeaders: details.requestHeaders }) + } + ) + return win } @@ -626,11 +649,15 @@ function registerIpcHandlers() { }) ipcMain.handle('chat:getContact', async (_, username: string) => { - return chatService.getContact(username) + return await chatService.getContact(username) }) ipcMain.handle('chat:getContactAvatar', async (_, username: string) => { - return chatService.getContactAvatar(username) + return await chatService.getContactAvatar(username) + }) + + ipcMain.handle('chat:getContacts', async () => { + return await chatService.getContacts() }) ipcMain.handle('chat:getCachedMessages', async (_, sessionId: string) => { @@ -719,6 +746,10 @@ function registerIpcHandlers() { return exportService.exportSessionToChatLab(sessionId, outputPath, options) }) + ipcMain.handle('export:exportContacts', async (_, outputDir: string, options: any) => { + return contactExportService.exportContacts(outputDir, options) + }) + // 数据分析相关 ipcMain.handle('analytics:getOverallStatistics', async (_, force?: boolean) => { return analyticsService.getOverallStatistics(force) diff --git a/electron/preload.ts b/electron/preload.ts index cf0352a..54846fb 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -120,7 +120,8 @@ contextBridge.exposeInMainWorld('electronAPI', { return () => ipcRenderer.removeListener('chat:voiceTranscriptPartial', listener) }, execQuery: (kind: string, path: string | null, sql: string) => - ipcRenderer.invoke('chat:execQuery', kind, path, sql) + ipcRenderer.invoke('chat:execQuery', kind, path, sql), + getContacts: () => ipcRenderer.invoke('chat:getContacts') }, @@ -194,6 +195,8 @@ contextBridge.exposeInMainWorld('electronAPI', { ipcRenderer.invoke('export:exportSessions', sessionIds, outputDir, options), exportSession: (sessionId: string, outputPath: string, options: any) => ipcRenderer.invoke('export:exportSession', sessionId, outputPath, options), + exportContacts: (outputDir: string, options: any) => + ipcRenderer.invoke('export:exportContacts', outputDir, options), onProgress: (callback: (payload: { current: number; total: number; currentSession: string; phase: string }) => void) => { ipcRenderer.on('export:progress', (_, payload) => callback(payload)) return () => ipcRenderer.removeAllListeners('export:progress') diff --git a/electron/services/chatService.ts b/electron/services/chatService.ts index ccc7a28..e0effd1 100644 --- a/electron/services/chatService.ts +++ b/electron/services/chatService.ts @@ -67,6 +67,15 @@ export interface Contact { nickName: string } +export interface ContactInfo { + username: string + displayName: string + remark?: string + nickname?: string + avatarUrl?: string + type: 'friend' | 'group' | 'official' | 'other' +} + // 表情包缓存 const emojiCache: Map