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:
@@ -1,15 +1,61 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
# PyInstaller spec — 打包 monitor_web.py 为单 exe。
|
||||
#
|
||||
# 启动后:
|
||||
# 1. 起 HTTP 服务 + 监听线程 (如 keys 已就绪)
|
||||
# 2. 自动开浏览器到 http://localhost:5678
|
||||
# 3. 用户在 Web UI 工具箱里操作 (解密 / 导出 / 朋友圈 / 企微 / 语音)
|
||||
#
|
||||
# (历史: 这个 spec 之前打包 tkinter app_gui.py, 现已删除 — 完全切到 Web UI)
|
||||
|
||||
from PyInstaller.utils.hooks import collect_all
|
||||
|
||||
datas = [('main.py', '.'), ('config.py', '.'), ('decrypt_db.py', '.'), ('export_messages.py', '.'), ('voice_to_mp3.py', '.'), ('find_all_keys.py', '.'), ('find_all_keys_windows.py', '.'), ('find_all_keys_linux.py', '.'), ('find_wxwork_keys.py', '.'), ('decrypt_wxwork_db.py', '.'), ('export_wxwork_messages.py', '.'), ('wxwork_crypto.py', '.'), ('key_scan_common.py', '.'), ('key_utils.py', '.'), ('decode_image.py', '.'), ('find_image_key.py', '.'), ('find_image_key_monitor.py', '.'), ('decrypt_sns.py', '.'), ('export_sns.py', '.'), ('monitor.py', '.'), ('monitor_web.py', '.'), ('mcp_server.py', '.'), ('config.example.json', '.')]
|
||||
# 所有子进程 (工具按钮触发) 需要的脚本, 打进 exe 同目录
|
||||
datas = [
|
||||
('main.py', '.'),
|
||||
('config.py', '.'),
|
||||
('config.example.json', '.'),
|
||||
('decrypt_db.py', '.'),
|
||||
('decode_image.py', '.'),
|
||||
('decrypt_sns.py', '.'),
|
||||
('export_sns.py', '.'),
|
||||
('export_messages.py', '.'),
|
||||
('export_all_chats.py', '.'),
|
||||
('export_chat.py', '.'),
|
||||
('chat_export_helpers.py', '.'),
|
||||
('voice_to_mp3.py', '.'),
|
||||
('transcribe_chat.py', '.'),
|
||||
('find_all_keys.py', '.'),
|
||||
('find_all_keys_windows.py', '.'),
|
||||
('find_all_keys_linux.py', '.'),
|
||||
('find_image_key.py', '.'),
|
||||
('find_image_key_monitor.py', '.'),
|
||||
('find_wxwork_keys.py', '.'),
|
||||
('decrypt_wxwork_db.py', '.'),
|
||||
('export_wxwork_messages.py', '.'),
|
||||
('wxwork_crypto.py', '.'),
|
||||
('key_scan_common.py', '.'),
|
||||
('key_utils.py', '.'),
|
||||
('batch_decrypt_images.py', '.'),
|
||||
('monitor.py', '.'),
|
||||
('mcp_server.py', '.'),
|
||||
]
|
||||
|
||||
binaries = []
|
||||
hiddenimports = []
|
||||
hiddenimports = [
|
||||
# 显式列, 避免 PyInstaller 漏 detect 导致打包后 import 报错
|
||||
'Crypto', 'Crypto.Cipher', 'Crypto.Cipher.AES',
|
||||
'zstandard',
|
||||
'pilk',
|
||||
]
|
||||
|
||||
# pilk 是 SILK 解码扩展, 需要把它的资源全收
|
||||
tmp_ret = collect_all('pilk')
|
||||
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['app_gui.py'],
|
||||
['monitor_web.py'], # ← 入口从 app_gui.py 改成 monitor_web.py
|
||||
pathex=[],
|
||||
binaries=binaries,
|
||||
datas=datas,
|
||||
@@ -36,7 +82,7 @@ exe = EXE(
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True,
|
||||
console=True, # 保留 console 显示后端日志 + 错误
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
|
||||
Reference in New Issue
Block a user