目前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