ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

源码解读②:前任.skill 如何直读 macOS chat.db 解析 iMessage 与短信

源码解读②:前任.skill 如何直读 macOS chat.db 解析 iMessage 与短信 源码解读②前任.skill 如何直读 macOS chat.db 解析 iMessage 与短信【免费下载链接】ex-skill前任 skill项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill本篇是「源码解读」系列的第二篇拆解 前任.skillex-skill如何用不到 300 行 Python 直连 macOS 的 chat.db 数据库解析 iMessage 与短信把手机里的真实聊天记录变成 AI 的原材料。一、chat.db 在哪macOS 的 iMessage 数据库位置与权限macOS 上所有 iMessage 消息都存在一个 SQLite 数据库里源码在开头就写死了路径tools/imessage_parser.py#L24CHAT_DB_PATH Path.home() / Library / Messages / chat.db但 macOS 对这个文件有隐私保护——程序直接打开会被系统拒绝。所以 INSTALL.md 特别提醒需要在系统设置 → 隐私与安全性 → 完全磁盘访问权限Full Disk Access中给终端授权。这也是 SKILL.md 里--direct直读模式标注需要 Full Disk Access 权限的原因。二、imessage_parser.py 源码拆解4 步直读 chat.db第 1 步内置 sqlite3 直连macOS 零依赖项目没有引入任何第三方数据库库只用 Python 内置sqlite3打开数据库——Mac 用户装完就能直读这也是它敢做直读模式的原因。第 2 步一条 SQL只取她发的消息核心查询在 tools/imessage_parser.py#L43-L57SELECT m.text, m.date, m.is_from_me, h.id AS handle_id FROM message m LEFT JOIN handle h ON m.handle_id h.ROWID WHERE m.text IS NOT NULL AND m.text ! AND m.is_from_me 0 AND (h.id LIKE ? OR h.id LIKE ?) ORDER BY m.date DESC LIMIT ?三个关键设计条件作用is_from_me 0只保留对方发出的消息原材料全部是她说的话h.id LIKE %目标%关联handle表按手机号 / Apple ID 模糊锁定那个人的对话LIMIT 5000默认控制单次读取量可用--limit调大 源码细节OR两侧传入的是同一个%target%参数实际等价于一次 LIKE 匹配属于可以简化的小冗余——读源码时可以留意这类看似双份、实为一份的写法。第 3 步时间戳换算2001 苹果纪元 纳秒iMessage 的时间戳不是 Unix 时间戳而是以 2001-01-01 为纪元、单位纳秒的计数。换算逻辑在 tools/imessage_parser.py#L64-L72APPLE_EPOCH_OFFSET 978307200 # Unix 纪元到 2001-01-01 的秒差 if date_val and date_val 1e15: # 纳秒级约 7e18 ts date_val / 1e9 APPLE_EPOCH_OFFSET elif date_val: # 秒级老系统约 7e9 ts date_val APPLE_EPOCH_OFFSET 1e15一个判断就兼容了新旧两种精度最后统一格式化为YYYY-MM-DD HH:MM并用messages.reverse()把倒序读出的结果翻回时间正序。第 4 步三级分拣给消息打权重extract_key_content()tools/imessage_parser.py#L162-L188把消息分成三档输出档位规则用途长消息正文超过 50 字权重最高——长文里藏着想法和情绪情感类命中想你 / 生气 / 对不起 / 分手 / miss / sad等 17 个关键词情感动态分析日常类其余消息说话风格参考输出时只截取前 200 条这个权重顺序和 README.md 的建议完全一致她主动发的长消息 情感类消息 日常消息。解析器不只是搬运数据而是在预标注哪些消息对生成 Persona 更重要。三、不开权限也能解析txt / csv 导出文件兜底方案如果不想给终端开完全磁盘访问可以改用 iMazing 等工具导出聊天记录解析器对导出文件做了宽松的格式兼容tools/imessage_parser.py#L90-L159txt 格式按2024-01-01 10:00 发送人: 内容的正则逐行匹配中英文冒号都认csv 格式发送人、正文、时间三个字段各准备了 4~5 个常见列名兜底sender/from/Sender/From等不同导出工具的表头基本都能吃下。两种格式的解析结果与直读模式完全一致后续流程无差别。四、sms_parser.py 源码拆解Android 短信备份 XML 怎么读短信走的是另一条路——解析 Android 上 SMS Backup Restore 工具导出的 XML。parse_sms_xml()tools/sms_parser.py#L24-L68有 4 个关键点遍历sms节点读取address、body、date、type四个属性用type区分收发方向只保留type1收到的消息过滤掉自己发的——和 iMessage 侧的is_from_me 0思路一致date是毫秒时间戳除以 1000 后转成标准时间同时按手机号和contact_name联系人姓名过滤目标人。之后复用同一套三级分拣逻辑只是日常类截取上限从 200 条降到 100 条——短信里短消息多100 条足够观察说话风格了。CSV 和 txt 短信导出同样有对应兜底解析。五、解析结果去哪从 chat.db 到共同记忆的完整链路两个解析器输出的是一份结构化的 Markdown 报告目标人物、总条数 三段分级消息它作为原材料交给 prompts/memories_analyzer.md按 5 个维度提取关系时间线重要日期、里程碑、转折点共同日常与仪式她的偏好吃 / 玩 / 送礼冲突与修复模式情感动态最终写进每个前任 Skill 的 PART A「共同记忆」。串起来看iMessage 的完整链路是chat.db → SQLite 查询 → 时间戳换算 → 三级权重分拣 → 记忆维度提取 → memories.md六、新手实操3 条命令跑通 iMessage 与短信解析先获取源码git clone https://gitcode.com/gh_mirrors/exsk/ex-skill然后按需执行完整说明见 INSTALL.md# 1️⃣ iMessage 直读本机 chat.db需先给终端开 Full Disk Access python3 tools/imessage_parser.py --direct --target 8613800138000 --output /tmp/out.txt # 2️⃣ iMessage 解析导出文件txt / csv python3 tools/imessage_parser.py --file messages.csv --target 小美 --output /tmp/out.txt # 3️⃣ 短信解析 Android 备份 XML python3 tools/sms_parser.py --file sms_backup.xml --target 8613800138000 --output /tmp/out.txt⚠️ 常见坑速查现象原因与解法报无法读取 chat.db终端没开 Full Disk Access系统设置 → 隐私与安全性 → 完全磁盘访问权限把终端或 Claude Code加进去提示未找到某人的消息--target要填 chat.db 里存的 handle手机号或 Apple ID不是通讯录昵称消息不够多直读模式默认--limit 5000按需调大小结零依赖直读内置sqlite3 标准路径macOS 上开完权限即可用只取对方消息is_from_me 0/type1保证原材料全是她说的话工程细节扎实2001 纪元纳秒时间戳换算、txt/csv 多格式兜底、三级权重分拣——tools/imessage_parser.py266 行和 tools/sms_parser.py240 行把读聊天记录这件最脏的活干完了。【免费下载链接】ex-skill前任 skill项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表