本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!
原文地址:http://www.cnblogs.com/cxun/p/4338643.html

Updates

[2016.10.14]
感谢大家对本软件的喜爱!最近发现iOS微信数据库的存储方式发生了改变,原本存储在Friend表中的好友数据,现在已经改在了friend_meta表中,而且字段完全不一样,所以本软件的当前版本不能查看最新的微信聊天记录,博主现在手上有一个很紧迫的任务,等完成后会研究并开发新版本,到时会在本文更新并通知,再次感谢大家的支持!

摘要

iPhone中的微信是不是占用了越来越多的空间呢?不想删图片?不舍得删视频?那就转移到电脑硬盘上来吧,在Windows中使用本软件进行查看、搜索,手机上的空间就可以腾出来了!本文详细介绍了软件的使用说明,以及介绍了微信聊天记录数据存储格式,并给出了本软件与源代码的下载地址,最后是iPhone聊天记录中图片与视频数据的清理方法。

1. 前言

随着使用微信的日子变长,手机中微信所占用的空间也越来越大,iPhone的存储空间也日益紧缺,其中图片、视频所占的空间最大,像我这样什么都要追求完整性的人,是坚持不会删除任何一张照片或视频的,喜欢用手机拍照片视频的我,每过一段时间就把照片视频移到电脑存储,腾空手机。可是到了每一两天都要腾空间的时候,我发现这样不是长久之道,看了看微信已经占用了2个多G的空间,这样下去不是办法,现在腾讯官方没有iOS版本微信的聊天记录转储硬盘工具(Android的好像有);即便有,在Windows上要求能够像在手机上查阅;微信内置的聊天记录备份恢复功能是为转储到其它设备设计的,聊天记录在服务器只能存放7天,而且2G这么大的数据要上传到候年马月?

因此,干脆自己写一个聊天记录查看器吧,把数据挪到电脑大硬盘,这样就可以放心地在手机上删图片、视频啦。以下先给出本人开发的微信聊天记录查看器的使用说明,以及本人分析猜测的聊天记录数据存储格式,可是不全,只能显示最主要的数据内容,感兴趣的朋友可以一块分析完善。

2. 使用说明

首先说明,该软件目前仅支持iPhone上的微信聊天记录。以下分别对软件的使用方法进行详细说明。

2.1 数据转储

使用 iTools 等第三方工具将微信(WeChat)应用中 Documents 目录导出到电脑硬盘保存,该目录中包含所有在此 iPhone 上登录过的微信帐号的聊天记录,也可以只导出某一个帐号的聊天记录。每一个微信帐号的数据都存储在以该微信ID的MD5值为名称的文件夹中,例如,图2-1中 Documents 目录下32位数字名称的文件夹分别是不同的微信帐号。


图 2-1 Documents目录示例

2.2 选择数据库

聊天记录数据库文件存放在微信帐号文件夹内的 DB 文件中,文件名为 MM.sqlite。本文最后将提供一个聊天记录例子,程序运行时会提示选择数据库文件,选择以下文件即可:06af9525a11ebb4f49ec72be6d165d10\DB\MM.sqlite。

2.3 主界面

启动软件,选择数据库加载完成后,程序的主界面如图2-2所示,左侧是该微信帐号的好友列表,按拼音首字母排序,右侧是具体的聊天记录内容。好友列表分为3个标签页,分别是“好友”、“群”、“其它”,顾名思义,单独好友在“好友”标签页,群聊天在“群”标签页,剩下的订阅号、服务号等等在“其它”标签页。好友列表上方可以搜索好友,聊天内容上方可以搜索文字。点击好友列表中的好友,右侧的聊天内容窗口将加载与该好友聊天的具体内容。

由于本程序采用的是EO.WebBrowser控件试用版(博主穷~ ),每次程序启动后,聊天内容窗口下侧会出现购买许可的提示,关闭它即可,不会影响后续阅读。


图 2-2 微信聊天记录查看器主界面

2.4 数据类型

2.4.1 文字

就像手机中显示的那样,采用气泡风格显示,如图2-3所示。


图 2-3 数据类型示例:文字

2.4.2 表情

可以显示微信自带的小型emoji表情,如图2-4所示。可以显示的所有emoji表情请参见图2-5。


图 2-4 数据类型示例:emoji表情


图 2-5 所有能显示的 emoji

除了 emoji 以外,还可以显示微信官方的动画表情,如图2-6所示。

     
图 2-6 数据类型示例:动画表情

除了这两种表情以外,微信用户还经常看到许多非官方表情,如果想在这软件里显示的话,需要进行额外的数据导出工作,也不复杂:照样使用 iTools 打开微信App的这个目录:/Library/WechatPrivate/emoticon1,将此文件夹复制到本软件的安装目录,覆盖原有的 emoticon1 文件夹即可。

2.4.3 图片

聊天记录中的图片如图2-7所示,点击图片将会调用本机默认的 *.jpg 文件关联程序来查看大图,默认的程序是 Windows Photo Viewer。


图 2-7 数据类型示例:图片

2.4.4 视频 & 小视频

聊天记录中的视频与小视频如图2-8所示,点击视频将会调用本机默认的 *.mp4 文件关联程序来观看视频。


图 2-8 数据类型示例:视频 & 小视频

2.4.5 语音

聊天记录中的语音如图2-9所示,点击将会播放语音内容。


图 2-9 数据类型示例:语音

2.4.6 分享链接

聊天记录中的分享链接如图2-10所示,点击链接将会调用浏览器查看原网页。


图 2-10 数据类型示例:分享链接

2.4.7 位置信息

聊天记录中的位置如图2-11所示,点击链接将会调用浏览器查看具体的地图信息,如图2-12所示。


图 2-11 数据类型示例:位置信息


图 2-12 浏览器查看具体的位置信息

2.4.8 名片

聊天记录中的名片消息如图2-13所示。


图 2-13 数据类型示例:名片

2.4.9 语音、视频电话
聊天记录中的语音、视频电话只能给出当时的通话时长等信息(微信是不可能录制你的通话内容D),如图2-14所示。


图 2-14 数据类型示例:语音、视频电话

2.5 搜索好友

当好友数据众多时,从左侧的好友列表上方搜索栏内输入好友的关键字,可以是中文,也可以是拼音,但目前版本不能是拼音首字母,例如:搜“张三”,可以输入“张”、“三”、“zhangsan”或“zhangs”等等,但不能输入“zs”。当输入内容时,搜索结果窗口将即时出现,并列入符合关键字的好友,如图2-15所示。点击搜索结果的好友,将自动加载与他聊天的内容。


图 2-15 搜索好友示例

2.6 搜索聊天内容

聊天内容的搜索分为“搜索当前好友”与“搜索所有好友”,在聊天内容窗口上方的下拉框选择即可。在搜索栏内输入关键字,回车后将进行搜索,搜索结束后将显示搜索结果列表,点击某条记录后,聊天内容窗口将显示并高亮关键字,如图2-16所示。这里提示:搜索所有好友耗时将比较长。


图 2-16 搜索聊天内容示例

2.7 页面跳转

聊天内容窗口右上角是导航按钮,可进行翻页。若页数过多时,可以直接单击页数,将弹出跳转页面的输入窗口,输入想要查看的页码后将跳转至该页面,如图2-17所示。



图 2-17 页面跳转示例

3. 微信聊天记录格式

聊天记录的根目录是以用户微信ID用户名(不一定是微信ID,见下文)的MD5哈希值为名的文件夹。下文假设root为根目录。聊天记录最主要的内容是一个SQLite类型的数据库文件MM.sqlite,路径是root\DB\MM.sqlite。以下是本人对此数据库内容格式的分析结果。

3.1 数据表

这里先讲两个本软件用到的数据表,分别是Friend表与Chat_XXX表,XXX表示好友微信ID的MD5值。

3.1.1 Friend表

这个表存储了所有的联系人,除了好友以外,还包括非好友、订阅号、服务号等等。

(1) 字段:type

该字段可以将好友的类型进行分类,由于本软件只分成了好友、群、其它等3类,所以下面这个表大家就参考着看吧,在本软件的代码中没有用上。

表 1-1 Friend 数据表 type 字段说明(猜测)

值(二进制) 说明
1 0000 0000 000 好友&其它
2 0000 0000 000 聊天群&已删除的服务号&其它
3 0000 0000 00 好友&其它
4 0000 0000 000 该好友在群聊天中,但未添加好友
5 0000 0000 00 好友&其它
6 0000 0000 00 非好友
7 0000 0000 0 好友&其它
67 0000 000 00 语音提醒
257 000 0000 000 被屏蔽朋友圈的好友
71 0000 000 0 收藏、加星标的好友
2119 000 000 0 置顶的好友
259 000 0000 00 被屏蔽朋友圈的好友
263 000 0000 0 被屏蔽朋友圈的好友

可见,第0位表示该联系人是否已添加好友;第6位表示该好友是否加星标;第8位表示该好友是否被屏蔽朋友圈;第11位表示该好友是否在手机的好友列表中置顶。等等等等,本人愚昧,只悟出这么多,剩下的大家感兴趣的可以去分析。

(2) 字段:UsrName

UsrName字段中,以“gh_”开头的都是订阅号、服务号,以“@chatroom”结尾的都是群。

3.1.2 Chat_XXX表

XXX表示好友微信ID的MD5值,每一个好友的记录都存放在单独一个表当中。

(1) 字段:Message

代表该消息记录的具体内容。

(2) 字段:Type

代表该消息的类型,在第3.2节有具体说明。

(3) 字段:Des

0表示本人发的信息,1表示对方发的信息。

(4) 字段:CreateTime

日期转换:CreateTime字段存储的是Unix时间戳,在sql语句中通过以下方式可以转换:

select datetime(createtime, 'unixepoch', 'localtime') from chat_XXX

3.2 信息类型

3.2.1 文本

聊天记录的数据库文件为:root\DB\MM.sqlite。

Friend表存储所有好友的信息,字段UsrName是唯一标识好友的ID,但不一定是微信ID,若用户是用QQ号申请的微信,则UsrName是qq12345678形式,若使用微信ID申请的话,则UsrName就是微信ID,若使用手机号申请的话,则UsrName就是wxid_XXXXX形式。不管怎样,将此UsrName进行MD5运算,得到的哈希值,前面加上“Chat_”得到的字符串,就是存放与此好友所有聊天记录的表名,如:Chat_a500325c723649ddb75eda10635edf82。群组也是一样。

Friend表的ShortPY字段存储了有好友的备注信息,但是编码不一样。

聊天记录表中,Message字段就是与该好友的聊天记录的所有信息,若是文本,则直接存储,其它格式,请见下面章节。其中CreateTime字段是信息产生的时间;Des字段若为0则是用户向好友发送的信息,若为1则是好友发送过来的信息;其中Type字段若为1,则该信息是文本信息。

3.2.2 图片

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为3,则该信息是图片。MesLocalID字段是数字,假设为“407”,图片存储在root\Img\a500325c723649ddb75eda10635edf82\下的“407.pic”,其中“407.pic_thum”是该图片的缩略图。

3.2.3 视频

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为43,则该信息是视频。MesLocalID字段是数字,假设为“8011”,视频存储在 root\Video\a500325c723649ddb75eda10635edf82 下的“8011.mp4”,其中“8011.video_thum”是该视频的缩略图。

3.2.4 小视频

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为62,则该信息是小视频。MesLocalID字段是数字,假设为“8011”,视频存储在 root\Video\a500325c723649ddb75eda10635edf82 下的“8011.mp4”,其中“8011.video_thum”是该小视频的缩略图。

3.2.5 语音

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为34,则该信息是语音片段。MesLocalID字段是数字,假设为“8938”,视频存储在 root\Audio\a500325c723649ddb75eda10635edf82 下的“8938.aud”。

AUD文件其实就是缺少头信息的AMR文件,需要在文件头加入“#!AMR”才能成为AMR文件,然后就可以用一些播放软件打开了(其实能播放AMR的软件比较少,目前只知道QQ影音可以播放)。

将AUD转换为AMR的控制台命令:copy head.txt/b + 476.aud/b 476.amr,其中head.txt中的内容就是“#!AMR”。

本程序调用 FFmpeg 提供的工具转换成 WAV 文件再播放,这是一个很强大的软件,可以对许多音视频进行播放、转换格式。

3.2.6 分享链接

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为49,则该信息是分享链接,在Message字段中<url></url>之间的就是链接地址。

3.2.7 位置

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为48,则该信息是非实时位置信息,在Message字段中有具体的位置坐标,在该信息的XML结构里:msg –> location –> x 与 y 字段中存储着位置坐标。

3.2.8 动画表情

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为47,则该信息是一个动画表情。在该信息的XML结构里:msg –> emoji –> md5字段中存储着表情的md5值,假设该表情的MD5值是:d0546d1d8940bf82def5cc8b19185e1a,则在iPhone微信的文件目录中:/Library/WechatPrivate/emoticon1,存储着以该MD5值为文件名的文件,如:d0546d1d8940bf82def5cc8b19185e1a.pic,其实它是一个GIF文件,这样就可以连接到该表情了。

3.2.9 名片

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为42,则该信息是一个名片,在该信息的XML结构里:msg –> username 字段中存储着微信ID,msg –> nickname 字段中存储着微信名。

3.2.10 语音电话、视频电话

在好友的聊天记录表中,假设为 Chat_ a500325c723649ddb75eda10635edf82 表,若字段Type为50,则该信息是一个电话记录。里面有时长信息:<duration></duration>

4. 软件下载与源代码

本软件目前初步比较稳定,但仍有不少BUG以及许多需要改进的地方,大伙儿拍砖手下留情。以下链接是程序文件及微信聊天记录的一个例子,本文定稿时版本是1.0.1.6,最新版本请参照源码库首页

软件下载:

WechatHistory.zip (45.1 MB)

微信聊天记录例子(iOS版微信生成的):

History_Example.zip (14.5 MB)

由于软件内包含了所有的(2015年3月18日前发布的)官方动画表情,大概有90MB大小,动画表情也许不是聊天记录中最重要的内容,所以这部分数据没有包含入上面文件的下载链接中,有需要的用户可以单独下载这些动画表情:

WeChatHistory.Sticker_Gallery.ALL.Updated_By_20150318.zip.001 (48.0 MB)
WeChatHistory.Sticker_Gallery.ALL.Updated_By_20150318.zip.002 (42.3 MB)

下载后解压,并将“emoticon1”文件夹复制到 WechatHistory 的文件夹中,覆盖原来的即可。

更多的官方表情将在随着官方发布陆续推出,详情请到下文“源代码下载”的网页中下载,这里给出部分官方更新的动画表情:

WeChatHistory.Sticker_Gallery_Patch.SpongeBob2.zip (1.41 MB)
WeChatHistory.Sticker_Gallery_Patch.LuoXiaoHei.zip (1.02 MB)

本软件使用 .Net Framework 4.0,所以需要先安装运行库后才能使用本软件:

http://www.microsoft.com/zh-cn/download/details.aspx?id=17718 或直接下载:

http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe (48.1 MB)

如果有人担心软件有后门,企图收集大家的隐私信息的,可以直接下载源代码,自己检查及编译后使用:

源代码下载:https://github.com/cxun/WeChatHistory

开发工具: Microsoft Visual Studio 2012

编程语言:C#

.Net 版本:.Net Framework 4.0

5. 删除消息记录

聊天记录从iPhone上全部复制到计算机硬盘之后,使用本软件尝试可以正常查看之后,就可以从iPhone上删除数据,腾出空间啦。聊天记录最占用空间的有两:视频与照片,删除方式有以下两种:

5.1 使用微信自带的清理功能

在微信的“设置”-->“通用”-->“清理微信存储空间”,可以选择性地删除

优点:方便、直观、高效、可以选择性删除(选择好友、缩略图)

缺点:删除后,在iPhone的聊天窗口内点击已删除的图片或视频时,会提示“无法加载图片”、“视频已过期或已被清除”,无法恢复

5.2 手动清理

在Windows中使用iTools等工具,打开微信的目录,找到微信存放图片(Img)与视频(Video)的目录,如:

/Documents/06af9525a11ebb4f49ec72be6d165d10/Img
/Documents/06af9525a11ebb4f49ec72be6d165d10/Video

将这两个文件夹内的所有内容全部删除即可。这里可以看到很多个以MD5值为名称的文件夹,每个代表一个好友、群,里面存放与其聊天的图片或视频。

优点:删除后,在iPhone的聊天窗口内点击已删除的图片或视频时,微信会自动从服务器重新下载,这样在手机上还可以重新查看

缺点:操作繁琐、不直观、不可以选择性删除(肉眼无法将好友与MD5值相匹配)

以上两种方法各有利弊,无论选择哪种方式,在下次导出聊天记录时,都可以直接复制并覆盖上一次导出的聊天记录(若有不放心的、或者硬盘空间实在空余得接灰的、或者是完整性强迫症患者的,可以选择不覆盖,另起文件夹存放)。

6. 结语

最后,祝愿这款软件能给大家带来方便,同时,希望腾讯公司微信团队在今后的微信版本中不要加密数据库,否则此款软件就完全作废了,如果真要加密的话,希望腾讯公司能开发一款更好用的微信聊天记录管理器,支持数据的导出、查看,方便广大微信用户的使用。

微信聊天记录查看器(程序+源码) - iOS版的更多相关文章

  1. 高仿百度传课应用客户端源码iOS版

    高仿百度传课iOS版,版本号:2.4.1.2 运行环境:xcode6.3  ios8.3 (再往上系统没有测试) 转载请注明出处,不可用于商业用途及不合法用途. 如果你觉得不错,欢迎  star  哦 ...

  2. ParseChat应用源码ios版

    ParseChat是一个完全原生的iPhone应用程序,用于创建实时的.基于文本的Parse聊天室.功能:支持多台设备之间的实时聊天,可动态添加新的聊天室,支持基本配置,可发送和接收音效以及任意大小的 ...

  3. 新闻头条应用源码ios版

    <ignore_js_op>      源码下载:http://code.662p.com/view/13343.html     作者ymcao,源码TopNewsIOS,新闻头条IOS ...

  4. 查看Chrome浏览器扩展程序源码的两种方法

    注意:仅在当前最新的版本 55.0.2883.87 m (64-bit)上测试有效 首先获取extensionId: chrome 打开扩展程序页面 chrome://extensions/ 比如我想 ...

  5. 反编译获取线上任何微信小程序源码(转)

    看到人家上线的小程序的效果,纯靠推测,部分效果在绞尽脑汁后能做出大致的实现,但是有些细节,费劲全力都没能做出来.很想一窥源码?查看究竟?看看大厂的前端大神们是如何规避了小程序的各种奇葩的坑?那么赶紧来 ...

  6. 【转】反编译获取任何微信小程序源码(完)

    一.前言最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了一个阿里妈妈淘宝客小程序的前端实现,过程一言难尽,差不多两周时间过去了,发现小程序的坑远比想象的要多的多!!在实际练手 ...

  7. 转载:微信小程序源码提取反编译

    转载来源:www.51xuediannao.com/xiaochengxu/019c08cc.html 一.前言 微信小程序源码提取反编译,听起来很屌,其实还是简单的,基本是傻瓜式操作.要想拿到微信小 ...

  8. 如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李

    前言:在网上看了找回微信小程序源码很多教程,都没法正常使用.微信版本升级后,会遇到各种报错, 以及无法获取到wxss的问题.查阅各种资料,最终解决,于是贴上完整的微信小程序反编译方案与教程. 本文章仅 ...

  9. 一个功能齐全的IOS音乐播放器应用源码

    该源码是在ios教程网拿过来的,一个不错的IOS音乐播放器应用源码,这个是我当时进公司时 我用了一晚上写的  图片都是在别的地方扒的,主要是歌词同步,及上一曲,下一曲,功能齐全了 ,大家可以学习一下吧 ...

随机推荐

  1. 《bootstrap》实战---作为了解

    感觉这句话说的挺有道理,"一些最佳实践不管是语义标记还是移动优先的设计,抑或资源性能优化,都需要额外的时间和精力才能时间".用心做,才会做好.

  2. Grandle全局变量定义及引用

    在Project的build.gradle脚本中定义一些全局变量 ext { compileSdkVersion = 21 buildToolsVersion = "24.0.1" ...

  3. 数据库访问CRUD;__SELF__和__ACTION__的区别;自动收集表单:$n->create();

    一.tp框架数据访问(pdo基础) public function test() { $n = D("Nation"); //select();find(); //查询 1.$at ...

  4. CentOS 下部署 ASP.NET Core环境

    一.安装dotnet 1.下载运行环境 https://www.microsoft.com/net/download/linux 下载Runtime:https://go.microsoft.com/ ...

  5. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  6. css控制段落

    <p></p>标签:一段话或者段落适宜于用p标签: 段落缩进:text-indent:50px: 文字方向:text-align:center居中.left往左显示.right ...

  7. css3几个新属性

    1.text-shadow  文字阴影 p{ text-shadow:2px 2px 10px #000; } 四个参数,依次: a:水平偏移 b:垂直偏移 c:阴影程度 d:阴影颜色 2.word- ...

  8. Win8电脑蓝屏并提示dpc_watchdog_violation

    用尽系统自带的工具均无法恢复,F8能进系统.后来使用如下方法解决了 这种错误情况的发生可能是由于 iastor.sys 驱动没有完全兼容 Windows 8系统所造成的. 微软正在研究一种可行方案,来 ...

  9. 使用SpringMVC集成SpringSession的问题

    最近在使用SpringSession时遇到一个问题,错误日志如下: Exception sending context initialized event to listener instance o ...

  10. js的高级知识---词法分析

    词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active ...