QQ群聊天记录导出mht大文件分割

目前QQ的聊天记录导出功能很让人郁闷。

三种聊天记录格式的导出
1 TXT 没图
2 BAK 只能再导入QQ使用
3 MHT 有图有字,缺点是一旦聊天记录很多,文件体积就会很大,几乎所有的工具都不能正常打开

单纯的把MHT转换成HTML也不行,因为HTML也很大,加上图片之类的资源 也会卡死。
于是只能切开显示,处理思路很简单,就是超大的文本文件,按行顺序处理,把图片解码存入文件,然后分割HTML内容。
代码如下 只支持单个QQ群导出记录。本人亲测有效,成功导出一个3个多G的mht文件。导出后图片文件二万多个,html数据将近300M。


  1 import io;
  2 import fsys.dlg;
  3 import string;
  4 import crypt.bin;
  5 import fsys.path;
  6 //将Base64的数据转换成图片
  7 function base64images (str,path)
  8 {
  9     if(str)
 10     {
 11         var kzm = string.match(str,"Content-Type:image/(\S+)");
 12         var wjm = string.match(str,"Content-Location\:(\S+.dat)");
 13         startpos,endpos = string.find(str,"}.dat");
 14         if(endpos)
 15         {
 16             var bindata = crypt.bin.decodeBase64(string.trim( string.sub(str,endpos+1)));
 17             //io.print(string.trim( string.sub(str,endpos)));
 18             //execute("pause") //按任意键继续
 19             string.save(path ++ "\\" ++ wjm,bindata);
 20         }
 21         
 22     }
 23 }
 24 //切割记录文件
 25 function split_html (file_path,path)
 26 {
 27     var html_head = '<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>QQ Message</title><style type="text/css">body{font-size:12px; line-height:22px; margin:2px;}td{font-size:12px; line-height:22px;}</style></head><body><table width=100% cellspacing=0>';
 28     var html_foot = '</body></html>';
 29     var file = io.open( file_path, "rt" );
 30     var line_text = file.read();
 31     var line = 0;
 32     var page = 0;
 33     var tmp = '';
 34     while(line_text)
 35     {
 36         line_text = string.match(line_text,"\<tr.*?\</tr\>");
 37         if(line_text)
 38         {
 39             tmp = tmp ++ string.replace(line_text,'@<IMG src="{','<IMG src="images/{');
 40             line++;
 41             if( line>500 )
 42             {
 43                 var f = io.open(path ++page++".html","w+");
 44                 f.write(html_head);
 45                 f.write(tmp);
 46                 f.write('</table>'++'<a href="'++ page+1 ++'.html">Next page</a>');
 47                 f.write(html_foot);
 48                 f.close();  
 49                 page++;
 50                 line = 0;
 51                 tmp = '';
 52             }
 53         }
 54         line_text = file.read();
 55     }
 56     var f = io.open(path ++ page ++ ".html","w+");
 57     f.write(html_head);
 58     f.write(tmp);
 59     f.write('</table>');
 60     f.write(html_foot);
 61     f.close();  
 62     file.close();
 63 }
 64 //打开控制台
 65 io.open();
 66 //选择QQ聊天记录
 67 var mhtPath = fsys.dlg.open("QQ聊天记录文件*.mht|*.mht||");
 68 //开始处理文件
 69 if(mhtPath)
 70 {
 71     var path = io.splitpath(mhtPath);
 72     var img_dir = path.dir ++ path.name ++ '\\images';
 73     var file = io.open( mhtPath, "rt" );
 74     fsys.createDir( path.dir ++ path.name);
 75     fsys.createDir( path.dir ++ path.name ++ '\\images');
 76     var html = io.open( path.dir ++ path.name ++ "\\tmp.html","a+");
 77     var line_text = file.read();
 78     var i = 0; //行数
 79     var is_html = false;
 80     var tmp_image_data = '';
 81     //判断是否是腾讯QQ聊天记录文件
 82     if(string.indexAny(line_text,"Tencent"))
 83     {
 84         
 85         while( line_text  )
 86         { 
 87             //判断文本内容开始处
 88             html_start,xmlns_end = string.find(line_text,"@<html xmlns");
 89             if( 1 == html_start )
 90             {
 91                 is_html = true;
 92             }
 93             //判断文本内容结束处
 94             html_end1,html_end2 = string.find(line_text,"@</table></body></html>");
 95             if( 1 == html_end1 )
 96             {
 97                 //最后一行写入文件
 98                 html.write(line_text);
 99                 html.write('\r\n');
100                 is_html = false;
101                 //break;
102             }
103             
104             if(is_html)
105             {   //将聊天文本内容写入文件
106                 html.write(line_text);
107                 html.write('\r\n');
108             }
109             
110             //切割图片base64数据 
111             if(false == is_html && i>10 )
112             {
113                 if(string.find(line_text,"@------=_NextPart")){
114                     base64images(tmp_image_data,img_dir);
115                     tmp_image_data = line_text ++ '\r\n';
116                 }else{
117                     tmp_image_data = tmp_image_data ++ line_text ++ '\r\n';
118                 }
119             }
120             
121             line_text = file.read();
122             i++;
123             io.print("已处理",i,'行数据');
124         }
125         base64images(tmp_image_data,img_dir);
126         
127     }else {
128     
129         io.print("您选择的文件可能不是QQ导出的mht聊天记录文件");
130         
131     }
132     //关闭文件
133     file.close();
134     html.close();
135     //需要切割html
136     split_html( path.dir ++ path.name ++ "\\tmp.html",path.dir ++ path.name ++ "\\");
137 }
138 else
139 {
140     io.print("请正确的选择QQ导出的mht聊天记录文件");
141 }
142 execute("pause") //按任意键继续
143 io.close();//关闭控制台

windows下软件,打包好的二进制文件下载,点我

原地址:http://www.cnblogs.com/toumingbai/p/3778495.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注