weflow-cli 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/bin/weflow-cli-electron.cjs +59 -0
  4. package/bin/weflow-cli.ts +2311 -0
  5. package/cli.cjs +3 -0
  6. package/dist/bin/weflow-cli.d.ts +3 -0
  7. package/dist/bin/weflow-cli.d.ts.map +1 -0
  8. package/dist/bin/weflow-cli.js +2270 -0
  9. package/dist/bin/weflow-cli.js.map +1 -0
  10. package/dist/mcp-server/index.d.ts +3 -0
  11. package/dist/mcp-server/index.d.ts.map +1 -0
  12. package/dist/mcp-server/index.js +690 -0
  13. package/dist/mcp-server/index.js.map +1 -0
  14. package/dist/src/core/dbPathService.d.ts +40 -0
  15. package/dist/src/core/dbPathService.d.ts.map +1 -0
  16. package/dist/src/core/dbPathService.js +324 -0
  17. package/dist/src/core/dbPathService.js.map +1 -0
  18. package/dist/src/core/keyService.d.ts +59 -0
  19. package/dist/src/core/keyService.d.ts.map +1 -0
  20. package/dist/src/core/keyService.js +368 -0
  21. package/dist/src/core/keyService.js.map +1 -0
  22. package/dist/src/core/ntCore.d.ts +62 -0
  23. package/dist/src/core/ntCore.d.ts.map +1 -0
  24. package/dist/src/core/ntCore.js +191 -0
  25. package/dist/src/core/ntCore.js.map +1 -0
  26. package/dist/src/core/sqlcipherCore.d.ts +119 -0
  27. package/dist/src/core/sqlcipherCore.d.ts.map +1 -0
  28. package/dist/src/core/sqlcipherCore.js +693 -0
  29. package/dist/src/core/sqlcipherCore.js.map +1 -0
  30. package/dist/src/core/wcdbCore.d.ts +738 -0
  31. package/dist/src/core/wcdbCore.d.ts.map +1 -0
  32. package/dist/src/core/wcdbCore.js +4545 -0
  33. package/dist/src/core/wcdbCore.js.map +1 -0
  34. package/dist/src/core/wechatClient.d.ts +23 -0
  35. package/dist/src/core/wechatClient.d.ts.map +1 -0
  36. package/dist/src/core/wechatClient.js +166 -0
  37. package/dist/src/core/wechatClient.js.map +1 -0
  38. package/dist/src/services/chatService.d.ts +25 -0
  39. package/dist/src/services/chatService.d.ts.map +1 -0
  40. package/dist/src/services/chatService.js +291 -0
  41. package/dist/src/services/chatService.js.map +1 -0
  42. package/dist/src/services/configService.d.ts +43 -0
  43. package/dist/src/services/configService.d.ts.map +1 -0
  44. package/dist/src/services/configService.js +156 -0
  45. package/dist/src/services/configService.js.map +1 -0
  46. package/dist/src/services/exportService.d.ts +30 -0
  47. package/dist/src/services/exportService.d.ts.map +1 -0
  48. package/dist/src/services/exportService.js +273 -0
  49. package/dist/src/services/exportService.js.map +1 -0
  50. package/dist/src/services/wechat-formatter.d.ts +69 -0
  51. package/dist/src/services/wechat-formatter.d.ts.map +1 -0
  52. package/dist/src/services/wechat-formatter.js +248 -0
  53. package/dist/src/services/wechat-formatter.js.map +1 -0
  54. package/dist/src/services/wechatMessageService.d.ts +28 -0
  55. package/dist/src/services/wechatMessageService.d.ts.map +1 -0
  56. package/dist/src/services/wechatMessageService.js +341 -0
  57. package/dist/src/services/wechatMessageService.js.map +1 -0
  58. package/dist/src/services/wereadService.d.ts +206 -0
  59. package/dist/src/services/wereadService.d.ts.map +1 -0
  60. package/dist/src/services/wereadService.js +145 -0
  61. package/dist/src/services/wereadService.js.map +1 -0
  62. package/dist/src/services/whitelistService.d.ts +20 -0
  63. package/dist/src/services/whitelistService.d.ts.map +1 -0
  64. package/dist/src/services/whitelistService.js +60 -0
  65. package/dist/src/services/whitelistService.js.map +1 -0
  66. package/dist/src/types.d.ts +140 -0
  67. package/dist/src/types.d.ts.map +1 -0
  68. package/dist/src/types.js +2 -0
  69. package/dist/src/types.js.map +1 -0
  70. package/dist/src/utils/errors.d.ts +25 -0
  71. package/dist/src/utils/errors.d.ts.map +1 -0
  72. package/dist/src/utils/errors.js +43 -0
  73. package/dist/src/utils/errors.js.map +1 -0
  74. package/dist/src/utils/pathUtils.d.ts +5 -0
  75. package/dist/src/utils/pathUtils.d.ts.map +1 -0
  76. package/dist/src/utils/pathUtils.js +16 -0
  77. package/dist/src/utils/pathUtils.js.map +1 -0
  78. package/dist/src/utils/pythonRunner.d.ts +27 -0
  79. package/dist/src/utils/pythonRunner.d.ts.map +1 -0
  80. package/dist/src/utils/pythonRunner.js +62 -0
  81. package/dist/src/utils/pythonRunner.js.map +1 -0
  82. package/dist/src/utils/talkerUtils.d.ts +14 -0
  83. package/dist/src/utils/talkerUtils.d.ts.map +1 -0
  84. package/dist/src/utils/talkerUtils.js +73 -0
  85. package/dist/src/utils/talkerUtils.js.map +1 -0
  86. package/mcp-server/index.ts +757 -0
  87. package/package.json +72 -0
  88. package/resources/key/win32/x64/wx_key.dll +0 -0
  89. package/resources/wcdb/win32/x64/SDL2.dll +0 -0
  90. package/resources/wcdb/win32/x64/WCDB.dll +0 -0
  91. package/resources/wcdb/win32/x64/msvcp140.dll +0 -0
  92. package/resources/wcdb/win32/x64/msvcp140_1.dll +0 -0
  93. package/resources/wcdb/win32/x64/vcruntime140.dll +0 -0
  94. package/resources/wcdb/win32/x64/vcruntime140_1.dll +0 -0
  95. package/resources/wcdb/win32/x64/wcdb_api.dll +0 -0
  96. package/scripts/_batch_link_sources.py +73 -0
  97. package/scripts/_utils.py +531 -0
  98. package/scripts/annual_report.py +796 -0
  99. package/scripts/auto_tag.py +128 -0
  100. package/scripts/biz_daily.py +896 -0
  101. package/scripts/chat_report.py +397 -0
  102. package/scripts/chat_stats.py +702 -0
  103. package/scripts/classify_daily.py +411 -0
  104. package/scripts/compile_wiki.py +258 -0
  105. package/scripts/create_reading_notes.py +370 -0
  106. package/scripts/enrich_backlinks.py +163 -0
  107. package/scripts/export_chat_html.py +766 -0
  108. package/scripts/extract_3x_key.py +86 -0
  109. package/scripts/extract_todos.py +404 -0
  110. package/scripts/fav_server.py +392 -0
  111. package/scripts/fix_topics.py +111 -0
  112. package/scripts/generate_ai_report.py +367 -0
  113. package/scripts/generate_html.py +1372 -0
  114. package/scripts/generate_review.py +170 -0
  115. package/scripts/mcp_bridge.py +398 -0
  116. package/scripts/nt_decrypt.py +562 -0
  117. package/scripts/pipeline.py +145 -0
  118. package/scripts/promote_all.py +310 -0
  119. package/scripts/promote_ideas.py +297 -0
  120. package/scripts/rag_chat.py +191 -0
  121. package/scripts/scan_decrypt_4x.py +329 -0
  122. package/scripts/semantic_search.py +431 -0
  123. package/scripts/sync_fav.py +146 -0
  124. package/scripts/sync_weread.py +192 -0
  125. package/scripts/vault_rag.py +139 -0
  126. package/scripts/vault_search.py +141 -0
  127. package/src/core/dbPathService.ts +348 -0
  128. package/src/core/keyService.ts +409 -0
  129. package/src/core/ntCore.ts +224 -0
  130. package/src/core/sqlcipherCore.ts +764 -0
  131. package/src/core/wcdbCore.ts +4568 -0
  132. package/src/core/wechatClient.ts +204 -0
  133. package/src/lz4.d.ts +10 -0
  134. package/src/services/chatService.ts +296 -0
  135. package/src/services/configService.ts +197 -0
  136. package/src/services/exportService.ts +305 -0
  137. package/src/services/wechat-formatter.ts +348 -0
  138. package/src/services/wechatMessageService.ts +383 -0
  139. package/src/services/wereadService.ts +308 -0
  140. package/src/services/whitelistService.ts +72 -0
  141. package/src/types.ts +141 -0
  142. package/src/utils/errors.ts +42 -0
  143. package/src/utils/pathUtils.ts +16 -0
  144. package/src/utils/pythonRunner.ts +81 -0
  145. package/src/utils/talkerUtils.ts +84 -0
@@ -0,0 +1,368 @@
1
+ import { join } from 'path';
2
+ import { existsSync, copyFileSync, mkdirSync } from 'fs';
3
+ import { execFile } from 'child_process';
4
+ import { promisify } from 'util';
5
+ import { createRequire } from 'module';
6
+ import os from 'os';
7
+ const require = createRequire(import.meta.url);
8
+ const execFileAsync = promisify(execFile);
9
+ export class KeyService {
10
+ koffi = null;
11
+ lib = null;
12
+ initialized = false;
13
+ initHook = null;
14
+ pollKeyData = null;
15
+ getStatusMessage = null;
16
+ cleanupHook = null;
17
+ getLastErrorMsg = null;
18
+ // Win32 APIs
19
+ kernel32 = null;
20
+ OpenProcess = null;
21
+ CloseHandle = null;
22
+ QueryFullProcessImageNameW = null;
23
+ PROCESS_ALL_ACCESS = 0x1F0FFF;
24
+ getDllPath() {
25
+ const archDir = process.arch === 'arm64' ? 'arm64' : 'x64';
26
+ const candidates = [];
27
+ if (process.env.WX_KEY_DLL_PATH) {
28
+ candidates.push(process.env.WX_KEY_DLL_PATH);
29
+ }
30
+ const cwd = process.cwd();
31
+ candidates.push(join(cwd, 'resources', 'key', 'win32', archDir, 'wx_key.dll'));
32
+ candidates.push(join(cwd, 'resources', 'key', 'win32', 'x64', 'wx_key.dll'));
33
+ candidates.push(join(cwd, 'resources', 'key', 'win32', 'wx_key.dll'));
34
+ candidates.push(join(cwd, 'resources', 'wx_key.dll'));
35
+ for (const path of candidates) {
36
+ if (existsSync(path))
37
+ return path;
38
+ }
39
+ return candidates[0];
40
+ }
41
+ isNetworkPath(path) {
42
+ return path.startsWith('\\\\');
43
+ }
44
+ localizeNetworkDll(originalPath) {
45
+ try {
46
+ const tempDir = join(os.tmpdir(), 'weflow_dll_cache');
47
+ if (!existsSync(tempDir)) {
48
+ mkdirSync(tempDir, { recursive: true });
49
+ }
50
+ const localPath = join(tempDir, 'wx_key.dll');
51
+ if (existsSync(localPath))
52
+ return localPath;
53
+ copyFileSync(originalPath, localPath);
54
+ return localPath;
55
+ }
56
+ catch (e) {
57
+ console.error('DLL 本地化失败:', e);
58
+ return originalPath;
59
+ }
60
+ }
61
+ ensureLoaded() {
62
+ if (this.initialized)
63
+ return true;
64
+ let dllPath = '';
65
+ try {
66
+ this.koffi = require('koffi');
67
+ dllPath = this.getDllPath();
68
+ if (!existsSync(dllPath)) {
69
+ console.error(`wx_key.dll 不存在: ${dllPath}`);
70
+ return false;
71
+ }
72
+ if (this.isNetworkPath(dllPath)) {
73
+ dllPath = this.localizeNetworkDll(dllPath);
74
+ }
75
+ this.lib = this.koffi.load(dllPath);
76
+ this.initHook = this.lib.func('bool InitializeHook(uint32 targetPid)');
77
+ this.pollKeyData = this.lib.func('bool PollKeyData(_Out_ char *keyBuffer, int bufferSize)');
78
+ this.getStatusMessage = this.lib.func('bool GetStatusMessage(_Out_ char *msgBuffer, int bufferSize, _Out_ int *outLevel)');
79
+ this.cleanupHook = this.lib.func('bool CleanupHook()');
80
+ this.getLastErrorMsg = this.lib.func('const char* GetLastErrorMsg()');
81
+ this.initialized = true;
82
+ return true;
83
+ }
84
+ catch (e) {
85
+ const errorMsg = e instanceof Error ? e.message : String(e);
86
+ console.error(`加载 wx_key.dll 失败: ${dllPath} - ${errorMsg}`);
87
+ return false;
88
+ }
89
+ }
90
+ ensureKernel32() {
91
+ if (this.kernel32)
92
+ return true;
93
+ try {
94
+ this.koffi = require('koffi');
95
+ this.kernel32 = this.koffi.load('kernel32.dll');
96
+ this.OpenProcess = this.kernel32.func('OpenProcess', 'void*', ['uint32', 'bool', 'uint32']);
97
+ this.CloseHandle = this.kernel32.func('CloseHandle', 'bool', ['void*']);
98
+ this.QueryFullProcessImageNameW = this.kernel32.func('QueryFullProcessImageNameW', 'bool', ['void*', 'uint32', this.koffi.out('uint16*'), this.koffi.out('uint32*')]);
99
+ return true;
100
+ }
101
+ catch (e) {
102
+ console.error('初始化 kernel32 失败:', e);
103
+ return false;
104
+ }
105
+ }
106
+ decodeUtf8(buf) {
107
+ const nullIdx = buf.indexOf(0);
108
+ return buf.toString('utf8', 0, nullIdx > -1 ? nullIdx : undefined).trim();
109
+ }
110
+ decodeCString(ptr) {
111
+ try {
112
+ if (typeof ptr === 'string')
113
+ return ptr;
114
+ return this.koffi.decode(ptr, 'char', -1);
115
+ }
116
+ catch {
117
+ return '';
118
+ }
119
+ }
120
+ async findPidByImageName(imageName) {
121
+ try {
122
+ const { stdout } = await execFileAsync('tasklist', ['/FI', `IMAGENAME eq ${imageName}`, '/FO', 'CSV', '/NH']);
123
+ const lines = stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
124
+ for (const line of lines) {
125
+ if (line.startsWith('INFO:'))
126
+ continue;
127
+ const parts = line.split('","').map((p) => p.replace(/^"|"$/g, ''));
128
+ if (parts[0]?.toLowerCase() === imageName.toLowerCase()) {
129
+ const pid = Number(parts[1]);
130
+ if (!Number.isNaN(pid))
131
+ return pid;
132
+ }
133
+ }
134
+ return null;
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ async findWeChatPid() {
141
+ const names = ['Weixin.exe', 'WeChat.exe'];
142
+ for (const name of names) {
143
+ const pid = await this.findPidByImageName(name);
144
+ if (pid)
145
+ return pid;
146
+ }
147
+ return null;
148
+ }
149
+ async getProcessExecutablePath(pid) {
150
+ if (!this.ensureKernel32())
151
+ return null;
152
+ const hProcess = this.OpenProcess(0x1000, false, pid);
153
+ if (!hProcess)
154
+ return null;
155
+ try {
156
+ const sizeBuf = Buffer.alloc(4);
157
+ sizeBuf.writeUInt32LE(1024, 0);
158
+ const pathBuf = Buffer.alloc(1024 * 2);
159
+ const ret = this.QueryFullProcessImageNameW(hProcess, 0, pathBuf, sizeBuf);
160
+ if (ret) {
161
+ const len = sizeBuf.readUInt32LE(0);
162
+ return pathBuf.toString('ucs2', 0, len * 2);
163
+ }
164
+ return null;
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ finally {
170
+ this.CloseHandle(hProcess);
171
+ }
172
+ }
173
+ /**
174
+ * 等待微信进程出现,立即 hook 并提取密钥
175
+ * 用户应在调用此方法后启动微信
176
+ */
177
+ async waitForKey(timeoutMs = 120_000, onStatus) {
178
+ if (process.platform !== 'win32') {
179
+ return { success: false, error: '自动提取 key 仅支持 Windows' };
180
+ }
181
+ if (!this.ensureLoaded()) {
182
+ return { success: false, error: 'wx_key.dll 未加载,请确保 resources/key/ 目录存在' };
183
+ }
184
+ if (!this.ensureKernel32()) {
185
+ return { success: false, error: 'Kernel32 初始化失败' };
186
+ }
187
+ const logs = [];
188
+ // 等待微信进程出现
189
+ onStatus?.('等待微信进程出现...');
190
+ let pid = null;
191
+ const waitStart = Date.now();
192
+ while (Date.now() - waitStart < timeoutMs) {
193
+ pid = await this.findWeChatPid();
194
+ if (pid)
195
+ break;
196
+ await new Promise(r => setTimeout(r, 500));
197
+ process.stdout.write('.');
198
+ }
199
+ console.log('');
200
+ if (!pid) {
201
+ return { success: false, error: '等待超时,未检测到微信进程' };
202
+ }
203
+ onStatus?.(`检测到微信进程 (PID: ${pid}),立即 hook...`);
204
+ return this.extractKeyFromPid(pid, logs, onStatus);
205
+ }
206
+ /**
207
+ * 自动从运行中的微信进程提取数据库解密 key
208
+ */
209
+ async autoGetDbKey(timeoutMs = 60_000, onStatus) {
210
+ if (process.platform !== 'win32') {
211
+ return { success: false, error: '自动提取 key 仅支持 Windows' };
212
+ }
213
+ if (!this.ensureLoaded()) {
214
+ return { success: false, error: 'wx_key.dll 未加载,请确保 resources/key/ 目录存在' };
215
+ }
216
+ if (!this.ensureKernel32()) {
217
+ return { success: false, error: 'Kernel32 初始化失败' };
218
+ }
219
+ const logs = [];
220
+ onStatus?.('正在查找微信进程...');
221
+ const pid = await this.findWeChatPid();
222
+ if (!pid) {
223
+ return { success: false, error: '未找到微信进程,请先启动微信并登录' };
224
+ }
225
+ onStatus?.(`检测到微信进程 (PID: ${pid}),正在提取 key...`);
226
+ return this.extractKeyFromPid(pid, logs, onStatus);
227
+ }
228
+ async extractKeyFromPid(pid, logs, onStatus, timeoutMs = 90_000) {
229
+ const ok = this.initHook(pid);
230
+ if (!ok) {
231
+ const error = this.getLastErrorMsg ? this.decodeCString(this.getLastErrorMsg()) : '';
232
+ if (error) {
233
+ if (error.includes('0xC0000022') || error.includes('ACCESS_DENIED')) {
234
+ return { success: false, error: '权限不足,请以管理员身份运行 CLI' };
235
+ }
236
+ return { success: false, error };
237
+ }
238
+ return { success: false, error: '初始化 Hook 失败' };
239
+ }
240
+ const keyBuffer = Buffer.alloc(128);
241
+ const start = Date.now();
242
+ let pollCount = 0;
243
+ try {
244
+ while (Date.now() - start < timeoutMs) {
245
+ pollCount++;
246
+ const pollResult = this.pollKeyData(keyBuffer, keyBuffer.length);
247
+ if (pollResult) {
248
+ const key = this.decodeUtf8(keyBuffer);
249
+ onStatus?.(`[调试] pollKeyData=true, key长度=${key.length}, 内容=${key.slice(0, 20)}...`);
250
+ if (key.length === 64) {
251
+ onStatus?.('密钥获取成功!');
252
+ return { success: true, key, logs };
253
+ }
254
+ }
255
+ else if (pollCount <= 5 || pollCount % 20 === 0) {
256
+ // 前5次和每20次输出一次调试信息
257
+ const hexSample = keyBuffer.slice(0, 16).toString('hex');
258
+ onStatus?.(`[调试] poll #${pollCount}: pollResult=${pollResult}, buffer=${hexSample}`);
259
+ }
260
+ // 读取状态消息
261
+ for (let i = 0; i < 5; i++) {
262
+ const statusBuffer = Buffer.alloc(256);
263
+ const levelOut = [0];
264
+ if (!this.getStatusMessage(statusBuffer, statusBuffer.length, levelOut))
265
+ break;
266
+ const msg = this.decodeUtf8(statusBuffer);
267
+ if (msg) {
268
+ logs.push(msg);
269
+ onStatus?.(msg);
270
+ }
271
+ }
272
+ await new Promise(resolve => setTimeout(resolve, 120));
273
+ }
274
+ }
275
+ finally {
276
+ try {
277
+ this.cleanupHook();
278
+ }
279
+ catch { }
280
+ }
281
+ return { success: false, error: '获取密钥超时,请确保微信已登录', logs };
282
+ }
283
+ /**
284
+ * 检测当前运行的微信版本
285
+ */
286
+ async detectWeChatVersion() {
287
+ const pid3x = await this.findPidByImageName('WeChat.exe');
288
+ if (pid3x)
289
+ return '3.x';
290
+ const pid4x = await this.findPidByImageName('Weixin.exe');
291
+ if (pid4x)
292
+ return '4.x';
293
+ return null;
294
+ }
295
+ /**
296
+ * 提取 3.x 数据库密钥 (通过 Python/pywxdump 内存搜索)
297
+ */
298
+ async extract3xKey(onStatus) {
299
+ if (process.platform !== 'win32') {
300
+ return { success: false, error: '3.x 密钥提取仅支持 Windows' };
301
+ }
302
+ onStatus?.('正在查找 3.x 微信进程...');
303
+ const pid = await this.findPidByImageName('WeChat.exe');
304
+ if (!pid) {
305
+ return { success: false, error: '未找到 WeChat 3.x (WeChat.exe) 进程,请先启动 3.x 微信并登录' };
306
+ }
307
+ onStatus?.(`找到 3.x 进程 (PID: ${pid}),正在通过内存搜索提取密钥...`);
308
+ try {
309
+ const scriptPath = join(process.cwd(), 'scripts', 'extract_3x_key.py');
310
+ if (!existsSync(scriptPath)) {
311
+ return { success: false, error: `Python 脚本不存在: ${scriptPath}` };
312
+ }
313
+ const { stdout } = await execFileAsync('python', [scriptPath], {
314
+ timeout: 120_000,
315
+ maxBuffer: 1024 * 1024
316
+ });
317
+ // 过滤掉可能的警告信息,只取最后一行 JSON
318
+ const lines = stdout.split('\n').filter((l) => l.trim().startsWith('{'));
319
+ if (lines.length === 0) {
320
+ return { success: false, error: `Python 脚本无有效输出: ${stdout.slice(0, 200)}` };
321
+ }
322
+ const result = JSON.parse(lines[lines.length - 1]);
323
+ if (result.success) {
324
+ onStatus?.(`3.x 密钥提取成功! wxid=${result.wxid}`);
325
+ return {
326
+ success: true,
327
+ key: result.key,
328
+ wxid: result.wxid,
329
+ msgDir: result.msg_dir,
330
+ wxDir: result.wx_dir
331
+ };
332
+ }
333
+ else {
334
+ return { success: false, error: result.error || '3.x 密钥提取失败' };
335
+ }
336
+ }
337
+ catch (e) {
338
+ const msg = e?.message || String(e);
339
+ if (msg.includes('ETIMEDOUT') || msg.includes('killed')) {
340
+ return { success: false, error: '3.x 密钥提取超时' };
341
+ }
342
+ if (msg.includes('ENOENT') || msg.includes('python')) {
343
+ return { success: false, error: '未找到 Python,请确保 Python 已安装并在 PATH 中' };
344
+ }
345
+ return { success: false, error: `3.x 密钥提取失败: ${msg}` };
346
+ }
347
+ }
348
+ /**
349
+ * 自动检测并提取密钥 (支持 3.x 和 4.x)
350
+ */
351
+ async autoExtractKey(onStatus) {
352
+ const version = await this.detectWeChatVersion();
353
+ if (version === '3.x') {
354
+ onStatus?.('检测到 WeChat 3.x 版本,使用内存搜索方式提取密钥...');
355
+ return this.extract3xKey(onStatus);
356
+ }
357
+ else if (version === '4.x') {
358
+ onStatus?.('检测到 WeChat 4.x 版本,使用 Hook 方式提取密钥...');
359
+ const result = await this.autoGetDbKey(60000, onStatus);
360
+ return { ...result, version: '4.x' };
361
+ }
362
+ else {
363
+ return { success: false, error: '未检测到微信进程 (WeChat.exe 或 Weixin.exe)' };
364
+ }
365
+ }
366
+ }
367
+ export const keyService = new KeyService();
368
+ //# sourceMappingURL=keyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyService.js","sourceRoot":"","sources":["../../../src/core/keyService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { ChatSession, Message, Contact } from '../types.js';
2
+ export interface NtResult {
3
+ success: boolean;
4
+ error?: string;
5
+ }
6
+ export interface NtSessionsResult extends NtResult {
7
+ sessions?: ChatSession[];
8
+ }
9
+ export interface NtMessagesResult extends NtResult {
10
+ messages?: Message[];
11
+ }
12
+ export interface NtContactsResult extends NtResult {
13
+ contacts?: Contact[];
14
+ }
15
+ export interface NtScanResult {
16
+ success: boolean;
17
+ error?: string;
18
+ keys?: Array<{
19
+ key: string;
20
+ salt: string;
21
+ }>;
22
+ databases?: Array<{
23
+ path: string;
24
+ name: string;
25
+ salt: string;
26
+ size: number;
27
+ wxid: string;
28
+ }>;
29
+ matched?: Array<{
30
+ path: string;
31
+ name: string;
32
+ salt: string;
33
+ size: number;
34
+ wxid: string;
35
+ key: string;
36
+ }>;
37
+ }
38
+ export declare class NtCore {
39
+ private dbPath;
40
+ private keyHex;
41
+ private saltHex;
42
+ /** contact.db 路径 (用于显示备注名/昵称) */
43
+ contactDbPath: string | null;
44
+ /** contact.db 解密密钥 */
45
+ contactKey: string | null;
46
+ /** contact.db 盐值 */
47
+ contactSalt: string | null;
48
+ constructor(dbPath: string, keyHex: string, saltHex: string);
49
+ /** 尝试自动发现并连接 contact.db */
50
+ autoDetectContactDb(): boolean;
51
+ private get scriptPath();
52
+ private callPython;
53
+ /**
54
+ * Scan memory for NT keys and match to databases.
55
+ * Requires WeChat to be running.
56
+ */
57
+ static scan(): Promise<NtScanResult>;
58
+ getSessions(keyword?: string): Promise<NtSessionsResult>;
59
+ getMessages(talker: string, limit?: number, offset?: number): Promise<NtMessagesResult>;
60
+ getContacts(keyword?: string, limit?: number): Promise<NtContactsResult>;
61
+ }
62
+ //# sourceMappingURL=ntCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntCore.d.ts","sourceRoot":"","sources":["../../../src/core/ntCore.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMhE,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3C,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3F,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACvG;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAQ;IACvB,iCAAiC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IACnC,sBAAsB;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAO;IAChC,oBAAoB;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAO;gBAErB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAM3D,2BAA2B;IAC3B,mBAAmB,IAAI,OAAO;IAoB9B,OAAO,KAAK,UAAU,GAIrB;YAEa,UAAU;IA6BxB;;;OAGG;WACU,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAqCpC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBxD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyB/E,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAoB5E"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * NT Core - 4.x NT database access layer
3
+ *
4
+ * NT databases (xwechat_files/* /db_storage/message/message_0.db) use
5
+ * SQLCipher 4 with plaintext_header_size=0. Decryption requires the
6
+ * sqlcipher3 Python package. This module wraps scripts/nt_decrypt.py.
7
+ */
8
+ import { execFile } from 'child_process';
9
+ import { promisify } from 'util';
10
+ import { existsSync } from 'fs';
11
+ import { join, dirname } from 'path';
12
+ import { fileURLToPath } from 'url';
13
+ import { configService } from '../services/configService.js';
14
+ const execFileAsync = promisify(execFile);
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ export class NtCore {
18
+ dbPath;
19
+ keyHex;
20
+ saltHex;
21
+ /** contact.db 路径 (用于显示备注名/昵称) */
22
+ contactDbPath = null;
23
+ /** contact.db 解密密钥 */
24
+ contactKey = null;
25
+ /** contact.db 盐值 */
26
+ contactSalt = null;
27
+ constructor(dbPath, keyHex, saltHex) {
28
+ this.dbPath = dbPath;
29
+ this.keyHex = keyHex;
30
+ this.saltHex = saltHex;
31
+ }
32
+ /** 尝试自动发现并连接 contact.db */
33
+ autoDetectContactDb() {
34
+ // 从 message_0.db 路径推导 contact.db
35
+ // message_0.db: <xwechat>/<wxid>/db_storage/message/message_0.db
36
+ // contact.db: <xwechat>/<wxid>/db_storage/contact/contact.db
37
+ const msgDir = this.dbPath.replace(/\\/g, '/');
38
+ const parts = msgDir.split('/');
39
+ // 找到 db_storage 位置
40
+ const dbStorageIdx = parts.lastIndexOf('db_storage');
41
+ if (dbStorageIdx < 0)
42
+ return false;
43
+ const wxidDir = parts.slice(0, dbStorageIdx).join('/');
44
+ const contactDbPath = `${wxidDir}/db_storage/contact/contact.db`;
45
+ if (existsSync(contactDbPath)) {
46
+ this.contactDbPath = contactDbPath;
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+ get scriptPath() {
52
+ // __dirname = dist/src/core, so ../../.. = package root
53
+ const pkgRoot = join(__dirname, '..', '..', '..');
54
+ return join(pkgRoot, 'scripts', 'nt_decrypt.py');
55
+ }
56
+ async callPython(args) {
57
+ try {
58
+ const { stdout } = await execFileAsync('python', [this.scriptPath, ...args], {
59
+ timeout: 120_000,
60
+ maxBuffer: 50 * 1024 * 1024,
61
+ env: { ...process.env, PYTHONIOENCODING: 'utf-8' },
62
+ encoding: 'utf-8',
63
+ });
64
+ const lines = stdout.split('\n').filter((l) => l.trim());
65
+ for (let i = lines.length - 1; i >= 0; i--) {
66
+ const trimmed = lines[i].trim();
67
+ if (trimmed.startsWith('{')) {
68
+ return JSON.parse(trimmed);
69
+ }
70
+ }
71
+ return { error: 'No valid JSON output from Python script' };
72
+ }
73
+ catch (e) {
74
+ const msg = e?.message || String(e);
75
+ if (msg.includes('ENOENT') || msg.includes('python')) {
76
+ return { error: 'Python not found. Install Python and sqlcipher3: pip install sqlcipher3' };
77
+ }
78
+ if (msg.includes('ETIMEDOUT') || msg.includes('killed')) {
79
+ return { error: 'NT database query timed out' };
80
+ }
81
+ return { error: `NT database query failed: ${msg}` };
82
+ }
83
+ }
84
+ /**
85
+ * Scan memory for NT keys and match to databases.
86
+ * Requires WeChat to be running.
87
+ */
88
+ static async scan() {
89
+ try {
90
+ const pkgRoot = join(__dirname, '..', '..', '..');
91
+ const scriptPath = join(pkgRoot, 'scripts', 'nt_decrypt.py');
92
+ const { stdout } = await execFileAsync('python', [scriptPath, 'scan', '--json'], {
93
+ timeout: 300_000,
94
+ maxBuffer: 10 * 1024 * 1024,
95
+ env: { ...process.env, PYTHONIOENCODING: 'utf-8' },
96
+ encoding: 'utf-8',
97
+ });
98
+ const lines = stdout.split('\n').filter((l) => l.trim());
99
+ for (let i = lines.length - 1; i >= 0; i--) {
100
+ const trimmed = lines[i].trim();
101
+ if (trimmed.startsWith('{')) {
102
+ const result = JSON.parse(trimmed);
103
+ if (result.error) {
104
+ return { success: false, error: result.error };
105
+ }
106
+ return {
107
+ success: true,
108
+ keys: result.keys || [],
109
+ databases: result.databases || [],
110
+ matched: result.matched || [],
111
+ };
112
+ }
113
+ }
114
+ return { success: false, error: 'Scan produced no valid output' };
115
+ }
116
+ catch (e) {
117
+ const msg = e?.message || String(e);
118
+ if (msg.includes('ENOENT') || msg.includes('python')) {
119
+ return { success: false, error: 'Python not found. Install Python and add to PATH.' };
120
+ }
121
+ return { success: false, error: `NT scan failed: ${msg}` };
122
+ }
123
+ }
124
+ async getSessions(keyword) {
125
+ const args = [
126
+ 'sessions',
127
+ '--db', this.dbPath,
128
+ '--key', this.keyHex,
129
+ '--salt', this.saltHex,
130
+ ];
131
+ if (keyword)
132
+ args.push('--keyword', keyword);
133
+ if (this.contactDbPath && this.contactKey && this.contactSalt) {
134
+ args.push('--contact-db', this.contactDbPath);
135
+ args.push('--contact-key', this.contactKey);
136
+ args.push('--contact-salt', this.contactSalt);
137
+ }
138
+ const result = await this.callPython(args);
139
+ if (result.error) {
140
+ return { success: false, error: result.error };
141
+ }
142
+ return { success: true, sessions: result.sessions || [] };
143
+ }
144
+ async getMessages(talker, limit = 100, offset = 0) {
145
+ const args = [
146
+ 'messages',
147
+ '--db', this.dbPath,
148
+ '--key', this.keyHex,
149
+ '--salt', this.saltHex,
150
+ '--talker', talker,
151
+ '--limit', String(limit),
152
+ '--offset', String(offset),
153
+ ];
154
+ if (this.contactDbPath && this.contactKey && this.contactSalt) {
155
+ args.push('--contact-db', this.contactDbPath);
156
+ args.push('--contact-key', this.contactKey);
157
+ args.push('--contact-salt', this.contactSalt);
158
+ }
159
+ // Pass own wxid from config for self-message detection
160
+ const ownWxid = configService.get('wxid');
161
+ if (ownWxid)
162
+ args.push('--own-wxid', ownWxid);
163
+ const result = await this.callPython(args);
164
+ if (result.error) {
165
+ return { success: false, error: result.error };
166
+ }
167
+ return { success: true, messages: result.messages || [] };
168
+ }
169
+ async getContacts(keyword, limit = 200) {
170
+ const args = [
171
+ 'contacts',
172
+ '--db', this.dbPath,
173
+ '--key', this.keyHex,
174
+ '--salt', this.saltHex,
175
+ '--limit', String(limit),
176
+ ];
177
+ if (keyword)
178
+ args.push('--keyword', keyword);
179
+ if (this.contactDbPath && this.contactKey && this.contactSalt) {
180
+ args.push('--contact-db', this.contactDbPath);
181
+ args.push('--contact-key', this.contactKey);
182
+ args.push('--contact-salt', this.contactSalt);
183
+ }
184
+ const result = await this.callPython(args);
185
+ if (result.error) {
186
+ return { success: false, error: result.error };
187
+ }
188
+ return { success: true, contacts: result.contacts || [] };
189
+ }
190
+ }
191
+ //# sourceMappingURL=ntCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntCore.js","sourceRoot":"","sources":["../../../src/core/ntCore.ts"],"names":[],"mappings":"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"}