妈妈的消息
一句话:把一段家人聊天记录变成一个数字、一个标签、一句可以发出去的话。
用户不需要 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.pyvalidate.pystats.pyrender.pycompare.pyredact.py,只用标准库,不联网assets/— 报告和两张卡片的 HTML 模板
隐私(先于一切)
- 只读用户给的截图 / 文件。不解密微信数据库,不联网,不把记录存到任何用户没要求的地方。 脚本产物(messages.json / stats.json / reports/)都在当前目录,告诉用户在哪、可以随时删。
- 报告不复述整段原文,只引用短句。转账只记次数不记金额。
- 用户没打码:提醒一次"名字和敏感内容可以先用
scripts/redact.py打掉",不重复。 - 用户问"会不会泄露":如实回答——你在哪个工具里跑,记录就发给了谁;脚本本身不发任何东西。
第一步:拿到记录
先问有没有电脑版微信。 导出文件比截图好太多——半年的记录一次拿全,时间戳完整,不用一屏一屏截、也不用 AI 逐张转录(几十张截图只能覆盖几百条,还容易转错)。
优先级:
- 导出文件(首选):用 WeFlow(微信 4.0+)或留痕 / WeChatMsg / PyWxDump(微信 3.x)把和这一个人的记录导成 JSON / CSV / TXT,
scripts/parse_export.py认得。具体分平台的步骤在references/export-guide.md,按用户的情况答对应的一段,不要一次念完。 - 截图(兜底):只有手机、用 Mac、或者不想在电脑上装东西时用。微信 / QQ / 短信都行,安卓可以用长截图。
- 直接粘贴的文本。
用户什么都没给,只说"想分析我和我妈的聊天",先问一句:
你电脑上装微信了吗?装了的话我教你把和她的记录导出来,一次能拿全半年的,比截图准得多。只有手机也行,那就截图——从最近往上翻,每一屏截一张。
走截图路径时再补:相邻两张有一两条重叠最好;十几张能出报告,三四十张数字才稳;名字和敏感内容可以先打码。
第二步:确认两个人
- 哪边是用户,哪边是家人。 微信截图右侧绿色气泡是用户,左侧白色是对方。导出文件看发送者字段。分不清就问一次。
- 对方是谁、怎么称呼、用"她"还是"他"。 用户说"我妈"用"妈妈/她",说"我爸"用"爸爸/他",说"外婆"用"外婆/她"。报告标题、类型名、节日(母亲节/父亲节)全部跟着换。skill 叫"妈妈的消息",但一半用户会拿来分析爸爸。
- 生日(可选):她的和用户的(MM-DD),进节日记分牌和倒计时。
第三步:转成工作表
目标是 messages.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:它会检查格式、时间顺序、疑似重复(相邻截图重叠没去掉)、转账有没有写金额,并打印条数和时间范围。把这份摘要给用户确认,再算。
导出路径(首选):
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 不导出语音秒数,"最长语音"这项会缺,正常。
第四步:算数
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。
第七步:出报告和卡片
python scripts/render.py stats.json narrative.json --out reports/
三个文件:完整报告、亲情账单卡(用户自己发)、发给她的卡。告诉用户用浏览器打开、截图,卡片是竖版的。发给她的卡是这个产品真正的出口——如果只推荐一个,推荐它。
附加入口
练习模式(用户说"练习""陪我练""扮演我妈")→ 读 references/practice.md。AI 用她的说话方式跟用户聊 10 回合,用户回"嗯"当场标出,最后打分。需要 ≥ 40 条记录。
对照组(用户说"和朋友比比""我回谁更快")→ 让用户再给一组和朋友的截图,走同样流程出 friend-stats.json,然后:
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里找到 - "她其实想说的是"每句判断能指到一条原话或一个数字
- 类型那句引了原话
- 发给她的那条有具体时间
- 全文没有黑名单短语,没有"敷衍""不孝""应该",没有感叹号
- 称呼和她/他没串,节日按人选
- 没写任何转账金额
- 数据说明写了截图断层和无时间戳条数