Merge pull request #45 from H3CoF6/main

修复图片密钥匹配问题
This commit is contained in:
2977094657
2026-04-13 04:11:50 +08:00
committed by GitHub
Unverified
3 changed files with 29 additions and 14 deletions
+6 -2
View File
@@ -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)
}
// 枚举服务号信息
+21 -11
View File
@@ -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
+2 -1
View File
@@ -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'],