1. 项目概述:一个能读懂你聊天记录的“情感军师”
最近在折腾AI Agent Skill的时候,我做了个挺有意思的东西,叫“她爱你吗?恋情分析室”。这玩意儿本质上是一个通用Agent Skill,但它干的事儿有点特别:它能自动解密你的微信数据库,把你和某个人的聊天记录从头到尾分析一遍,然后像个老道的“情感军师”一样,给你一份详尽的“关系诊断报告”。
你可能会想,这不就是个噱头吗?一开始我也这么觉得。但真正把它做出来、跑通,并且用自己(和一些朋友自愿提供的)数据测试了几轮之后,我发现它揭示的很多模式,确实是我们身处关系中容易“灯下黑”、自己察觉不到的。比如,谁总是那个主动开启话题的人?对方凌晨发的“想你”是心血来潮还是常态?那些“嗯”、“哦”、“好”背后,是不是藏着逐渐冷却的热情?更关键的是,它不止于统计,还融入了依恋类型理论、Gottman的关系健康指标和Sternberg的爱情三角理论这些心理学框架,试图去解释数据背后的“为什么”。
这个工具完全在本地运行,你的聊天数据不会上传到任何服务器。它适合任何对一段线上关系感到困惑、想要更客观视角的人,无论你是想确认对方的心意,还是想复盘一段已经结束的关系,它都能提供一个基于数据的、不带滤镜的参考。当然,我得把免责声明放在最前面:这只是一个基于文本模式的分析工具,结果仅供娱乐和参考,绝不能替代真实的情感沟通和专业的心理咨询。
2. 核心设计思路:从数据解密到关系洞察的完整链路
这个项目的核心目标很明确:把零散的、感性的聊天记录,转化为结构化的、可量化的关系洞察。为了实现这个目标,整个设计拆解成了几个清晰的阶段,每个阶段都解决了从技术到分析的关键问题。
2.1 技术基石:安全、无感的本地数据获取
一切分析的前提是拿到数据。直接去读微信本地的数据库文件是不可能的,因为它们都被加密了。这里没有重新发明轮子,而是巧妙地集成了开源项目ylytdeng/wechat-decrypt。它的原理很聪明:微信在运行时,解密密钥必然存在于内存中。这个工具通过扫描微信进程的内存,找到SQLCipher4的密钥,然后实时解密数据库文件。我的Skill脚本会自动克隆并调用这个解密器,对用户来说,整个过程是完全无感的,只需要确保微信是登录并运行的状态。
为什么选择这个方案?
- 非侵入性:不需要Root或越狱,不修改微信任何文件,风险极低。
- 实时性:分析的是最新的聊天记录,包括刚刚发生的对话。
- 本地化:所有解密、读取操作均在用户电脑上完成,从源头上杜绝了隐私泄露风险。这是整个项目的信任基石。
2.2 分析引擎设计:从统计到心理学的多层解读
拿到解密后的SQLite数据库(主要是message_N.db),接下来就是重头戏——分析。我设计了一个分层的分析引擎:
第一层:基础行为统计这是最直观的“硬指标”。脚本会提取指定联系人的所有文本消息,计算:
- 主动指数:谁发起对话的比例更高?是否存在一方连续发送多条消息(“消息轰炸”)的情况?平均回复速度差是多少?
- 情感投入指标:统计包含“爱”、“想你”、“晚安”、“早安”等关键词的频率和上下文。
- 冷淡信号:计算“嗯”、“哦”、“好”、“行”等单字或敷衍性回复的占比,以及“已读不回”的时长分布。
这些数据能勾勒出双方互动的基本模式,比如“总是我找她”、“她回得很慢但每次都会回”、“吵架后会有很长的沉默期”。
第二层:互动模式与动态分析这一层开始关注关系的“舞蹈”。
- 话语权分析:通过分析对话的回合、话题的发起与承接,量化谁是对话的主导者,谁更多地在附和或拓展对方的话题。
- 追逃循环识别:这是亲密关系中的经典模式。一方(追方)因焦虑而不断联系、质问,另一方(逃方)因压力而回避、沉默。脚本会尝试识别这种“要求-退缩”的模式循环,并标记出关键的触发点和升级点。
- 修复尝试分析:关系中出现冲突后,双方是如何尝试修复的?是一方主动道歉、示好,还是用幽默化解?另一方是接受修复,还是继续惩罚、冷漠对待?分析这些“修复尝试”的成功率,是预测关系能否长久的关键。
第三层:心理学框架诊断这是让分析从“描述现象”走向“解释原因”的一步。
- 依恋类型诊断:基于双方在聊天中表现出的行为模式(如对分离的焦虑、对亲密的回避、寻求安慰的方式),结合经典的依恋理论,给出安全型、焦虑型、回避型或恐惧-回避型的倾向判断。了解彼此的依恋类型,能极大帮助理解对方那些“不可理喻”行为背后的恐惧和需求。
- Sternberg爱情三角评估:从聊天内容中,评估这段关系中的激情(浪漫、性吸引、兴奋感)、亲密(信任、沟通、情感联结)和承诺(长期维持关系的决定)三个维度的强度,从而判断关系属于迷恋式、伴侣式、空洞式还是完整的完美式爱情。
- Gottman四骑士检测:这是婚姻关系研究大师约翰·戈特曼提出的四个预测关系破裂的负面沟通模式:批评、蔑视、防御和筑墙。脚本会检测聊天中是否频繁出现这些“危险信号”。
第四层:AI综合鉴定与军师建议最后,将所有统计数据、模式识别结果和心理学标签,连同一段时期内的完整聊天记录样本,提交给Claude这类大语言模型。AI的角色不是代替统计,而是进行“质性分析”:它能捕捉到统计数字无法涵盖的微妙语气、上下文矛盾、承诺与行动的差距等,最终整合所有信息,生成一份带有洞察力的结论和具体、可操作的建议(军师模式),比如“建议你下周减少主动发起聊天的频率,观察对方反应”或“对方目前处于情感封闭期,强行沟通可能适得其反”。
2.3 用户体验与呈现:一键操作与可视化报告
复杂的后台分析,必须配以极简的前端交互。设计原则就是“一键解决”。
- 统一入口:无论在Claude Code、Cursor还是Copilot中,用户只需要输入一条命令
/she-love-me。 - 自动化的环境准备:Skill脚本(
setup_check.py)会自动检查Python环境、安装依赖、克隆解密库,用户无需关心任何配置。 - 引导式联系人选择:解密后,脚本会按消息数量排序列出所有联系人,用户只需选择想分析的那一个。
- 双输出格式:
- 终端即时反馈:在AI聊天界面直接给出核心的鉴定指数(主动、被爱、冷淡指数)和关键结论,满足快速查看的需求。
- HTML详细报告:在
reports/目录下生成一个完整的、暗色风格的网页报告。里面包含了所有详细数据、交互式图表(用Chart.js绘制)、心理学诊断全文、危险信号列表以及军师的详细建议。这份报告可以保存、反复查看,甚至(在匿名化后)与他人讨论。
3. 实操部署与核心环节实现
理论说得再多,不如实际跑一遍。下面我就以在Claude Code环境中部署和运行为例,拆解每一个步骤和其中的关键细节。其他AI工具(Cursor, Copilot等)的流程几乎完全一致,只是Skill文件的存放路径稍有不同。
3.1 环境准备与项目获取
首先,你需要一个支持Skill的AI编程工具。我主要用Claude Code,因为它对Skill的支持非常直接。同时,确保你的微信(版本4.0以上)正在电脑上登录并运行,这是解密的前提。
Windows用户特别注意:你必须使用管理员身份打开终端或Claude Code,否则进程内存扫描这一步会因权限不足而失败。
打开终端,执行以下命令获取项目代码:
git clone https://github.com/863401402/she-love-me cd she-love-me这一步之后,项目目录里已经包含了所有需要的脚本,以及为不同AI工具准备好的Skill定义文件。
3.2 Skill的安装与激活
这是让AI工具认识/she-love-me这个命令的关键。不同工具存放Skill的路径不同:
- 对于Claude Code和OpenClaw:Skill文件位于
.claude/skills/she-love-me/SKILL.md。Claude Code通常会自动扫描项目目录下的.claude文件夹。如果你打开项目后,在聊天框输入/能看到she-love-me这个选项,就说明已经识别成功。如果没有,可以尝试重启Claude Code。 - 对于Cursor、GitHub Copilot、Gemini CLI:Skill文件位于
.agents/skills/she-love-me/SKILL.md。同样,打开项目文件夹后,这些工具通常会自动加载。
关键技巧:有时候AI工具不会立即识别新添加的Skill。一个可靠的方法是,在项目根目录打开终端,直接运行工具的命令行客户端,比如
claude(Claude Code)或cursor(Cursor),它们从命令行启动时,对当前目录的Skill加载往往更稳定。
3.3 核心运行过程详解
现在,在AI工具的聊天界面输入:
/she-love-me接下来,背后会发生一连串自动化的操作,我们可以通过查看终端输出或脚本日志来了解其过程:
第一阶段:环境自检与依赖安装setup_check.py脚本首先被触发。它会做以下几件事:
- 检查Python版本和必要包(
pymem,psutil,requests等)是否已安装。如果没有,会自动调用pip install。 - 检查
vendor/目录下是否存在wechat-decrypt项目。如果不存在,会自动执行git clone https://github.com/ylytdeng/wechat-decrypt vendor/wechat-decrypt。 - 检查微信进程:这是关键一步。脚本会遍历系统进程,寻找
WeChat.exe(Windows)或WeChat(macOS)。如果没找到,会明确报错提示“请先登录微信并保持运行”。这里我增加了一个重试机制,如果第一次没找到,会等待5秒再扫描一次,避免因启动延迟导致失败。
第二阶段:内存扫描与数据库解密decrypt_wechat.py脚本接管。它的任务是与wechat-decrypt交互。
- 定位微信进程:通过进程名找到微信的进程ID(PID)。
- 调用解密器:脚本会将微信的PID传递给
wechat-decrypt的可执行文件或Python脚本(根据平台不同)。解密器会扫描该进程的内存空间,寻找SQLCipher4的密钥模式。 - 解密数据库:找到密钥后,解密器会遍历微信的数据目录(通常在
文档/WeChat Files/<你的微信号>/Msg/),找到那些.db文件(如Message.db,Contact.db),并用密钥在内存中实时解密,将解密后的数据副本输出到项目data/目录下。重要提示:
wechat-decrypt项目本身可能涉及对内存和文件系统的底层操作。在macOS上,首次运行时系统可能会弹出权限警告,需要你手动在“系统设置-隐私与安全性”中允许终端或Python访问“完全磁盘访问”和“自动化”权限。请仔细阅读并授权。
第三阶段:联系人选择与数据提取解密成功后,list_contacts.py会读取Contact.db和Message.db,统计每个联系人的消息总数,并按此排序展示一个列表给你选择。选择后,extract_messages.py会从Message_1.db,Message_2.db...等分表中提取出与这位联系人的所有文本消息、时间戳、发送人信息,并保存为结构化的JSON或CSV文件,供后续分析使用。
第四阶段:多维度分析与报告生成这是最耗时的阶段,由stats_analyzer.py主导。
- 基础统计:快速计算消息总数、日均消息、活跃时段(生成24小时热力图)、对话长度分布等。
- 指数计算:
- 主动指数:遍历消息序列,如果一条消息距离上一条消息超过2小时,通常被认为是一个新对话的发起。统计双方发起对话的次数和比例。连续发送(间隔小于2分钟)超过5条记为一次“连轰”。
- 被爱指数:通过关键词匹配(如“想你”、“喜欢”、“爱你”、“晚安”、“早安”、“多穿点”、“吃饭了吗”)结合上下文(是否是对方主动发送)来评分。同时,对方主动发起对话的占比也是核心权重。
- 冷淡指数:计算敷衍词占比,并统计“已读不回”事件(对方在会话窗口,但超过X小时未回复,X可配置,默认为12小时)。
- 心理学模型分析:调用本地或API的大语言模型(如Claude),将统计结果、提取的典型对话片段、以及预设的心理学分析框架提示词一起发送。AI会返回对依恋类型、Sternberg三角、权力动态等的判断。
- 报告整合:
generate_html_report.py将上述所有结果,利用Jinja2模板引擎,填充到一个设计好的HTML模板中。这个模板内置了Chart.js,用于绘制消息量趋势图、活跃时段雷达图、双方占比饼图等。最终生成一个独立的、美观的report.html文件。
第五阶段:结果交付一切完成后,你会在AI聊天界面看到一份简洁的Markdown格式摘要,核心指数会用进度条直观展示。同时,脚本会给出HTML报告的文件路径,通常类似于./reports/analysis_20250415_102030.html,你用浏览器打开它,就能看到那份包含所有细节的完整诊断书了。
4. 各平台部署要点与问题排查
这个项目设计目标是跨平台,但Windows和macOS(以及未来的Linux)在具体实现上会遇到不同的问题。这里我把实战中遇到的坑和解决方案总结一下。
4.1 Windows平台:权限与路径
Windows是最稳定支持的平台,主要因为wechat-decrypt在Windows上的实现最成熟。
核心要点:
- 管理员权限:这是最大的拦路虎。如果不以管理员身份运行Claude Code或终端,在内存扫描阶段会直接失败,报“Access Denied”类错误。务必右键点击Claude Code或终端图标,选择“以管理员身份运行”。
- 微信版本:确保是WeChat 4.0+。旧版本的数据库结构或加密方式可能不同。
- 杀毒软件干扰:内存扫描行为可能被Windows Defender或其他杀毒软件误判为恶意行为。如果运行失败,可以尝试临时关闭实时防护,或者将你的项目目录和使用的Python解释器添加到杀毒软件的白名单中。
- 路径问题:微信默认数据目录在
C:\Users\<用户名>\Documents\WeChat Files\。如果你的微信安装或数据存储位置被修改过,wechat-decrypt可能找不到。这时需要根据解密器项目的说明,通过环境变量或配置文件指定路径。
常见错误与解决:
- 错误:
PermissionError: [WinError 5]- 原因:权限不足。
- 解决:百分百确认是以管理员身份运行。
- 错误:
Process ‘WeChat.exe’ not found- 原因:微信没运行,或者进程名不匹配(某些多开工具或国际版可能进程名不同)。
- 解决:登录微信。如果使用多开,确保扫描的是主进程。可以手动在任务管理器中确认进程名。
- 错误:解密成功但联系人列表为空
- 原因:解密出的数据库路径不对,或者
Contact.db损坏/不存在。 - 解决:检查
data/目录下是否生成了Contact.db文件。可以尝试用SQLite浏览器手动打开查看。也可能是微信数据异常,可以重启微信再试。
- 原因:解密出的数据库路径不对,或者
4.2 macOS平台:权限与签名
macOS的支持是实验性的,主要挑战来自系统严格的安全策略(SIP, Gatekeeper)。
核心要点:
- 终端完全磁盘访问权限:这是必须的。前往“系统设置” > “隐私与安全性” > “完全磁盘访问”,将你使用的终端(如Terminal, iTerm2)或IDE(如果直接从IDE内运行)添加到列表中。
- 自动化权限:运行过程中,如果弹出提示框请求“控制另一个应用”(即微信),必须点击允许。
- 签名问题:
wechat-decrypt的macOS版本可能是一个需要签名的可执行文件。如果来自非公证开发者,系统会阻止运行。- 解决1(推荐):按照
wechat-decrypt项目README的指引,使用codesign命令为其添加临时签名:sudo codesign --force --deep --sign - /path/to/wechat-decrypt-binary。 - 解决2:在“系统设置-隐私与安全性”中,找到并允许来自“已阻止开发者”的运行。
- 解决1(推荐):按照
- ARM vs Intel:确认你下载的
wechat-decrypt版本与你的Mac芯片架构(Apple Silicon或Intel)匹配。
常见错误与解决:
- 错误:
Operation not permitted- 原因:缺乏磁盘访问或自动化权限。
- 解决:按上述步骤检查并授予所有必要权限。
- 错误:
“wechat-decrypt”已损坏,无法打开- 原因:Gatekeeper阻止未签名或未公证的应用。
- 解决:使用
codesign签名,或在终端执行:sudo xattr -rd com.apple.quarantine /path/to/wechat-decrypt-binary移除隔离属性(有一定风险,请确保文件来源可信)。
- 错误:解密出的数据乱码或不全
- 原因:macOS版微信的数据结构或加密细节可能与Windows版有细微差别,上游解密器可能未完全适配。
- 解决:关注
wechat-decrypt项目的更新。目前macOS支持仍处于实验阶段。
4.3 通用问题排查清单
无论哪个平台,如果运行失败,可以按以下步骤排查:
- 看日志:脚本的关键步骤都有打印输出。仔细阅读错误信息,它通常能直接指出问题所在。
- 检查微信状态:确保微信在前台或后台运行,并且已经完成登录,处于可以收发消息的正常状态。
- 检查依赖:手动运行
pip install -r requirements.txt确保所有Python包已安装。特别注意pymem在非Windows平台可能需要源码编译,如果安装失败,可以尝试先安装python3-dev之类的开发包。 - 手动测试解密器:进入
vendor/wechat-decrypt目录,根据其README尝试独立运行解密命令。如果能成功解密出数据库,说明问题出在Skill的调用链上;如果失败,则是解密器本身的环境或权限问题。 - 检查Skill加载:确认你所在的AI工具正确识别了Skill。可以尝试在聊天框输入
/查看列表,或者直接输入Skill的完整路径进行测试。 - 清理缓存:有时旧的缓存数据会导致问题。可以尝试删除项目下的
data/和reports/目录(如果存在),然后重新运行。
5. 深度解析:分析模型的可配置性与局限性
为了让这个工具更有用,我在设计时预留了很多可配置的接口,同时也必须清醒地认识到它的边界在哪里。
5.1 关键参数与阈值调整
分析结果很大程度上依赖于预设的阈值。这些阈值在stats_analyzer.py中通常以变量的形式定义,你可以根据自己对关系的理解进行调整:
- 对话发起间隔:
CONVERSATION_START_INTERVAL = 7200(单位:秒,即2小时)。超过这个间隔,下一条消息被视为新对话的发起。对于热恋期或工作沟通频繁的关系,可以调小(如1小时);对于低频联系,可以调大。 - 消息轰炸阈值:
BOMB_THRESHOLD = 5和BOMB_INTERVAL = 120(秒)。在120秒内连续发送超过5条消息,计为一次“轰炸”。这个阈值用于衡量焦虑或兴奋程度。 - 已读不回判定时长:
SEEN_NO_REPLY_HOURS = 12。这个很主观,有些人觉得3小时就是冷暴力,有些人觉得24小时也正常。请根据你们平时的回复习惯调整。 - 关键词列表:
AFFECTION_KEYWORDS = [“想你”, “喜欢你”, “爱你”, “晚安”, “早安”, …]。你可以自由增删这里面的词,以适应你们之间独特的表达习惯。比如加入你们常用的昵称、暗号等。 - 敷衍词列表:
PERFUNCTORY_WORDS = [“嗯”, “哦”, “好”, “行”, “知道了”, “呵呵”]。同样可以自定义。
实操建议:不要只看默认配置跑出的结果。尝试用不同的阈值跑几次,观察哪些指标变化最敏感,这本身就能帮你更精细地理解你们之间的互动节奏。
5.2 心理学模型的提示词工程
让AI进行心理学分析,提示词(Prompt)的质量至关重要。在脚本中,提交给AI的提示词是精心设计的,通常包含:
- 角色设定:例如“你是一位资深的关系心理咨询师,擅长从沟通文本中分析互动模式。”
- 任务描述:清晰说明需要分析的数据(提供统计摘要和对话片段),以及需要应用的理论框架(如“请基于以下对话,评估双方的依恋类型倾向”)。
- 输出格式要求:明确要求结构化输出,例如“请按以下JSON格式回复:{“attachment_style_user”: “…”, “attachment_style_other”: “…”, “reasoning”: “…”}”。
- 限制与指导:强调“仅基于提供的文本”,“避免过度推断”,“如果证据不足,请注明‘无法判断’”。
你可以修改这些提示词,来引导AI进行更侧重某方面的分析,比如更关注冲突解决模式,或者更关注未来关系发展的建议。
5.3 工具的局限性、边界与伦理思考
在无数次测试和与朋友讨论后,我深刻认识到这个工具的局限性,这也是每个使用者必须明白的:
- 数据的片面性:它只分析文本聊天记录。而关系中大量的信息是通过语音语调、视频表情、面对面互动传递的。一个文字上的“嗯”,可能是敷衍,也可能是忙碌中的温柔回应。工具无法捕捉这些非文本信号。
- 上下文的缺失:它看不到聊天记录之外的现实世界。对方回复慢,可能是在开会、手机没电、家庭变故,而不仅仅是“冷淡”。AI的推断缺乏这部分关键背景。
- 模型的固有偏差:无论是统计模型还是大语言模型,都是在训练数据上学习的。它们可能无法理解非常小众、独特的文化或亚文化中的表达方式,也可能带有训练数据中存在的某种社会文化偏见。
- “测量即干预”:当你开始用工具测量一段关系时,你对待这段关系的心态和行为可能已经发生了微妙的变化。工具给出的“指数”和“诊断”,本身可能成为一种心理暗示,影响你的判断和后续行动。
因此,请务必牢记:
- 这不是真理:工具的输出是一个基于有限数据的、概率性的参考视角,绝不是对关系或个人的最终判决。
- 勿作恶:绝对不要在未经对方同意的情况下,分析他人的聊天记录。这是严重的隐私侵犯和不道德行为。这个工具的设计初衷是自我反思和自我觉察。
- 沟通优先:如果工具的分析结果让你感到不安或困惑,最好的方式永远是开诚布公地与对方沟通。工具可以帮你理清思路、发现问题,但解决问题必须依靠真实世界中的互动和对话。
- 寻求专业帮助:如果一段关系让你持续痛苦,这个工具不能替代专业的心理咨询师。它只是一个数字化的“镜子”,而复杂的情感问题需要真人专家来协助处理。
这个项目对我而言,更像是一次将技术、数据分析和人文心理学交叉的有趣尝试。它不会告诉你“她爱不爱你”的终极答案,但它能帮你把那些模糊的感受,变成一张张可以审视的图表和一段段可以推敲的逻辑。最终,如何解读这些信息,如何采取行动,权力始终在你手中。技术应该用于增进理解,而非替代情感;用于照亮盲区,而非制造焦虑。希望你在使用它时,也能保持这份清醒和善意。