wechat-viewer 集成改动(环节4 策略 + 审批/白名单 UI)
落地在手机端 Flask 应用
~/wechat-viewer(该 app 有自己的 git 工作树,本文件只记录本次为 微信自动回复新增的部分;两个新模板全文见同目录viewer_templates/)。
新增数据表(local_db.py init_db)
CREATE TABLE reply_whitelist ( -- 自动回复白名单
id INTEGER PK, kind TEXT, -- 'contact'|'group'
wxid TEXT UNIQUE, name TEXT, added_at TEXT);
CREATE TABLE reply_queue ( -- 策略判定后落地
id INTEGER PK, msg_id INTEGER, talker TEXT, sender TEXT, sender_name TEXT,
kind TEXT, incoming TEXT, draft TEXT,
action TEXT, -- 'auto'|'review'
reason TEXT,
status TEXT, -- pending|sent|cancelled|auto_sent|failed
created_at TEXT, sent_at TEXT);
local_db.py 新增辅助函数:whitelist_list/add/remove/wxids、reply_add/list/get/update。
新增路由(app.py)
| 路由 | 作用 |
|---|---|
GET /whitelist |
白名单管理页 |
GET /api/whitelist / POST /api/whitelist / POST /api/whitelist/<id>/delete |
白名单增删查(xxx@chatroom 自动识别为群) |
GET /approvals |
自动回复审批页 |
GET /api/replies?status= |
队列列表(pending / sent / auto_sent / cancelled / 全部) |
POST /api/reply/<id>/send |
用(可编辑的)草稿发到会话 → send_text_via_hook(talker,text) → 标 sent/failed |
POST /api/reply/<id>/cancel |
标 cancelled |
GET /api/contacts |
弹窗默认列表:会话过的联系人+群(排除公众号),去重带昵称,最近排序 |
GET /api/contacts/search?q= |
按名字/wxid 搜全量 rcontact+群(wechat_db.search_talker) |
POST /api/whitelist(升级) |
支持批量 {items:[{wxid,name,kind}]}(弹窗多选) |
GET /api/auto_send |
读自动发总开关(policy_config.json 的 auto_send_enabled) |
POST /api/auto_send |
设总开关 {enabled:bool};只翻转该字段保留其余 |
自动发总开关搬进 UI(2026-07-12):/whitelist 页顶部加开关卡片(读 /api/auto_send,
拨动 POST 回写)。开=白名单可自动发(敏感词仍强制转人工),关=全部进审批。开启时前端二次确认。
policy_config.json 是 root 属主 644,viewer(termux 用户)可直接读、写时经 _write_auto_send
写 tmp 再 su cp 回(沿用本 app 的 su 模式,只改 auto_send_enabled 不动 block_keywords 等)。
orchestrator 每轮 load_config() 读文件即时生效,无需重启。
白名单选人弹窗(2026-07-10 升级):/whitelist 页「添加」不再手填 wxid,改为弹窗:
默认列出你会话过的联系人/群(带昵称),顶部搜索框可查全量通讯录/群,复选框多选,
【添加所选】批量入库。白名单列表显示 昵称 + wxid/群id + 类型徽章。解决「不知道 wxid」的问题。
发送复用 ~/.hermes/event_bus/wechat_hook_send.py 的 send_text_via_hook(LSPosed 内部 API 广播 SEND_MSG_INTERNAL)。
新增页面(templates/,见 viewer_templates/)
approvals.html:待审批列表,每条含对方原文 + 可编辑草稿框 + 【✅发送】【🗑取消】;另有已发送/自动已发/已取消筛选 tab。whitelist.html:白名单增删列表。
base.html 抽屉导航加两个入口:✅自动回复审批 / ⭐回复白名单。
真机验证(2026-07-10)
- 页面
/whitelist/approvals均 200。 - 白名单:加「测试好友」→ 列表可见 → 删除 OK。
- 审批:插入 pending →
/api/replies返回 → 点发送 →send_text_via_hook广播到 filehelper(result=0, status=sent)→ 草稿按编辑后内容更新、状态转 sent、sent_at 记录。 - 取消:pending → cancel → status=cancelled。
- 测试数据已清空。
待接(环节5 / 编排)
- 编排器:把环节1 队列
incoming.jsonl→ 上下文 → Hermes 生成 → 策略decide()(白名单读reply_whitelist)→ auto 直接send_text_via_hook并reply_add(status=auto_sent)/ review 写reply_add(status=pending)。 - 群 @回复的
@昵称前缀、原生引用气泡(A11y)。