微信群简报生成(wechat-group-digest)
目的
把微信群里散落的文本/图片消息,整理成一份可直接发群的简报(默认叫"X 期专场",如"周日闲置专场")。
覆盖全链路:解密微信 4.x 本地数据库 → 定位目标群 → 解析消息与真实昵称 → 提炼条目 → 配图 → 输出带图版 HTML + 文字版。
何时使用
- "把这周群里的闲置信息整理成一期专场"
- "群里有新闲置,重新整理一版"
- "读一下 XX 群的聊天记录"
- 需要拿到群成员的真实群昵称(而非 wxid)
环境依赖
- Python 3.10+,需
pycryptodome、zstandard - Windows 微信 4.x(进程名
Weixin.exe),需已知其数据目录 - 提取密钥时需要管理员权限(读取微信进程内存)
pip install pycryptodome zstandard
工作流
Step 0 · 确定微信数据目录
数据根目录为 xwechat_files/<wxid_xxx>/db_storage。若不确定,先确认微信「设置 → 文件管理」中的保存位置。
把该路径写入 ~/.wechat-cli/config.json 的 db_dir,后续脚本会自动读取:
{ "db_dir": "D:/.../xwechat_files/wxid_xxx_xxxx/db_storage" }
> 也可用 --db-dir 显式传入,避免改配置文件。
Step 1 · 提取数据库密钥(生成 all_keys.json)
# 首选:工具自带 extract(4.1+ 走运行时 Config.Cipher 扫描 + HMAC 校验)
python scripts/wcdb_key_tool_windows.py extract --output ~/.wechat-cli/all_keys.json
若 extract 失败或库不全,走兜底路线(需管理员权限):
python scripts/dump_config_blobs.py --db-dir <db_storage> # 扫内存 dump Config.Cipher blobs
python scripts/gen_keys.py --db-dir <db_storage> # blobs → all_keys.json
产出 ~/.wechat-cli/all_keys.json(每库含 enc_key / salt / size_mb)。
密钥与账号绑定,换账号/换机器需重新提取。
Step 2 · 定位目标群
python scripts/wechat_db.py groups # 列出所有群(username / 消息表名 / 条数 / 成员数)
python scripts/wechat_db.py groups --match 闲置 # 按名称过滤
- 群 username 形如
12345678@chatroom;其消息表名 ="Msg_" + md5(username) - 消息可能落在
message_0/1/2.db任一分片,脚本会自动定位
Step 3 · 读取群消息
python scripts/wechat_db.py read --group <群username> --out msgs.json
python scripts/wechat_db.py read --group <群username> --min-id 316 # 只读新增
python scripts/wechat_db.py read --group <群username> --since 2026-10-09 # 按日期
python scripts/wechat_db.py members --group <群username> # 导出成员昵称表
脚本会:解密最新库(源文件更新则自动重解)→ 解压 zstd 消息体 → 把 wxid: 前缀换成人话昵称 → 按类型分类(text/img/emoji/card/voice/sys)→ 写 msgs.json。
读到消息条数与群里实际不符时:微信库在运行时会持续写入,需重新执行本步(脚本按源文件 mtime 自动重解密最新版)。
Step 4 · 提炼条目并整理成 items.json
阅读 msgs.json,按业务语义把消息归入各栏目(转让/求购/互换/新上架/喜报…),写成 items.json。
格式见 assets/items.example.json,完整字段说明与写作规范见 references/bulletin_style.md。
要点:
- 用真实群昵称标注发布人(已在 msgs.json 的 sender 字段)
- 把"求购"与"转让"中能对上的显式撮合
- 第 1 期与后续期口吻不同("开张第一周" vs "本期又有新宝贝")
Step 5 · 配图(重要:不要尝试解密 .dat)
群内图片在本地是加密的 .dat,全自动解密已系统性验证为不可行——详见 references/dat_encryption.md(含已穷尽的路线清单,勿重复投入)。
正确做法:
1. 请用户在微信中打开群,逐张长按/右键「保存图片」
2. 用户把保存的图片拖入对话
3. 复制到 专场图片/ 目录并语义化命名(01_物品_发布人.jpg),文件名与 items.json 的 img 字段一一对应
无图片时,img 字段留空,脚本会渲染成纯文字卡。
Step 6 · 渲染输出
python scripts/render_bulletin.py items.json -o 周日闲置专场_第N期_带图版.html
同时手写一份 .md 纯文字版(模板见 assets/bulletin_text_template.md),供直接粘贴到微信群。
最后用 present_files 把 HTML 与 md 一起交付给用户。
脚本清单
| 脚本 | 作用 |
|---|---|
scripts/wcdb_key_tool_windows.py |
[第三方] 微信库密钥提取 + 批量解密(命令行工具) |
scripts/dump_config_blobs.py |
[兜底] 扫进程内存 dump Config.Cipher blobs |
scripts/gen_keys.py |
[兜底] blobs → ~/.wechat-cli/all_keys.json |
scripts/wechat_db.py |
★ 解密库、列群、导出成员、读群消息 → JSON |
scripts/render_bulletin.py |
★ items.json → 带图版 HTML |
参考资料
| 文件 | 内容 |
|---|---|
references/db_schema.md |
微信 4.x 库/表结构、SQLCipher4 解密要点、消息类型 |
references/dat_encryption.md |
.dat 图片加密结构与"为何不可全自动解密" |
references/bulletin_style.md |
简报栏目结构、写作口吻、items.json 字段 |
references/security_and_permissions.md |
权限声明、数据边界与安全自查记录(发布审查用) |
权限与数据边界
- 只读本机:微信加密库(只读)、微信进程内存(只读,仅为提取不落盘的数据库密钥,需管理员权限)、
tasklist进程查询。 - 写本机:密钥缓存
~/.wechat-cli/all_keys.json、解密库副本(工作缓存目录)、简报输出文件。 - 绝不:无网络请求;不修改/删除微信原始数据;不读取微信以外的进程;不上传任何数据。
- 边界:仅限读取用户本人账号、本人设备上的聊天记录做个人整理。详见
references/security_and_permissions.md。
|assets/bulletin_template.html| 带图版 HTML 模板(含灯箱) |
|assets/bulletin_text_template.md| 文字版模板 |
|assets/items.example.json| items.json 示例 |
常见陷阱
- 别用 PBKDF2 二次派生:
all_keys.json里的enc_key已是派生后的 32B raw key - page1 解密要跳过 16B salt,IV 取自页面尾部
[4096-80, 4096-64) message_content需 zstd 解压(魔数28 b5 2f fd),否则读不出<img>等标签- 本地
.dat文件名与消息 XML 的md5无对应,不要用文件名去匹配密钥 - 微信运行时库会变化:每次读之前重新解密(脚本已按 mtime 自动处理)
- 图片走"手动保存",别在
.dat解密上浪费时间