如何把微信的iphone7微信聊天记录录从 iPhone 里拿出来

如何把微信的聊天记录从 iPhone 里拿出来? - 推酷
如何把微信的聊天记录从 iPhone 里拿出来?
大约四年前,我有了一个暗恋对象,所以想要把微信的聊天记录保存起来。那时在网上只有一种要付费的类似软件,所以我想,写一个开源的工具好了。于是这件事很快就完成了(对应微信 6.0;那时的代码质量很低我知道)。
后来我没有了暗恋对象,也就不再关心这件事。最近,因为有不少人认为这样的功能仍然很有用,并且据我搜索到的情况,仍然没有能让每个人拿来直接用的工具。因为在几年之间文件结构发生了一些变化,我在这里记录下来,方便其他的开发者(对应现在的版本 6.3.25;虽然我没想到还能有什么用)。
1. 怎么得到这些文件?
过去,我可以提示用户在越狱之后用 iFunbox 自行把微信 App 所在文件夹复制出来。然而自从某个版本的 iOS 开始,在不越狱的情况下,我们只能看到 /User/Media 这里的文件,而需要的本地数据在 /User/Containers/Data/Application/ 微信的 UID。强迫用户为了这么一件事前去越狱显然不太友好,而对“聊天记录迁移”抓包也不方便,所以我想到另一种途径。
这就是 iTunes 备份。从经验判断,恢复备份之后微信里的聊天记录都还在,说明肯定这些文件在备份的时候保存到了电脑上。它们在哪里?苹果官方给了答案。简单地说,Windows 下在“\用户\(用户名)\AppData\Roaming\Apple Computer\MobileSync\Backup\”,然后我不喜欢用 Mac OS。
不过,iTunes 备份的文件夹结构不是很友好,似乎每个手机上的文件名都变成了一串序号,当然打开相关的 plist 然后看出规律也不难。好消息是,已经有很多人做了类似的事情,例如iphonebackupbrowser,它也是用 C# 写的,用起来比较方便。
因此,我做的第一步是让用户选取做好的 iTunes 备份,从上面那个源码,稍微修改一下就可以找到 com.tencent.xin 的相关文件,从而在程序里直接通过 iOS 上的路径找到对应的文件。
2. 主要的数据库:MM.sqlite
从很久以前,iOS 微信的大部分数据就保存在这个 SQLite 3 数据库里。没有安卓上可恶的加密,直接可以打开。这个文件在 Documets/xxxx/DB/MM.sqlite,中间是对应用户名的 MD5,稍后会讲它的具体含义。不过一般只需要遍历所有的。
我们感兴趣的是 Chat_ 开头的表,分别是和一个人(或群聊、公众号)的对话内容;以及记录朋友列表的 Friend 和 Friend_Ext。下面两图是朋友表的内容:
很明显,微信号是 UsrName,昵称是 NickName,备注名在 ConRemark。
此外在 ConStrRes2 里面(XML 格式)还有一些有用的信息。比如地区、签名、来源、LinkedIn……我们更需要的是头像的地址 HeadImgUrl,下面会用到。
特别有个属性叫 alias 需要处理。我们知道每个用户最多可以修改一次微信号,那么新的微信号就会保存在 alias 当中。因为很多地方是用微信号作为 key 来索引到用户的(尽管每个用户也有一个数字的 ID),我们对两种微信号都要检查。
既然已经知道所有人的信息,下面就来看聊天记录。不过在这之前,我还遇到了一个意想不到的新问题。
3. 消失的 Friend
程序写到一半,在某次备份之后,突然读不到朋友们的名字了。打开 MM.sqlite,发现 Friend 表当中确实几乎已经没有记录。那么微信究竟把这么多信息藏到哪里了?
我发现在同一个文件夹下面还有名叫 WCDB_Contact.sqlite 的文件。打开之后一目了然:
猜想是因为随着中老年用户大量加入各种群聊,用户表的长度急速增长(聊天室里的陌生人可能也需要记录信息呀!),所以微信在最近的版本里选择了分表,而我刚好赶上了它转存数据的这个时间。
后面那些列都是 BLOB 格式的二进制,打开之后是这样的:
以人类的视角,我们很容易看出所有内容的含义,只要多一些耐心,都可以直接找到需要的内容。问题在于,让程序怎么分割呢?
我们来观察一下这位微信号为 suan*******cai 的朋友的信息。图片中选中了他的微信号字符串,那么微信如何知道这是需要的字符串呢?一种猜想是用分隔符,例如 C 字符串的 '\0' 结尾。但是,这字符串之后是 0x1a (或者其他很多可能性),无法与正常字符区分。另一种选择是在文件开始记录每一个变量的偏移量,但是观察其他文件发现开头部分非常短,最多 3 字节,不足以保存这样的内容。
自然只剩字符串的前一字节。0x0e,这刚好是选中字符串的长度。我们再往后看,例如有一个拼音首字母 XXK,刚好前一个字节是 0x03。后面的备注 INI-Mob,所以前一个字节是 0x07。于是这个疑问解决了。
再前面一个字节,例如第一行的 0x12,可以发现在同类每个文件的相应位置都不变。我猜想是下一个字符串的类型。
这样,这种记录的结构我们已经大致了解:
开头若干字节未知信息 --& (1 字节类型说明 --& 1(?) 字节长度 --& 字符串) 若干个
不过,在 dbContact 的上空还飘着两朵乌云:
(1) 文件开头究竟应该跳过几个字节,开始真正的内容?这好像在文件自身当中找不到线索,但在同一列当中是相同的,例如 dbContactRemark 是 0x0a,dbContactProfile 是 0x08 0x?? 0x12。问号表示可能有差别,但长度是确定的。所以相应地,可以人为让每种类型跳过若干个字节。至少我没有找到任何反例。
(2) 如果字符串长度超过一字节的表示范围,怎么办?一种合理的猜想是类似 UTF-8 或者 SQLite 的数值类型的表示法,也就是让某些高位为 1 来表示这个数字还要加上下一个字节。我暂时没有过多检验这个说法,因为唯一涉及这个问题的地方是 dbContactHeadImage 和 dbContactChatRoom。而这二者都有很明显的分隔位置,例如头像的链接总是以 http 开始,到 \/\d+ 为止。我在这里偷懒直接去匹配了。
4. 聊天文字记录
有了前面的准备,我们已经可以解析 Chat_[0-9a-f]{32} 表,并且以文本形式导出每个对话的聊天记录。怎么知道聊天的对象是谁?Chat_ 后面是 UsrName 或 alias 的 MD5 值。
首先看一下聊天记录的结构。MesLocalID 是一个比较重要的数字,虽然暂时还用不到。CreateTime 顾名思义,并且应该是 UTC+0 的。Message 就是消息本身。Type 表示消息的类型,可以自己试验一下,最后 Des 应该表示我是否为消息的接收方。
下面简单描述一下我见到过的 Type 和对应的 Message 处理:
10000: 系统消息,就是那种居中的。
34: 语音,消息里会有
47: 表情,
62: 小视频,&videomsg。
50: 视频 / 语音通话,&voipinvitemsg。本来在微信里二者就可以切换,对用户解释得太细也没啥用。
48: 位置。
42: 名片。
49: 链接。这里面包含的类别比较多,在 Message 里面会有、、、 等信息。微信应该是通过 标签来确定一些特殊的应用,比如 2001 是红包,2000 转账,17 实时位置共享,6 文件。(我试过把它或者后面的模板地址改成别的,好像不管用。)
对于导出文字来说,这些特殊的东西就给用户显示个“[图片]”、“[表情]”吧。
还有一个问题是群聊,特点是用户名为 \d+@chatroom。在群聊当中,每个人(除了自己)的发言前面都会有“微信号:\n”,好让我们知道对方身份。问题在于,有些人在群聊当中可以改自己显示的名字。这个信息如果在新版数据库当中,包含在 dbContactChatRoom 列。它有 ... 的结构,处理起来应该不难。
5. 其他多媒体资源
为了给用户初恋般的体验,我还希望能尽量还原聊天的全部内容,这就需要加入对应的图片(头像)、语音、视频、动画表情等元素。
我们自然会想在“Documents/ 微信号的 MD5”文件夹下面找这些内容。这时很容易发现:
(1) Img 文件夹中有一些以 MD5 命名的文件夹,它们对应数据库中的各 Chat_ 表,而具体文件是以数字编号的,这个编号等于对应消息的 MesLocalID(上面提到过)。文件有三种后缀:.pic、.pic_hd、.pic_thum,顾名思义是正常大小的图片、原图、缩略图。基本上是 JPEG 格式吧,这个影响不大。
(2) Video 文件夹类似,有 .video_thum 扩展名的缩略图,以及 .mp4 的视频本体。视频是 AVC+AAC 编码的,不过仍然不重要吧。
(3) Audio 是语音,以前是 3GP 格式,现在打开之后可以看到 SILK_V3 的字样,搜索可以直接发现编译好的转换程序。不过没有源码,也可以自行搜索其他解决方案。
然而在这个版本中,我始终没有从备份当中找到动画表情和头像这两项资源。怎么回事?
正好那段时间盘古越狱出现了,我把完整的 Documents 和 Library 文件夹复制出来,看了一遍。原来它们在 Library/WechatPrivate 里,而这个文件夹设置成了不备份。这也有道理,因为前面的几个是个人的资源,而头像和表情随时都可以再去下载,所以并不需要放在 iTunes 备份当中。
那么不越狱的情况下,我们怎么获得它们呢?记得上面提到过,在每个好友的 dbContactHeadImage 当中有正常和放大头像的地址;如果看一下含有动画表情的消息,其中也有这个表情的 GIF 地址。好的,下载就可以了。
最后,还有一件小事有点麻烦。
当前用户的微信号和头像在哪?
打开 mmsetting.archive,这是一个 plist 文件,在里面有几项是我的微信号、昵称、头像地址……
问题在于这里没有很清楚的 key-value 形式,所以只能猜测出来一些找到相应内容的方法。如果能改进一下就更好了。
以上描述了找到微信聊天记录涉及的文件的方法,不过讲道理它们都只能算是“有根据的推测”。因为聊天记录这件事不太方便收集测试数据,只能保证它们符合我能找到的记录。
我写了一个
放在 GitHub 上,请有兴趣的读者尽情地 Fork 走修改之类的!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致怎样将微信聊天记录导出到电脑上 电脑上看微信聊天记录方法汇总
作者:佚名
字体:[ ] 来源:互联网 时间:07-13 09:16:03
最近有朋友经常问我怎样将微信聊天记录导出到电脑上,其实导出微信聊天记录的方法有很多,今天小编就为大家带来几种常用的方法,朋友们可以一起看看
最近有朋友经常问我怎样将微信聊天记录导出到电脑上,其实导出微信聊天记录的方法有很多,今天小编就为大家带来几种常用的方法,朋友们可以一起看看!
方法一、利用同步助手进行微信聊天记录导出,此方法适合于微信iPhone版用户1、下载安装同步助手最新版,运行同步助手,并连接iPhone。切换页面至&更多功能&,点击资料分类的最后一个按钮【微信】,即可进入微信消息记录管理器查看聊天记录
2、只要点击左侧联系人,就会显示与他的聊天记录,包括文字,语音、图片等。
3、同步助手还提供了强大的搜索功能,可按具体日期精确查询,也可以按照时间段(最近一个月)来模糊搜索。还能根据关键字来定位某条信息,及查看前后消息
4、除了方便的查询功能,导出微信文本记录也很简单。点击左上角的【导出】按钮,可选择txt和Excel两种存储方式。相较而言,Excel方式更方便后期的查询。
5、至于微信聊天记录中的图片和语音,同步助手提供了逐个导出的方式。当你把鼠标移至聊天记录中的图片或者语音消息时,右侧就会出现一个导出按钮,点击即可保存。其中语音消息以amr格式保存,不需要转换格式,直接在电脑上就能播放。图片则以PNG格式导出。
方法二、利用QQ电脑管家进行微信聊天记录导出,该方法适合于Android微信用户。1、在电脑管家工具箱中找到&微信聊天备份&功能,打开后可选择USB连接或者WIFI连接两种方式。
2、选择要备份的聊天记录后,开始备份。3、安全加密备份成功。之后需要时可以随时将备份到电脑上的聊天记录再恢复到手机。
4、手机上需确认授权,开始备份。
方法三、手动进行微信聊天记录导出1、先说语音记录&&这个太简单了,基本不值得一提。 定位到sd卡目录的微信文件夹,即sdcard/Tencent/MicroMsg,看到一个一串乱七八糟的数字和字母组合的文件夹,进入,看到voice文件夹,里面存储的就是微信的语音文了,格式是amr的,用暴风就可直接播放,自己好好存起来吧~~
2、再说如何导出文本记录, 导出文本记录需要取得Root权限,因为文本信息是存储在手机里的。root完成后,打开\data\data\com.tencent.mm\MicriMsg 文件夹,里面会有一个以很长一串数字或者一些字母组成命名的文件夹(也可能有多个。不同的文件夹名代表不同的QQ,如果你用不同的QQ登陆过微信,每个QQ会产生一个新乱码文件夹,保险起见,可以都备份上)把此文件夹备份出来,文件夹里还有个systemInfo.cfg文件可以不用备份。
进入找到MicroMsg.db文件,这就是存储好友号码、昵称、聊天记录的数据库文件。全部拷贝到电脑上。如果想要把微信文本聊天记录打开和导出为文本看的话,可以下载SQLite相关软件进行打开和导出即可。SQLite具体的使用方法,自己百度之~~~
方法四、微信聊天记录导出到新手机1、登陆微信,打开首页,点击右上角三点成柱状的图标,选择下拉菜单设置选项
2、在打开的设置页面中,选择通用
3、在通用页面当中,选择聊天记录迁移选项
4、在打开的聊天记录迁移页面中,选择上传按钮
5、在新打开页面中,可以单击全选,也可以选择需要导出的联系人聊天记录,再选择右下角的完成,即可
6、在其他手机上,只要登录微信,点击下载即可导入之前的聊天记录了提示:导出的记录只能保存7天,所以在此期间及时下载到新手机上
大家感兴趣的内容
12345678910
最近更新的内容

我要回帖

更多关于 换iphone微信聊天记录 的文章

 

随机推荐