微信人格与关系洞察(wechat-persona-insight)
在已解密的微信本地 vault 之上做行为与语言模式分析。定位:分析层——数据获取/解密归 yichen-wechat-local-vault,本 skill 负责"从消息到人格结论"。
数据层硬坑(必读,全部实测踩过)
先读 references/pitfalls.md。核心五条:
- 消息分布在
message/message_0.db和message/message_1.db两个库,只查一个会漏整段时间的数据。 real_sender_id是各库自己的 Name2Id 表 rowid,两个库映射不同,必须分库解析身份。- 消息体可能是 zstd 压缩的 BLOB,压缩标志列名是
WCDB_CT_message_content,不是compression_flag。 - 会话表名 =
Msg_ + md5(username);群名在contact表的nick_name,session 表里的 name/summary 只是消息预览。 chatroom_member只有当前成员,查历史发言必须在群 Msg 表里按 sender rowid 反查。
前置检查与数据获取(一键)
python3 <SKILL_DIR>/scripts/chat_stats.py vault # 只检查
python3 <SKILL_DIR>/scripts/bootstrap.py --yes # 缺数据时一键打通
bootstrap 的行为:已有密钥且仍有效 → 自动增量刷新;缺密钥/密钥失效(微信升级后 salt 轮换)→ 自动完成"复制重签名副本(含 chmod/xattr 坑修复)→ 优雅退出原版 → frida 抓密钥 → 全量解密"。抓密钥阶段会弹系统通知,需要用户在 240 秒窗口内于副本中打开「收藏」和「朋友圈」——模型此时必须明确告知用户这个操作要求,然后等待。
关于"不重签名能不能拿到":不能,已实测。原版微信启用 Hardened Runtime(腾讯团队证书),frida attach 和 spawn 均返回 PermissionDeniedError;SIP 开启时 root 也无法注入此类进程。重签名副本是唯一不关 SIP 的路径。
三种分析场景
场景 A:两两关系深度分析("分析我和XX的关系"、"XX能不能深交")
- 定位会话:
chat_stats.py find "名字"(支持备注/昵称/群名模糊匹配,返回 username)。 - 结构统计:
chat_stats.py chat <username>→ 方向比、会话发起比(>6h 间隔)、双方回复延迟、月度方向演变、时间跨度。这些数字直接回答"谁主导、谁更主动、关系冷热走势"。 - 关系探针:
relation_probe.py probe <username>→ 主题密度(炒股/工作/生活)、请求:付出比、金钱往来、第三人提及、对方全部群足迹(含已退群)、被反驳后的反应链。 - 深挖验证:对探针标记的信号,用
relation_probe.py context <username> --start "YYYY-MM-DD" --end ...拉原文时间线,结论必须引用原文。 - 抢功检测(工作关系必做):
relation_probe.py claims <username>把对方在群里所有成果型发言与你私聊 48h 内的前驱消息交叉对照。 - 输出:数据表 + 原文证据 + 公平校准段(对方真实优点,防止单侧叙事)+ 边界建议。
场景 B:自我画像("总结我的性格/弱点")
- 全景排名:
chat_stats.py top→ 你在全部会话的发言量排名,识别高频关系。 - 模式扫描:
pattern_scan.py all(或指定会话)→ 答应:拒绝比、付出:求助比、情绪词、All-in/冲动表述、FOMO 语句、提问率、时段分布。 - 亲疏矩阵:
pattern_scan.py closeness→ 对不同联系人的平均消息长度、情感词密度对比——检验"亲疏倒置"。 - 跨会话验证:单会话发现的模式(如全仓思维)要在 ≥3 个会话复现才能升级为"人格特征",否则只是情境行为。
- 输出:一个贯穿性结构(不是缺点清单)+ 真实优势校准 + 可执行的落地路径(配额/规则式,不是"要注意"式)。
场景 C:全关系网画像
A+B 的组合:先 top 排名 → 对 top 会话批量跑 pattern_scan → 识别关系类型(至亲/消耗/协作/工具)→ 综合画像。报告落在 docs/analysis/。
分析纪律(防自嗨)
- 每个人格结论必须有:统计数字 + 原文引用 + 出现频次。三者缺一不算结论。
- 语言模式用正则初筛后必须抽查原文确认语境("操"可能是语气词不是情绪失控)。
- 结论分"结构"和"事件"两层:结构(长期比例、分布)权重高于单次事件。
- 对被分析对象的负面结论要主动找反证(他给过什么 credit、付出过什么)。
- 分析用户本人时同样执行:弱点必须配真实优势校准。
- 健康相关信号(如自述疼痛、失眠)只呈现证据原文,提醒就医,不做医学判断。
报告规范
- 保存到项目
docs/analysis/YYYY-MM-DD-主题.md。 - 结构:一句话画像 → 数据总览 → 证据分层呈现 → 公平校准 → 落地建议。
- HTML 可视化报告:分析完成后把结论写成 insights JSON(字段:
headline/paragraph/findings[]{title,detail,stats,quotes} /fairness/advice[]/plain{headline,paragraph,advice}(说人话版,报告下半部分用普通人能懂的自然语言重述) /relations{名字:{headline,findings,advice}};每条结论必须带统计数字与原文引用),然后report_ui.py --deep "名字" --insights <json> --out docs/analysis/wechat-insight-report.html。 未注入 insights 时报告只有数据无结论(脚本会提示);insights JSON 与报告同存于docs/analysis/。 - 隐私:聊天原文只进本地报告文件;对话回复里少量引用必要原文即可;密钥/salt/wxid 不出现在报告中。
脚本清单
| 脚本 | 用途 |
|---|---|
scripts/bootstrap.py |
一键获取层:环境检查 → 密钥有效性检测(短路增量)→ 重签名副本+坑修复 → 退出原版 → frida 抓密钥 → 解密 → 验证 |
scripts/insight_lib.py |
共用库:进程内 import 上游 vault_cli,方向判断 is_me()(上游把你标为显示名而非"我") |
scripts/chat_stats.py |
vault / find / chat <username> / top 四个子命令,结构统计 |
scripts/pattern_scan.py |
all / <username> / closeness 自我语言模式扫描 |
scripts/relation_probe.py |
关系探针:probe / claims(抢功对照)/ context(原文时间线) |
scripts/report_ui.py + assets/template.html |
生成单文件 HTML 可视化报告(深色仪表盘,零外部依赖零网络请求;周×小时热图、月度输出曲线、全部模式类别可展开证据、关系深析含金钱往来线索),--deep "名字" 可重复深挖,--insights <json> 注入模型结论区,--demo 生成纯合成数据的示例报告(README 展示用,不访问 vault),wxid 全量脱敏 |
脚本只出数不解读;人格判断由 AI 基于本 SKILL.md 的纪律执行。