diff --git a/frontend/composables/useApi.js b/frontend/composables/useApi.js index a5be2d2..acdc57e 100644 --- a/frontend/composables/useApi.js +++ b/frontend/composables/useApi.js @@ -575,8 +575,12 @@ export const useApi = () => { } // 获取图片密钥 - const getImageKey = async () => { - return await request('/get_image_key') + const getImageKey = async (params = {}) => { + const query = new URLSearchParams() + if (params && params.account) query.set('account', params.account) + const url = '/get_image_key' + (query.toString() ? `?${query.toString()}` : '') + + return await request(url) } // 枚举服务号信息 diff --git a/frontend/pages/decrypt.vue b/frontend/pages/decrypt.vue index 479bc39..3b6cdf2 100644 --- a/frontend/pages/decrypt.vue +++ b/frontend/pages/decrypt.vue @@ -542,7 +542,7 @@ const handleGetDbKey = async () => { const wxStatus = statusRes?.wx_status if (wxStatus?.is_running) { - warning.value = '检测到微信正在运行,5秒后将终止进程并重启以获取全套密钥!' + warning.value = '检测到微信正在运行,5秒后将终止进程并重启以获取数据库密钥!' await new Promise(resolve => setTimeout(resolve, 5000)) } @@ -554,8 +554,7 @@ const handleGetDbKey = async () => { if (res.data?.db_key) { formData.key = res.data.db_key } - warning.value = '🎉 数据库解密密钥已获取成功!' - // 3秒后清除成功提示,保持 UI 干净 + warning.value = '数据库解密密钥已获取成功!' setTimeout(() => { if(warning.value.includes('获取成功')) warning.value = '' }, 3000) } else { error.value = '获取失败: ' + (res?.errmsg || '未知错误') @@ -570,7 +569,6 @@ const handleGetDbKey = async () => { } } - const applyManualKeys = () => { manualKeyErrors.xor_key = '' manualKeyErrors.aes_key = '' @@ -752,16 +750,23 @@ const handleDecrypt = async () => { } try { const accounts = Object.keys(result.account_results || {}) - if (accounts.length > 0) mediaAccount.value = accounts[0] + if (accounts.length > 0) { + mediaAccount.value = accounts[0] + } else { + const match = formData.db_storage_path.match(/(wxid_[a-zA-Z0-9]+)/) + if (match) mediaAccount.value = match[1] + } } catch (e) {} currentStep.value = 1 await prefillKeysForAccount(mediaAccount.value) if (!manualKeys.xor_key && !manualKeys.aes_key) { - warning.value = '正在通过云端备选方案自动获取图片密钥,请稍候...' + warning.value = '正在通过云端/本地算法自动获取图片密钥,请稍候...' try { - const imgRes = await getImageKey({ account: mediaAccount.value }) + const params = mediaAccount.value ? { account: mediaAccount.value } : {} + const imgRes = await getImageKey(params) + if (imgRes && imgRes.status === 0) { if (imgRes.data?.xor_key) manualKeys.xor_key = imgRes.data.xor_key if (imgRes.data?.aes_key) manualKeys.aes_key = imgRes.data.aes_key @@ -842,7 +847,12 @@ const handleDecrypt = async () => { try { const accounts = Object.keys(data.account_results || {}) - if (accounts.length > 0) mediaAccount.value = accounts[0] + if (accounts.length > 0) { + mediaAccount.value = accounts[0] + } else { + const match = formData.db_storage_path.match(/(wxid_[a-zA-Z0-9]+)/) + if (match) mediaAccount.value = match[1] + } } catch (e) {} try { @@ -855,11 +865,11 @@ const handleDecrypt = async () => { currentStep.value = 1 await prefillKeysForAccount(mediaAccount.value) - // 【重点】如果刚才没有通过双 Hook 拿到图片密钥,触发云端 API 备用方案自动获取 if (!manualKeys.xor_key && !manualKeys.aes_key) { - warning.value = '正在通过云端备选方案自动获取图片密钥,请稍候...' + warning.value = '正在通过云端/本地算法自动获取图片密钥,请稍候...' try { - const imgRes = await getImageKey({ account: mediaAccount.value }) + const params = mediaAccount.value ? { account: mediaAccount.value } : {} + const imgRes = await getImageKey(params) if (imgRes && imgRes.status === 0) { if (imgRes.data?.xor_key) manualKeys.xor_key = imgRes.data.xor_key if (imgRes.data?.aes_key) manualKeys.aes_key = imgRes.data.aes_key diff --git a/src/wechat_decrypt_tool/key_service.py b/src/wechat_decrypt_tool/key_service.py index b910d3e..13a58f0 100644 --- a/src/wechat_decrypt_tool/key_service.py +++ b/src/wechat_decrypt_tool/key_service.py @@ -193,7 +193,7 @@ async def get_image_key_integrated_workflow(account: Optional[str] = None) -> Di # 如果指定了账号,尝试在本地结果中找匹配的 if target_account_wxid: for k in local_keys: - if k['wxid'] == target_account_wxid: + if k['wxid'] in target_account_wxid: logger.info(f"成功通过本地算法匹配到账号 {target_account_wxid} 的图片密钥") upsert_account_keys_in_store( account=k['wxid'], @@ -205,6 +205,7 @@ async def get_image_key_integrated_workflow(account: Optional[str] = None) -> Di # 如果没指定账号,返回第一个发现的并存入 store (如果有的话) k = local_keys[0] logger.info(f"本地算法提取成功 (未指定账号,返回首个): {k['wxid']}") + # logger.info(local_keys) upsert_account_keys_in_store( account=k['wxid'], image_xor_key=k['xor_key'],