Skip to content

Commit 59bade7

Browse files
committed
fix(key): 修复单/多账号图片密钥的匹配问题
1 parent a6a8d63 commit 59bade7

3 files changed

Lines changed: 29 additions & 14 deletions

File tree

frontend/composables/useApi.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,12 @@ export const useApi = () => {
575575
}
576576

577577
// 获取图片密钥
578-
const getImageKey = async () => {
579-
return await request('/get_image_key')
578+
const getImageKey = async (params = {}) => {
579+
const query = new URLSearchParams()
580+
if (params && params.account) query.set('account', params.account)
581+
const url = '/get_image_key' + (query.toString() ? `?${query.toString()}` : '')
582+
583+
return await request(url)
580584
}
581585

582586
// 枚举服务号信息

frontend/pages/decrypt.vue

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ const handleGetDbKey = async () => {
542542
const wxStatus = statusRes?.wx_status
543543
544544
if (wxStatus?.is_running) {
545-
warning.value = '检测到微信正在运行,5秒后将终止进程并重启以获取全套密钥'
545+
warning.value = '检测到微信正在运行,5秒后将终止进程并重启以获取数据库密钥'
546546
await new Promise(resolve => setTimeout(resolve, 5000))
547547
}
548548
@@ -554,8 +554,7 @@ const handleGetDbKey = async () => {
554554
if (res.data?.db_key) {
555555
formData.key = res.data.db_key
556556
}
557-
warning.value = '🎉 数据库解密密钥已获取成功!'
558-
// 3秒后清除成功提示,保持 UI 干净
557+
warning.value = '数据库解密密钥已获取成功!'
559558
setTimeout(() => { if(warning.value.includes('获取成功')) warning.value = '' }, 3000)
560559
} else {
561560
error.value = '获取失败: ' + (res?.errmsg || '未知错误')
@@ -570,7 +569,6 @@ const handleGetDbKey = async () => {
570569
}
571570
}
572571
573-
574572
const applyManualKeys = () => {
575573
manualKeyErrors.xor_key = ''
576574
manualKeyErrors.aes_key = ''
@@ -752,16 +750,23 @@ const handleDecrypt = async () => {
752750
}
753751
try {
754752
const accounts = Object.keys(result.account_results || {})
755-
if (accounts.length > 0) mediaAccount.value = accounts[0]
753+
if (accounts.length > 0) {
754+
mediaAccount.value = accounts[0]
755+
} else {
756+
const match = formData.db_storage_path.match(/(wxid_[a-zA-Z0-9]+)/)
757+
if (match) mediaAccount.value = match[1]
758+
}
756759
} catch (e) {}
757760
758761
currentStep.value = 1
759762
await prefillKeysForAccount(mediaAccount.value)
760763
761764
if (!manualKeys.xor_key && !manualKeys.aes_key) {
762-
warning.value = '正在通过云端备选方案自动获取图片密钥,请稍候...'
765+
warning.value = '正在通过云端/本地算法自动获取图片密钥,请稍候...'
763766
try {
764-
const imgRes = await getImageKey({ account: mediaAccount.value })
767+
const params = mediaAccount.value ? { account: mediaAccount.value } : {}
768+
const imgRes = await getImageKey(params)
769+
765770
if (imgRes && imgRes.status === 0) {
766771
if (imgRes.data?.xor_key) manualKeys.xor_key = imgRes.data.xor_key
767772
if (imgRes.data?.aes_key) manualKeys.aes_key = imgRes.data.aes_key
@@ -842,7 +847,12 @@ const handleDecrypt = async () => {
842847
843848
try {
844849
const accounts = Object.keys(data.account_results || {})
845-
if (accounts.length > 0) mediaAccount.value = accounts[0]
850+
if (accounts.length > 0) {
851+
mediaAccount.value = accounts[0]
852+
} else {
853+
const match = formData.db_storage_path.match(/(wxid_[a-zA-Z0-9]+)/)
854+
if (match) mediaAccount.value = match[1]
855+
}
846856
} catch (e) {}
847857
848858
try {
@@ -855,11 +865,11 @@ const handleDecrypt = async () => {
855865
currentStep.value = 1
856866
await prefillKeysForAccount(mediaAccount.value)
857867
858-
// 【重点】如果刚才没有通过双 Hook 拿到图片密钥,触发云端 API 备用方案自动获取
859868
if (!manualKeys.xor_key && !manualKeys.aes_key) {
860-
warning.value = '正在通过云端备选方案自动获取图片密钥,请稍候...'
869+
warning.value = '正在通过云端/本地算法自动获取图片密钥,请稍候...'
861870
try {
862-
const imgRes = await getImageKey({ account: mediaAccount.value })
871+
const params = mediaAccount.value ? { account: mediaAccount.value } : {}
872+
const imgRes = await getImageKey(params)
863873
if (imgRes && imgRes.status === 0) {
864874
if (imgRes.data?.xor_key) manualKeys.xor_key = imgRes.data.xor_key
865875
if (imgRes.data?.aes_key) manualKeys.aes_key = imgRes.data.aes_key

src/wechat_decrypt_tool/key_service.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ async def get_image_key_integrated_workflow(account: Optional[str] = None) -> Di
193193
# 如果指定了账号,尝试在本地结果中找匹配的
194194
if target_account_wxid:
195195
for k in local_keys:
196-
if k['wxid'] == target_account_wxid:
196+
if k['wxid'] in target_account_wxid:
197197
logger.info(f"成功通过本地算法匹配到账号 {target_account_wxid} 的图片密钥")
198198
upsert_account_keys_in_store(
199199
account=k['wxid'],
@@ -205,6 +205,7 @@ async def get_image_key_integrated_workflow(account: Optional[str] = None) -> Di
205205
# 如果没指定账号,返回第一个发现的并存入 store (如果有的话)
206206
k = local_keys[0]
207207
logger.info(f"本地算法提取成功 (未指定账号,返回首个): {k['wxid']}")
208+
# logger.info(local_keys)
208209
upsert_account_keys_in_store(
209210
account=k['wxid'],
210211
image_xor_key=k['xor_key'],

0 commit comments

Comments
 (0)