备份和读取微信通讯录

突发奇想会不会某一天因为微信账号被封导致我失去我的联系人带来不方便,今天备份了一次微信通讯录,当账号丢失时我还可以通过我的备份文件找到我的联系人。

备份步骤

  1. 使用 iTunes 也就是现在内置在 Finder 里面的 Device 里面了,不加密备份一次
    备份时间取决于你的设备数据大小,我的 iPhone 14 Pro 256GB 使用了 149GB,备份耗时 35 分钟。
  2. 使用 iPhone Backup Extractor 的 Expert Mode 提取Applications/com.tencent.xin/Documents/[MD5 of Your Wechat ID]/DB/WCDB_Contact.sqlite文件
  3. 使用 DB Browser for SQLite 打开刚刚 Extract 出来的 WCDB_Contact.sqlite 文件,选择 Friend 表,菜单栏中选择 File/Export/Table(s) as CSV File…

为什么导出 CSV?

请看我直接用 DB Browser for SQLite 打开看到的内容,很多字段是 BLOB 二进制类型,特别不直观,对于我们需要阅读和查找都非常不方便。

特别是 dbContactRemark 字段,里面的格式很奇怪,包含 n 个 uniCode 字符 + 昵称 + 修改过的微信 id + 备注 + 拼音 等等,解析的时候我需要跳过 [\u0000-\u001f] 字符集。

解析、查询.CSV 内的数据

解析器 ✈️ 直达

源码在这,无毒无害。完全本地解析,放心食用。

读取 .csv 文件后,我默认过滤掉了 type === 4(也就是在同一个群里但不是好友)的联系人数据。如果想要查看这个数据,可以自行克隆运行这个项目,修改 /src/index/index.tsx 处的过滤条件。为了方便查找,表格中我列出了 4 列数据,分别是头像(dbContactHeadImage)、微信 id(userName)、微信名称(dbContactRemark)、备注(dbContactRemark)。点击行数据头部的 ➕ 号可以展开展示原始数据。

搜索框输入关键词时从 userNamedbContactRemark 字段中寻找匹配。

Friend 表里的 type 字段枚举值

这里是我根据我的通讯录数据得到的结果,仅供参考。

typemeaning
0微信收款助手、小程序商家助手
1公众号、朋友圈、好友
2微信群(不是我创建的)、附近的人、摇一摇
3好友
4在同一个群里但不是好友
5朋友发的名片加的好友
7从微信群加的好友
8黑名单
33QQ 邮箱提醒
259,263不给他看朋友圈
515公众号
2049文件传输助手
2050我创建的微信群
65537,65539,65543,
65795,66051,73729,
98307,98311
不看他的朋友圈
8388611,8388615,8388867,
8421379,8421635
仅聊天
268435458微信群
2147483649,2147483651公众号

1 个插曲

在 Hexo source 添加静态文件夹时,我在 _config.yml 中配置了

_config.yml
1
2
skip_render:
- static/*

这导致我添加一个编译过的 web 页面(包含一个 assets 文件夹),其中的 assets 文件夹内的 .js、.css 无法正确地被 Skip Render, 导致运行失败。纠正很简单,只需将 static/* 改成 static/**/* 即可。

错误日志参考:

1
Unhandled rejection WarehouseError: ID `source/static/wechat-contact-parser/assets/index-X6-k19vv.css` has been used
1
2
TAL {
err: Error [Nunjucks Error]: wechat-contact-parser/assets/index-DX3XtJu_.js [Line 68, Column 11190] tag name expected

参考文章