# WeChat Viewer — 开发日志 2026-07-08 ## 环境 - 设备: Pixel 10 Pro Fold, Android 16 - 路径: ~/wechat-viewer/ - 访问: http://192.168.110.174:5000 (局域网 Mac) - 进程: python3 app.py (proc_2a6f885e1cfb) - 重启脚本: bash ~/wechat-viewer/restart.sh ## 架构原则 - **Skill 驱动**: 所有智能任务通过 Hermes CLI 子进程 + skill 执行,不写死 Python 逻辑 - **子进程模式**: `hermes chat -q "prompt" -s --yolo -t terminal,web,file` - **Skill 迭代优于代码迭代**: 改 skill 不需要重启 Flask ## 今日完成的功能 ### 1. 文章列表 (articles) - 导航栏「数据中心」→「文章列表」 - 从 WeChat DB 提取所有 type=49 公众号文章 - **去重**: 用 `__biz|mid|idx|sn` 四元组,解决同一文章不同追踪参数导致的重复 - **热度**: 显示每个文章被几个群引用过,列出群名 - **筛选**: 按标题搜索、按群筛选 - **排序**: 时间正倒序、热度正倒序 - **按钮**: 📝摘要 🔧学习 🖼图片 ### 2. 日报系统 (reports) - 三种类型标签: 群日报、文章摘要、学习记录 - **生成日报**: 从消息浏览页或聊天页触发 → Hermes CLI + wechat-group-digest skill - **生成图片**: 每个日报→Hermes CLI + gpt-image-gen skill → 19世纪复古铜版画风格 → 存日报图片列表 - 筛选: 全部/群日报/文章摘要/学习记录 - 搜索 + 时间排序 ### 3. 日报图片 (report-images) - 查看/删除/发送微信 - **发送微信**: 直接调 wechat_hook_send.send_image_via_hook,不走 Hermes 子进程 - 图片弹窗预览,点击空白关闭 - 联系人选择弹窗,按最新消息排序 ### 4. 文章摘要 + 学习构建 - `/api/articles/summarize` → Hermes CLI → 提取核心观点 → 存日报 - `/api/articles/learn` → Hermes CLI + learn-and-build skill → 分类处理 → 存日报 - `/api/articles/generate-image` → Hermes CLI + gpt-image-gen → 存日报图片 ### 5. 聊天页增强 - 文章卡片下方增加 📝摘要 🔧学习 🖼图片 按钮 - 视频号完整解析(提取昵称/描述/封面/时长) - CDATA 全局清理 ### 6. 创建的 Skill - `learn-and-build` — 学习文章 → 构建/迭代 Hermes skill - `headroom-context-compressor` — Headroom 上下文压缩集成方案 ### 7. UI 改造 - 所有列表页可滚动 (body overflow-y:auto) - 按钮移至卡片底部,大号适合移动端 - 日报类型彩色标签 ## 关键 bug 修复 - 文章去重: URL 追踪参数 → 四元组 key - 发送图片: closeSendModal 先清空 currentImageId 导致 fetch URL 为 null → 先保存后关闭 - 发图超时: Hermes 子进程 60s TIMEOUT → 改直调 wechat_hook_send - 聊天页文章卡片空白: patch 误删 HTML 主体 → 重写 ## 技术栈 - Flask + Jinja2 + SQLite - wechat_db (su sqlcipher 读微信加密数据库) - local_db (circle.db 存日报/图片/记录) - Hermes CLI 子进程调度 - wechat_hook_send (LSPosed hook 发图)