# Mama Message

> 《妈妈的消息》—— 把用户和妈妈（或爸爸、外婆、任何家人）的聊天截图或导出记录算成一份报告：三个指数（牵挂 / 嗯哦好 / 不计较）、消息成分表、类型鉴定和综合评级、她的黑话翻译表、节日记分牌、她发了你没回、该打电话了的信号、她其实想说的是、今晚就做的三件事、帮你回、亲情账单，以及一条可以直接发给她的话；另有练习模式（AI 用她的说话方式陪你练回复）和对照组（你回朋友多快、回她多快；妈 vs 爸偏心报告）。只要用户提到想分析和父母/家人的聊天、上传了家人聊天截图、问自己是不是在敷衍爸妈、想看看妈妈多久发一次消息、说"看看我和我妈的聊天"、要练习怎么回爸妈、想比较自己回谁更快，或者只是丢来一堆家人聊天截图什么都没说，就用这个 skill，即使没有出现"报告"或"分析"这两个词。

- Skill: `bluesky0329/mama-message` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add bluesky0329/mama-message`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bluesky0329/mama-message/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: BlueSky0329 (https://skillmd.com/u/bluesky0329)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/bluesky0329/mama-message

---


# 妈妈的消息

一句话：把一段家人聊天记录变成**一个数字、一个标签、一句可以发出去的话**。

用户不需要 AI 来告诉他妈妈爱他。他需要的是三样东西：① 他从来没数过的数字（"你回了 38 次'嗯'"）；② 一个台阶（"软件说我欠你一个电话"比"我想你了"容易发出去）；③ 一张能晒的图（晒愧疚 = 晒良心）。报告的每个模块都在服务这三件事。它不是心理学分析，妈妈不需要依恋类型。

流程：拿到记录 → 确认两个人 → 转成 `messages.json` → `stats.py` 算数 → 问三个问题 → 写文字 → `render.py` 出报告和卡片。练习模式和对照组是附加入口。

支持文件在这个目录下，按需读：
- `references/metrics.md` — 每个数字怎么算（用户问"这个怎么算的"看这里）
- `references/types.md` — 10 个她的类型 + 6 个你的类型 + 五档评级
- `references/dictionary.md` — 黑话翻译表的基础词典和生成规则
- `references/writing-rules.md` — 文字部分的规矩、反 AI 黑名单、什么时候要收着
- `references/report-template.md` — 报告模板和 narrative.json 字段
- `references/practice.md` — 练习模式
- `references/export-guide.md` — 分平台的导出 / 截图指南（用户问"怎么导出"看这里，先推荐截图）
- `scripts/` — `parse_export.py` `validate.py` `stats.py` `render.py` `compare.py` `redact.py`，只用标准库，不联网
- `assets/` — 报告和两张卡片的 HTML 模板

---

## 隐私（先于一切）

- 只读用户给的截图 / 文件。**不解密微信数据库，不联网，不把记录存到任何用户没要求的地方。** 脚本产物（messages.json / stats.json / reports/）都在当前目录，告诉用户在哪、可以随时删。
- 报告不复述整段原文，只引用短句。转账**只记次数不记金额**。
- 用户没打码：提醒一次"名字和敏感内容可以先用 `scripts/redact.py` 打掉"，不重复。
- 用户问"会不会泄露"：如实回答——你在哪个工具里跑，记录就发给了谁；脚本本身不发任何东西。

---

## 第一步：拿到记录

**先问有没有电脑版微信。** 导出文件比截图好太多——半年的记录一次拿全，时间戳完整，不用一屏一屏截、也不用 AI 逐张转录（几十张截图只能覆盖几百条，还容易转错）。

优先级：

1. **导出文件**（首选）：用 WeFlow（微信 4.0+）或留痕 / WeChatMsg / PyWxDump（微信 3.x）把和这一个人的记录导成 JSON / CSV / TXT，`scripts/parse_export.py` 认得。具体分平台的步骤在 `references/export-guide.md`，按用户的情况答对应的一段，不要一次念完。
2. **截图**（兜底）：只有手机、用 Mac、或者不想在电脑上装东西时用。微信 / QQ / 短信都行，安卓可以用长截图。
3. **直接粘贴的文本**。

用户什么都没给，只说"想分析我和我妈的聊天"，先问一句：

> 你电脑上装微信了吗？装了的话我教你把和她的记录导出来，一次能拿全半年的，比截图准得多。只有手机也行，那就截图——从最近往上翻，每一屏截一张。

走截图路径时再补：相邻两张有一两条重叠最好；十几张能出报告，三四十张数字才稳；名字和敏感内容可以先打码。

## 第二步：确认两个人

- **哪边是用户，哪边是家人。** 微信截图右侧绿色气泡是用户，左侧白色是对方。导出文件看发送者字段。分不清就问一次。
- **对方是谁、怎么称呼、用"她"还是"他"。** 用户说"我妈"用"妈妈/她"，说"我爸"用"爸爸/他"，说"外婆"用"外婆/她"。报告标题、类型名、节日（母亲节/父亲节）全部跟着换。skill 叫"妈妈的消息"，但一半用户会拿来分析爸爸。
- **生日**（可选）：她的和用户的（MM-DD），进节日记分牌和倒计时。

## 第三步：转成工作表

目标是 `messages.json`：

```json
{"me": "我", "her": "妈妈", "her_pronoun": "她", "source": "screenshots",
 "messages": [
   {"ts": "2026-05-12T21:03:14", "sender": "her", "type": "text", "content": "吃饭了吗", "dur": null},
   {"ts": null, "sender": "me", "type": "text", "content": "吃了", "dur": null},
   {"ts": "2026-05-12T21:05:00", "sender": "her", "type": "voice", "content": "", "dur": 23}
 ]}
```

`type` ∈ text / voice / image / video / sticker / transfer / link / call_voice / call_video / recall / location / file。语音和通话把秒数写进 `dur`。`link` 的 `content` 放标题。转账 `content` 只写"转账"，**不写金额**。

**截图路径**：逐张转录。规则——
- 相邻截图重叠的消息只记一次，按内容和位置对齐，不靠猜。
- 微信只在间隔较久时显示时间戳。有时间戳的填 `ts`；没有的填 `null`（脚本会计数但不参与时间计算）。不要给没时间戳的消息编时间。
- 语音记秒数，表情包记 `sticker`（内置表情如 [玫瑰] 放 `content`），转账记次数。
- 截图太糊或中间明显缺一段：转能看清的，在数据说明里写。不为了报告好看补数据。
- 转录完跑一遍 `python scripts/validate.py messages.json`：它会检查格式、时间顺序、疑似重复（相邻截图重叠没去掉）、转账有没有写金额，并打印条数和时间范围。把这份摘要给用户确认，再算。

**导出路径**（首选）：

```bash
python scripts/parse_export.py 导出文件 --her 记录里的名字 --call 妈妈 --out messages.json
# 不知道对方在记录里叫什么：先不加 --her 跑一次，脚本会列出名字
# 记录跨了好几年：加 --since 2026-01-01（或 --last-days 180）只取最近一段，报告更有针对性
```

WeFlow 的导出**格式选 JSON**（自带 isSend 发送方标记，不用填 --her；TXT 和 weclone CSV 也认，但信息少一些）。WeFlow / 留痕这类工具导出的是全量记录，可能有几万条。跨度太长的话报告会被稀释（"她最常问"变成三年的平均），默认建议取最近 6–12 个月。注意：WeFlow 不导出语音秒数，"最长语音"这项会缺，正常。

## 第四步：算数

```bash
python scripts/stats.py messages.json --out stats.json --today 2026-08-30 --her-birthday 10-20 --my-birthday 06-03
```

终端会打一份摘要，`stats.json` 里是全部数字。**报告里的每个数字都从这里来**，不自己心算。定义在 `references/metrics.md`。`stats.json` 里的 `warnings` 要照抄进报告末尾的数据说明。

没法跑脚本（比如在只有对话的环境里）：按 `metrics.md` 的定义手算最核心的几项——谁先开口、回复中位、短回复、没回、最常问、时段——其余标"需要导出记录才能算"。

## 第五步：问三个问题

算完先给用户看三个指数和鉴定结果（这是最有意思的部分，先给），然后问：

> 写最后一段之前问你三件事，都可以跳过：① 多久没回家了？② 她最近有没有什么事——身体、家里？③ 你们上次打电话聊了什么？

## 第六步：写文字

按 `references/writing-rules.md`。要写的：
- 三个指数各一句扎心话（数字 + 一个细节）
- 她的类型和你的类型各一句（引原话 + 数字）
- 黑话翻译表 6–10 条（她真说过的话，见 `dictionary.md`）
- 她转给你的：一句洞察（转了什么、和用户说过的什么有关）
- 她其实想说的是：120–220 字
- 今晚就做的三件事
- 帮你回：3 条
- 三句打电话的开场白
- 可以直接发给她的一条：60–100 字，**带具体时间**

先在对话里按 `report-template.md` 的 Markdown 模板给出完整报告，同时把文字写进 `narrative.json`。

## 第七步：出报告和卡片

```bash
python scripts/render.py stats.json narrative.json --out reports/
```

三个文件：完整报告、亲情账单卡（用户自己发）、发给她的卡。告诉用户用浏览器打开、截图，卡片是竖版的。**发给她的卡是这个产品真正的出口**——如果只推荐一个，推荐它。

---

## 附加入口

**练习模式**（用户说"练习""陪我练""扮演我妈"）→ 读 `references/practice.md`。AI 用她的说话方式跟用户聊 10 回合，用户回"嗯"当场标出，最后打分。需要 ≥ 40 条记录。

**对照组**（用户说"和朋友比比""我回谁更快"）→ 让用户再给一组和朋友的截图，走同样流程出 `friend-stats.json`，然后：
```bash
python scripts/compare.py stats.json friend-stats.json --labels 你妈 朋友 --mode friend
```
结论只有一行："你回朋友要 3 分钟，回你妈要 4 小时 12 分，差了 84 倍。"

**偏心报告**（用户给了爸妈两组）→ `--labels 妈 爸 --mode papa`。

**只要卡片**（用户说"做张卡片""给我张图"）→ 如果已经有 stats 和 narrative 直接 render；没有就走完整流程，卡片是流程的产物。

**帮你回**（用户说"帮我回她"）→ 只写"没回"清单的回复和三句开场白，不出整份报告。

---

## 什么时候要收着

从记录和用户语气里看，不用他明说。细则在 `writing-rules.md` 末尾，要点：
- 记录 < 20 条：只出数字，不写解读。
- 记录里有冲突、辱骂、控制、持续催婚要钱：中性描述两边的模式，不预设谁对，去掉"今晚三件事"和"发给她的那条"。
- 用户在难受、家里闹僵、或提到妈妈已经不在：先回应人，再问要不要继续；继续就去掉评级。
- 替别人分析：改第三人称。

任何情况下不给用户贴标签。"短回复"不是"敷衍"，"没回"不是"不孝"，评级是章不是判决。

---

## 出报告前自检

- 每个数字能在 `stats.json` 里找到
- "她其实想说的是"每句判断能指到一条原话或一个数字
- 类型那句引了原话
- 发给她的那条有具体时间
- 全文没有黑名单短语，没有"敷衍""不孝""应该"，没有感叹号
- 称呼和她/他没串，节日按人选
- 没写任何转账金额
- 数据说明写了截图断层和无时间戳条数

