code:https://github.com/Sunmile/study_note 我的代码笔记中 MMsaver
exe:http://download.csdn.net/detail/oadam/5691847
exe使用说明:
1. 运行程序名为: GuiMMsaver.exe
2. 点击右边select键,在弹出文件夹选择框中找到从手机中搞出来的Documents文件夹,Documents下应该要有一串md5码名的文件夹,然后里面有Audio, Img, DB等文件夹。点确认。(其实我的设计是选择那串md5码的,但有小bug无法识别,下个版本修改。)
3. 等待。(没做进度条……)选中主窗体中的头像,(可多选)然后点击右边的export即可。
注: 程序会在程序所在路径下建立output文件夹,然后放置转出的数据。(如果原来有,会删掉)
注2:如果说话比较多的话,amr转mp3需要比较多的时间。
working:
1. 首先是数据转到电脑。
本人iPhone,懒得越狱。方法是itunes中选择本电脑备份。然后安装iPhoneBackupExtractor可以识别备份文件。他会自动找默认的备份位置,所以我懒得透露iPhone备份文件夹了。
这个iPhoneBackupExtractor免费版只能一次导出2个文件,果断下破解版。
http://pan.baidu.com/share/link?shareid=544292&uk=4228181989
导出Application中的com.tencent.xin文件夹,一般有上千个文件吧。
导出后会有Application文件夹。
2. 第二个问题是找到数据文件。
这个度娘知道,在Application/com.tencent.xin/Documents/一串md5码/DB/MM.sqlite
这是一个sqlite数据库文件,我的是2M多。随便找个sqlite浏览器阅读,发现里面大部分是Chat_一串md5。
录音在 md5码/Audio下,一串串md5为名字的文件夹。
图片在 类似位置 在 Img下
3. 那一串串的长长的编码。
当然一开始我不知道这些是md5,是反查才发现这些是以微信号为素材的md5码。
而录音和图片则是弱爆了的顺序排放。记得上一个版本是全部文件放在一起的,现在的是一个chat,如果有素材,就创建一个以其md5码为名字的文件夹。
所以现在很简单了,就是在数据库中找到 微信名 计算md5 以及一些查表工作,就能完成任务,打到目标。
4. 考虑使用xhtml,这样在提供浏览功能的同时,方便以后的信息转移。
5. 文件格式
这里还有一个问题。Img中的图片是以pic为后缀的jpeg图片,这个改名为jpg就行。但是Audio中却不行,这里以前是amr格式的,其实现在还是,多谢http://bbs.weiphone.com/read-htm-tid-6261163.html,弱爆了的微信小组真的是为了省空间吗?在现在的*.aud文件首行插入新行 #!AMR ,就可以改名成为amr可以播放了。
6. 数据库
6.1 MM.sqlite中似乎储存了所有的资料了。其中以”chat_”开头,后面接md5编码的表(我把这个md5编码称为user_md5),储存的就是你和这个user的聊天信息。
6.2 上述的user包括两部分:
6.2.1 表Friend中的user,这里的user是微信好友,包括公众帐号和聊天室。聊天室是'一串数字+”@chatroom” '为微信号。
6.2.2 表QQContact中的user,这里是QQ好友。user=qq号+”@qqim”。
6.3 chat_”user_md5″表的分析。
随意弄个sqlite browser就能看了,我不详细说这个的结构了。
6.3.1 列名MesLocalID: 编号,好像是primary key来着。这个很重要,因为是图片和音频的文件名!
6.3.2 列名CreateTime: POSIX标准的时间,即从1970年到当时的秒数。
item输出顺序可以是上述中的一个。我用ID号,省事。
6.3.3 列名Message: 信息主体。
6.3.4 列名 status 和 des :des: 0表示自己发的 1表示服务端发来 status: 2表示自己发的 4表示服务端发来
有两个 感觉好神奇。
6.3.5 列名 Type:
10000:qq10000号大家懂的。此时message中就是系统消息。
49: app应用类吧?(包括qq音乐什么的)此时message中是xml格式的信息。我是直接放弃掉了。
47: 有emoji表情,猜测都是表情。抛掉。
42: 内置应用?名片? 之类的我不关心的内容。
34: Voice。核心之一了,不过我不关心message信息了这时,直接连接到ID.aud就是。
3: Img。同样操作。ID.pic
1: 文本信息。(如果是聊天室(即”*@chatroom”),在那个人说的话前会有他的微信号加上冒号换行(user:
),而自己说的没有,所以要通过des判断。或者不对他进行分解。)
7. 补充
把Application/com.tencent.xin/Documents/一串md5码/ 这个md5码目录称为用户目录。
则用户目录下有Usr文件夹,里面是pic_them后缀的文件,改名.jpg就是头像了。而文件名是usr_md5。这个头像看起来比手机里大。
8. 我的做法是:
8.1 提出所有”chat_”开头的表名。这个可以通过'select name from sqlite_manager where type=”table” '得到。 储存为chat_dict
8.2 从Friend, QQContact中,提出所有user(btw,那里有个nickname我也提出了),计算user对应user_md5。 储存为md5_dict
8.3 拷贝Usr文件夹,顺路改名。
8.4 对chat_dict中每一个表进行操作:
8.4.1 建立聊天记录文件夹,以user_md5[0:7]+user_nickname作为文件夹名。nickname可能重名。
8.4.2 拷贝Img和Audio中的文件,顺路改名以及添加amr头。
8.4.3 创建html文件,对表中每一行
8.4.3.1 写一个时间,用time模块转换CreateTime。
8.4.3.2 写一个说话人,wo, user_nickname 。 如果是群里的话,要获得message中说话的微信号,然后转为nickname。
8.4.3.3 写信息主体,文字,图片,或者音频。(这里音频我只给了一个超链接,因为还没找到html播放amr的办法。)
9 不足:
9.1 现在的寻找用户目录的方式,是判断目录下有没有'Img', 'Audio', 'DB'这三个目录。并且会沿着Application, com.tencent.xin, Document寻找。然后搜索Document下第一个符合要求的文件夹 作为用户目录。
以后要做一个gui程序给小白们用。并以这个gui调用主程序。(这样应该就做不了进度条了吧?算了对小白不用太好)
9.2 html写得很丑,至少写一个css来弄得美一些嘛。
9.3 html文件可能会比较大。我的破机子打开html载入图片痛苦的一B。考虑按item数或者时间分解成多个html,index只是导航而已。





