Files
wechat-cli/wechat_cli/core/context.py
canghe e64006bafe Initial release: wechat-cli v0.2.0
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
2026-04-04 11:10:10 +08:00

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)