mirror of
https://github.com/LifeArchiveProject/WeChatDataAnalysis.git
synced 2026-02-19 14:20:51 +08:00
chore(tools): 添加解密与资源调试脚本
- 增加解密/资源/表情/媒体定位等调试脚本,便于本地排查与验证
This commit is contained in:
74
tools/debug_image_lookup.py
Normal file
74
tools/debug_image_lookup.py
Normal file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env python3
|
||||
"""调试图片查找"""
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
|
||||
account = 'wxid_v4mbduwqtzpt22'
|
||||
md5 = '8753fcd3b1f8c4470b53551e13c5fbc1'
|
||||
|
||||
db_dir = Path(r'd:\abc\PycharmProjects\WeChatDataAnalysis\output\databases') / account
|
||||
hardlink_db = db_dir / 'hardlink.db'
|
||||
|
||||
print(f'Hardlink DB exists: {hardlink_db.exists()}')
|
||||
|
||||
if hardlink_db.exists():
|
||||
conn = sqlite3.connect(str(hardlink_db))
|
||||
conn.row_factory = sqlite3.Row
|
||||
|
||||
# List tables
|
||||
tables = conn.execute("SELECT name FROM sqlite_master WHERE type='table'").fetchall()
|
||||
print(f'Tables: {[t[0] for t in tables]}')
|
||||
|
||||
# Find image hardlink table
|
||||
for t in tables:
|
||||
tname = t[0]
|
||||
if 'image' in tname.lower() and 'hardlink' in tname.lower():
|
||||
print(f'\nChecking table: {tname}')
|
||||
cols = conn.execute(f"PRAGMA table_info({tname})").fetchall()
|
||||
print(f'Columns: {[c[1] for c in cols]}')
|
||||
|
||||
# Search for the md5
|
||||
row = conn.execute(f"SELECT * FROM [{tname}] WHERE md5 = ? LIMIT 1", (md5,)).fetchone()
|
||||
if row:
|
||||
print(f'Found: {dict(row)}')
|
||||
dir1 = row['dir1']
|
||||
dir2 = row['dir2']
|
||||
file_name = row['file_name']
|
||||
|
||||
# Check dir2id table structure
|
||||
dir2id_cols = conn.execute("PRAGMA table_info(dir2id)").fetchall()
|
||||
print(f'dir2id columns: {[c[1] for c in dir2id_cols]}')
|
||||
|
||||
# Get sample from dir2id
|
||||
dir2id_sample = conn.execute("SELECT * FROM dir2id LIMIT 3").fetchall()
|
||||
print(f'dir2id sample: {[dict(r) for r in dir2id_sample]}')
|
||||
|
||||
# Try to find matching dir2 value using rowid
|
||||
dir2id_row = conn.execute("SELECT rowid, username FROM dir2id WHERE rowid = ? LIMIT 1", (dir2,)).fetchone()
|
||||
print(f'dir2id lookup for rowid={dir2}: {dict(dir2id_row) if dir2id_row else "NOT FOUND"}')
|
||||
|
||||
# Try to construct the path
|
||||
weixin_root = Path(r'D:\abc\wechatMSG\xwechat_files\wxid_v4mbduwqtzpt22_1e7a')
|
||||
if dir2id_row:
|
||||
dir_name = dir2id_row['username'] # In WeChat 4.x, username column is the folder name
|
||||
else:
|
||||
dir_name = str(dir2)
|
||||
|
||||
possible_path = weixin_root / str(dir1) / dir_name / file_name
|
||||
print(f'Possible path: {possible_path}')
|
||||
print(f'Path exists: {possible_path.exists()}')
|
||||
|
||||
# Also try _h.dat variant
|
||||
h_path = possible_path.with_name(possible_path.stem + '_h.dat')
|
||||
print(f'_h.dat path: {h_path}')
|
||||
print(f'_h.dat exists: {h_path.exists()}')
|
||||
else:
|
||||
print(f'MD5 {md5} not found in {tname}')
|
||||
|
||||
# Show sample data
|
||||
sample = conn.execute(f"SELECT md5, dir1, dir2, file_name FROM [{tname}] LIMIT 3").fetchall()
|
||||
print(f'Sample data:')
|
||||
for s in sample:
|
||||
print(f' md5={s[0]}, dir1={s[1]}, dir2={s[2]}, file_name={s[3]}')
|
||||
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user