Skip to content

Commit 7958e02

Browse files
committed
fix(decrypt): 修复数据库原始密钥解密与设备绑定提示
1 parent 91bb09b commit 7958e02

5 files changed

Lines changed: 467 additions & 133 deletions

File tree

frontend/pages/decrypt.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@
7373
</svg>
7474
点击按钮将自动获取【数据库】与【图片】双重密钥。您也可以手动输入已知的64位密钥(使用<a href="https://github.com/ycccccccy/wx_key" target="_blank" class="text-[#07C160] hover:text-[#06AD56]">wx_key</a>等工具获取)。
7575
</p>
76+
<div class="mt-3 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs leading-5 text-amber-900">
77+
提示:数据库密钥跟随“账号 + 设备”下发。同一账号在另一台电脑生成的聊天记录,复制到当前设备后,通常无法在当前设备重新获取原设备对应的密钥,因此也无法直接解密。
78+
</div>
7679
</div>
7780

7881
<!-- 数据库路径输入 -->

src/wechat_decrypt_tool/routers/decrypt.py

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@
1414
from ..logging_config import get_logger
1515
from ..path_fix import PathFixRoute
1616
from ..key_store import upsert_account_keys_in_store
17-
from ..wechat_decrypt import WeChatDatabaseDecryptor, decrypt_wechat_databases, scan_account_databases_from_path
17+
from ..wechat_decrypt import (
18+
WeChatDatabaseDecryptor,
19+
build_decrypt_result_message,
20+
decrypt_wechat_databases,
21+
scan_account_databases_from_path,
22+
)
1823

1924
logger = get_logger(__name__)
2025

@@ -76,6 +81,7 @@ async def decrypt_databases(request: DecryptRequest):
7681
"message": results["message"],
7782
"processed_files": results["processed_files"],
7883
"failed_files": results["failed_files"],
84+
"failure_details": results.get("failure_details", []),
7985
"account_results": results.get("account_results", {}),
8086
}
8187

@@ -159,6 +165,7 @@ async def generate_progress():
159165
fail_count = 0
160166
processed_files: list[str] = []
161167
failed_files: list[str] = []
168+
failure_details: list[dict] = []
162169
account_results: dict = {}
163170
overall_current = 0
164171

@@ -181,6 +188,7 @@ async def generate_progress():
181188
account_success = 0
182189
account_processed: list[str] = []
183190
account_failed: list[str] = []
191+
account_failure_details: list[dict] = []
184192

185193
for db_info in dbs:
186194
if await request.is_disconnected():
@@ -232,11 +240,20 @@ async def generate_progress():
232240
status = "success"
233241
msg = "解密成功"
234242
else:
243+
failure_detail = {
244+
"account": account,
245+
"file": db_path,
246+
"name": db_name,
247+
"code": str(decryptor.last_error_code or "").strip(),
248+
"reason": str(decryptor.last_error_message or "").strip() or "解密失败",
249+
}
235250
account_failed.append(db_path)
251+
account_failure_details.append(failure_detail)
236252
failed_files.append(db_path)
253+
failure_details.append(failure_detail)
237254
fail_count += 1
238255
status = "fail"
239-
msg = "解密失败"
256+
msg = failure_detail["reason"]
240257

241258
yield _sse(
242259
{
@@ -261,6 +278,7 @@ async def generate_progress():
261278
"output_dir": str(account_output_dir),
262279
"processed_files": account_processed,
263280
"failed_files": account_failed,
281+
"failure_details": account_failure_details,
264282
}
265283

266284
# Build cache table (keep behavior consistent with the POST endpoint).
@@ -307,9 +325,15 @@ async def generate_progress():
307325
"success_count": success_count,
308326
"failure_count": total_databases - success_count,
309327
"output_directory": str(base_output_dir.absolute()),
310-
"message": f"解密完成: 成功 {success_count}/{total_databases}",
328+
"message": build_decrypt_result_message(
329+
total_databases=total_databases,
330+
success_count=success_count,
331+
failed_count=total_databases - success_count,
332+
failure_details=failure_details,
333+
),
311334
"processed_files": processed_files,
312335
"failed_files": failed_files,
336+
"failure_details": failure_details,
313337
"account_results": account_results,
314338
}
315339

0 commit comments

Comments
 (0)