refactor: 删除 tkinter app_gui.py, 完全切到 Web UI 作为唯一入口

## 决策背景

用户反馈 "windows GUI 太难看了, 还是完全用 webUI 吧, 用户可以选择"。

tkinter app_gui.py (PR #107 引入, 929 行) 的问题:
- 中文字体下渲染糊 ("WeChat Decrypt 工具箱" 标题模糊)
- 90 年代 Windows 控件风格, 不暗色不现代
- 只能跑 Windows, 不跨平台
- 没法远程访问
- 跟 Web UI 维护两套, 重复

Web UI (monitor_web.py) 已经完全对齐功能:
- 8 个工具按钮 (3 tab 分组: 个人微信 / 企微 / 工具)
- 终止按钮 + 实时日志推送
- 导出筛选模态框 (会话搜索/复选/格式选择, close #112)
- 跟实时消息监听共享 SSE 通道
- Lucide SVG icon 统一风格 (无 emoji)
- 暗色主题 + design tokens + 玻璃质感顶栏

## 改动

### 删除
- \`app_gui.py\` (929 行 tkinter GUI)

### monitor_web.py
拆 \`main()\` → \`_start_monitor_if_ready()\` + 精简的 \`main()\`:

之前: keys 不存在 → \`sys.exit(1)\` 直接挂

现在: keys 不存在 → 跳过监听线程启动, 仅起 Web UI 服务。
用户从工具箱点 "① 提取密钥 + 解密数据库" 跑完后重启进程, 监听自动激活。
这样 exe 用户第一次双击时不会报错挂掉, 而是看到 Web UI 工具箱可以
直接用。

新启动流程: \`_start_monitor_if_ready\` 检查 keys 文件 / session.db
密钥 / session.db 路径都 OK 才启 monitor_thread, 任一不满足都给友好
提示但不退出。

### WeChatDecrypt.spec
- 入口 \`app_gui.py\` → \`monitor_web.py\`
- datas 清单补全 (加 export_all_chats / chat_export_helpers /
  batch_decrypt_images / transcribe_chat 等之前漏的)
- hiddenimports 显式列 Crypto / zstandard / pilk (避免 PyInstaller
  漏 detect)

### build.bat
- 删 30 行重复的 --add-data 清单 (跟 .spec 漂移风险)
- 改成 \`pyinstaller --noconfirm WeChatDecrypt.spec\`
- 单一 source of truth 是 .spec
- 完成提示从 "GUI 启动" 改成 "双击 → 浏览器开 Web UI"

### EXE_USAGE.md
完全重写为 Web UI 视角:
- 快速开始: 双击 exe → 浏览器自动打开
- 工具箱 3 tab 各自能力详解
- 导出筛选模态框使用说明
- 任务终止说明
- 输出目录布局
- 远程访问说明
- 结尾解释为什么去掉了 tkinter

### README.md
- 三平台 quick-start 里 "Windows GUI / EXE" → "Windows Web UI / EXE"
- 文件清单: \`app_gui.py\` 那行 → \`monitor_web.py\` (新身份: Web UI
  总入口)
- 技术细节里 "GUI 工具箱" 章节重写: 强调 Web UI 优势 (筛选模态框 /
  终止按钮 / 跨平台 / 远程访问 / 跟监听共存) + 末尾 1 句历史说明
  解释 tkinter 已删除

## 实测

- python monitor_web.py: keys 在 → 正常启动监听 + Web UI
- python monitor_web.py: 假装 keys 不在 → 跳过监听, Web UI 仍能开,
  用户从工具箱点 "① 提取密钥" 后重启即激活
- 测试 185/185 通过

## 没改 (留 follow-up)

- 实际打包 .spec 验证 (需要 Win 跑 pyinstaller, 没在 CI 跑)
- monitor_web 启动后**自动**检测 keys 文件 mtime 变化重启监听, 不需要
  用户手动重启进程 (现在的设计是"重启进程才激活")
This commit is contained in:
ylytdeng
2026-05-17 19:22:47 +08:00
parent 273fe65a07
commit e826b1a565
6 changed files with 213 additions and 1107 deletions

View File

@@ -62,17 +62,21 @@ python export_all_chats.py
</details>
<details>
<summary>Windows — GUI / EXE (推荐非技术用户)</summary>
<summary>Windows — Web UI / EXE (推荐非技术用户)</summary>
```bash
# 直接跑 GUI (开发模式)
python app_gui.py
# 直接跑 Web UI (开发模式)
python monitor_web.py # → 浏览器自动开 http://localhost:5678
# 或打包成单 exe 分发给别人
build.bat # 输出 dist/WeChatDecrypt.exe
# 双击 exe → 自动开浏览器 → Web UI 工具箱
```
按钮覆盖: 解密 / 导出 / 朋友圈 / 企业微信 / 语音转 MP3。详见 [EXE_USAGE.md](./EXE_USAGE.md)。
工具箱 3 个 tab (📱 个人微信 / 🏢 企业微信 / 🔧 工具),
覆盖解密 / 导出 / 朋友圈 / 语音转 MP3 全部场景, 导出带模态框筛选 (不会动不动跑全量)。
实时消息监听跟工具箱在同一页面。详见 [EXE_USAGE.md](./EXE_USAGE.md)。
</details>
@@ -324,7 +328,7 @@ make help # 列出所有命令
| 文件 | 说明 |
|---|---|
| `main.py` | **CLI 总入口** — 子命令 `decrypt` / `export` / `all` / `status` / `decode-images` / `help` |
| `app_gui.py` | **Windows GUI** — tkinter 界面整合所有功能 (PR #107) |
| `monitor_web.py` | **Web UI 总入口** — 实时监听 + 8 个工具按钮 + 导出筛选模态框 (`python monitor_web.py` 即用, PyInstaller 打包成单 exe 给非技术用户) |
| `setup.sh` | 一键安装依赖 (macOS / Linux / Windows Git Bash) |
| `setup.py` | 交互式配置向导 (`python setup.py --check` 仅检查环境) |
| `cleanup.py` | 磁盘清理工具 (`status` 查看用量 / `--dry-run` 预览) |
@@ -381,7 +385,7 @@ make help # 列出所有命令
| 文件 | 说明 |
|---|---|
| `monitor_web.py` | Web UI (浏览器实时消息, SSE 推送, http://localhost:5678) |
| `monitor_web.py` | (见 ① 入口) — 同一个文件既是 Web UI 总入口也是实时消息监听 |
| `monitor.py` | 命令行实时监听 |
| `mcp_server.py` | **MCP Server** — Claude AI 查询微信数据 (含 `get_chat_history` / `decode_voice` / `decode_refer` 等 20+ 工具) |
| `decode_transfer.py` | CLI: 查单条转账消息 (mcp_server `decode_transfer` 工具的命令行包装) |
@@ -446,35 +450,43 @@ WCDB (微信的 SQLCipher 封装) 会在进程内存中缓存派生后的 raw ke
`export_sns.py` 解析 SnsTimeLine 的 XML 时已加 **XXE 防护**(拒绝 `<!DOCTYPE>` / `<!ENTITY>` + 200KB 大小上限),避免恶意朋友圈 XML 通过 entity expansion 或外部实体引用执行 SSRF / 读取本地文件。`mcp_server.py` 解析其他类型 appmsg XML 同样有这层保护。
### GUI 工具箱 & 单 exe 打包
### Web UI 工具箱 & 单 exe 打包
提供 tkinter 图形界面 (`app_gui.py`),集成核心功能:
`monitor_web.py` 既是实时消息监听 (浏览器 Web UI), 又是工具箱总入口。
右上角 🛠️ 工具 按钮展开 3 个 tab:
1. **解密数据库** — 调用 `main.py decrypt`
2. **导出消息** — 调用 `export_messages.py`,输出 CSV / HTML / JSON
3. **转换音频** — 调用 `voice_to_mp3.py`SILK_V3 → MP3
4. **企业微信解密** — 调用 `find_wxwork_keys.py` + `decrypt_wxwork_db.py`
5. **企业微信导出** — 调用 `export_wxwork_messages.py`,按个人/群导出 CSV / HTML / JSON
- **📱 个人微信**: Step 1 解密 / 图片密钥 → Step 2 导出聊天 / 批量解图片 / 朋友圈
- **🏢 企业微信**: Step 1 解密 → Step 2 导出聊天 (CSV/HTML/JSON)
- **🔧 工具**: 语音转 MP3
特点:
- **导出筛选模态框**: 不会一点就跑全量, 弹框选会话 (含搜索/全选/选最近 30 天)
- **任务终止**: 按钮变红 🛑, 一点立刻 SIGTERM 子进程
- **跟实时监听共存**: 同一页面下方就是消息流, 互不影响
- **跨平台 + 远程可访问**: 浏览器渲染清晰, 默认 bind 0.0.0.0 同局域网可用
#### 直接运行
```bash
python app_gui.py
python monitor_web.py # → 浏览器自动开 http://localhost:5678
```
#### 打包为单 exe
```bash
pip install pyinstaller
build.bat
build.bat # → dist\WeChatDecrypt.exe
```
输出 `dist\WeChatDecrypt.exe`(约 18MB双击即可使用无需安装 Python。
输出约 20MB 的单 exe, 双击即用, 无需安装 Python。
> 转换音频需要系统安装 [FFmpeg](https://ffmpeg.org/download.html) 并加入 PATH。
> 语音转 MP3 需要系统安装 [FFmpeg](https://ffmpeg.org/download.html) 并加入 PATH。
详细说明见 [EXE_USAGE.md](EXE_USAGE.md)。
> **历史**: 旧版本提供过 tkinter `app_gui.py` 桌面 GUI, 在 commit 273fe65 后完全移除。
> 原因: 渲染糊 / Windows-only / 维护两套 UI。Web UI 功能完全对齐且更好。
### WAL 处理
微信使用 SQLite WAL 模式WAL 文件是**预分配固定大小** (4MB)。检测变化时: