A CLI tool to query local WeChat data with 11 commands: sessions, history, search, contacts, members, stats, export, favorites, unread, new-messages, and init. Features: - Self-contained init with key extraction (no external deps) - On-the-fly SQLCipher decryption with caching - JSON output by default for LLM/AI tool integration - Message type filtering and chat statistics - Markdown/txt export for conversations - Cross-platform: macOS, Windows, Linux
42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""应用上下文 — 单例持有配置、缓存、密钥等共享状态"""
|
|
|
|
import atexit
|
|
import json
|
|
import os
|
|
|
|
from .config import load_config, STATE_DIR
|
|
from .db_cache import DBCache
|
|
from .key_utils import strip_key_metadata
|
|
from .messages import find_msg_db_keys
|
|
|
|
|
|
class AppContext:
|
|
"""每次 CLI 调用初始化一次,被所有命令共享。"""
|
|
|
|
def __init__(self, config_path=None):
|
|
self.cfg = load_config(config_path)
|
|
self.db_dir = self.cfg["db_dir"]
|
|
self.decrypted_dir = self.cfg["decrypted_dir"]
|
|
self.keys_file = self.cfg["keys_file"]
|
|
|
|
if not os.path.exists(self.keys_file):
|
|
raise FileNotFoundError(
|
|
f"密钥文件不存在: {self.keys_file}\n"
|
|
"请运行: wechat-cli init"
|
|
)
|
|
|
|
with open(self.keys_file, encoding="utf-8") as f:
|
|
self.all_keys = strip_key_metadata(json.load(f))
|
|
|
|
self.cache = DBCache(self.all_keys, self.db_dir)
|
|
atexit.register(self.cache.cleanup)
|
|
|
|
self.msg_db_keys = find_msg_db_keys(self.all_keys)
|
|
|
|
# 确保状态目录存在
|
|
os.makedirs(STATE_DIR, exist_ok=True)
|
|
|
|
def display_name_fn(self, username, names):
|
|
from .contacts import display_name_for_username
|
|
return display_name_for_username(username, names, self.db_dir, self.cache, self.decrypted_dir)
|