Files
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

73 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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 \"联系人\"")