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
73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
"""init 命令 — 交互式初始化,提取密钥并生成配置"""
|
||
|
||
import json
|
||
import os
|
||
import sys
|
||
|
||
import click
|
||
|
||
from ..core.config import STATE_DIR, CONFIG_FILE, KEYS_FILE, auto_detect_db_dir
|
||
|
||
|
||
@click.command()
|
||
@click.option("--db-dir", default=None, help="微信数据目录路径(默认自动检测)")
|
||
@click.option("--force", is_flag=True, help="强制重新提取密钥")
|
||
def init(db_dir, force):
|
||
"""初始化 wechat-cli:提取密钥并生成配置"""
|
||
click.echo("WeChat CLI 初始化")
|
||
click.echo("=" * 40)
|
||
|
||
# 1. 检查是否已初始化
|
||
if os.path.exists(CONFIG_FILE) and os.path.exists(KEYS_FILE) and not force:
|
||
click.echo(f"已初始化(配置: {CONFIG_FILE})")
|
||
click.echo("使用 --force 重新提取密钥")
|
||
return
|
||
|
||
# 2. 创建状态目录
|
||
os.makedirs(STATE_DIR, exist_ok=True)
|
||
|
||
# 3. 确定 db_dir
|
||
if db_dir is None:
|
||
db_dir = auto_detect_db_dir()
|
||
if db_dir is None:
|
||
click.echo("[!] 未能自动检测到微信数据目录", err=True)
|
||
click.echo("请通过 --db-dir 参数指定,例如:", err=True)
|
||
click.echo(" wechat-cli init --db-dir ~/path/to/db_storage", err=True)
|
||
sys.exit(1)
|
||
click.echo(f"[+] 检测到微信数据目录: {db_dir}")
|
||
else:
|
||
db_dir = os.path.abspath(db_dir)
|
||
if not os.path.isdir(db_dir):
|
||
click.echo(f"[!] 目录不存在: {db_dir}", err=True)
|
||
sys.exit(1)
|
||
click.echo(f"[+] 使用指定数据目录: {db_dir}")
|
||
|
||
# 4. 提取密钥
|
||
click.echo("\n开始提取密钥...")
|
||
try:
|
||
from ..keys import extract_keys
|
||
key_map = extract_keys(db_dir, KEYS_FILE)
|
||
except RuntimeError as e:
|
||
click.echo(f"\n[!] 密钥提取失败: {e}", err=True)
|
||
if "sudo" not in str(e).lower():
|
||
click.echo("提示: macOS/Linux 可能需要 sudo 权限", err=True)
|
||
sys.exit(1)
|
||
except Exception as e:
|
||
click.echo(f"\n[!] 密钥提取出错: {e}", err=True)
|
||
sys.exit(1)
|
||
|
||
# 5. 写入配置
|
||
cfg = {
|
||
"db_dir": db_dir,
|
||
}
|
||
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
|
||
json.dump(cfg, f, indent=2, ensure_ascii=False)
|
||
|
||
click.echo(f"\n[+] 初始化完成!")
|
||
click.echo(f" 配置: {CONFIG_FILE}")
|
||
click.echo(f" 密钥: {KEYS_FILE}")
|
||
click.echo(f" 提取到 {len(key_map)} 个数据库密钥")
|
||
click.echo("\n现在可以使用:")
|
||
click.echo(" wechat-cli sessions")
|
||
click.echo(" wechat-cli history \"联系人\"")
|