特定用户QQ群聊天记录导出的实现

标签: qq C++
1169人阅读 评论(0) 收藏 举报
分类:
一、把QQ群的聊天记录txt格式导出
消息管理器 -> 选择要导出的群 -> 右击、导出
 
这里要注意 : 导出之后的 文本是 unicode 编码的,需要转换 ==|| 之前不知道,搞了大半天。
重新建一个txt , 把原来的 txt 内容 复制 到 新的 txt ,保存就行了。
 

二、详细代码

1. head.h

 1 #ifndef TxtSearch
 2 #define TxtSearch
 3 
 4 #include<string>
 5 #include<map>
 6 #include<set>
 7 #include<iostream>
 8 #include<vector>
 9 #include<fstream>
10 #include<sstream>
11 #include<ctype.h>
12 
13 typedef unsigned char BYTE;
14 typedef unsigned short WORD;
15 
16 bool IsChineseChar(WORD DoubleByte);
17 
18 void WordAndChar_print(std::string );
19 
20 
21 class TextQuery
22 {
23 public:
24 
25     typedef std::vector<std::string>::size_type line_no;
26 
27     void read_file(std::ifstream & );
28     std::set<line_no> run_query(const std::string&) const;
29     std::string text_line(line_no) const;
30 private:
31     void store_file( std::ifstream &  );
32     void build_map();
33 
34 
35     std::vector<std::string> lines_of_text;
36     std::vector<std::string> bak_lines_of_text;
37     std::map< std::string,std::set<line_no> > word_map;
38 
39 };
40 
41 void print_resluts(const std::set< TextQuery::line_no> & , 
42                    const std::string & , const TextQuery &);
43 
44 
45 #endif

2、function.cpp

 1 #include"head.h"
 2 
 3 bool IsChineseChar(WORD DoubleByte)
 4 {                                                              
 5     return ( (DoubleByte < 0) || (DoubleByte > 127) );
 6 }  
 7 
 8 
 9 void TextQuery::read_file( std::ifstream &  is)
10 {
11     store_file(is);
12     build_map();
13 }
14 
15 std::set<TextQuery::line_no> TextQuery::run_query(const std::string& str) const
16 {
17     std::map<std::string, std::set<line_no> >::const_iterator 
18         loc = word_map.find(str);
19 
20     if(loc == word_map.end())
21     {
22         return std::set<line_no>();
23     }
24 
25     return loc->second;
26 }
27 std::string TextQuery::text_line(line_no line_num) const
28 {
29     if(line_num < lines_of_text.size())
30         return lines_of_text[line_num];
31 
32     throw std::out_of_range("line num is out of range");
33 }
34 
35 
36 void TextQuery::store_file(std::ifstream &  is)
37 {
38     std::string txtline;
39     while(std::getline(is,txtline))
40     {
41         lines_of_text.push_back(txtline);
42         int len = txtline.length();
43         for(int i = 0 ; i <len ; i ++)  //pretreatment
44         {
45             bool b1  = 0,b2 =0;
46             if(!IsChineseChar(txtline[i]) 
47                 &&!isalnum(txtline[i]) )
48                 txtline[i] = ' ';
49             b1 = IsChineseChar(txtline[i]);
50             if(i + 1 < len)
51                 b2 = IsChineseChar(txtline[i+1]);
52         }
53 
54         bak_lines_of_text.push_back(txtline);
55     }
56 }
57 
58 
59 void TextQuery::build_map()
60 {
61     for(line_no line_num = 0 ; line_num != bak_lines_of_text.size() ; ++line_num)
62     {
63         std::istringstream strline(bak_lines_of_text[line_num]);
64         std::string word;
65         while(strline >> word)
66         {
67             word_map[word].insert(line_num);
68         }
69     }
70 }
71 
72 void print_resluts(const std::set< TextQuery::line_no> & ss, 
73                    const std::string & str, const TextQuery &tq)
74 {
75     typedef std::set< TextQuery::line_no> lineset;
76 
77     lineset::size_type size = ss.size();
78     std::string path = str + ".txt";
79     std::ofstream outfine(path);
80     outfine<<str<<" occurs "<<size <<"times"<<std::endl;
81     lineset::const_iterator it = ss.begin();
82 
83     for(; it != ss.end() ; ++ it)
84     {
85         outfine<<"\t( line "<<(*it)+1<<" )"<<tq.text_line(*it)<<std::endl;
86         outfine<<"\t( line "<<(*it)+2<<" )"<<tq.text_line(*it+1)<<std::endl;
87     }
88 }

3、main.cpp

 1 #include"head.h"
 2 
 3 int main()
 4 {
 5     std::ifstream infile("char.txt");
 6 
 7     if(!infile.is_open())
 8     {
 9         printf("No input file!\n");
10         return -1;
11     }
12     TextQuery tq;
13     tq.read_file(infile);
14     std::string query;
15     while (printf("enter user ID to look for:\n"),
16         std::cin>>query )
17     {
18         std::set<TextQuery::line_no> loc = tq.run_query(query);
19         print_resluts(loc,query,tq);
20     }
21     return 0;
22 }

 

三、需要改进的地方

1、

1 for(; it != ss.end() ; ++ it)
2     {
3         outfine<<"\t( line "<<(*it)+1<<" )"<<tq.text_line(*it)<<std::endl;
4         outfine<<"\t( line "<<(*it)+2<<" )"<<tq.text_line(*it+1)<<std::endl;
5     }

找到 用户名所在的行后, 我 直接把 用户名 所在的 下一行 作为 聊天内容,但其实 聊天内容里面 可以换行。

2、

如果 聊天 内容 里面 出现 用户名,会 误以为 是 用户名 所在的行,把这行输出 并把 下一行 输出。

 

查看评论

特定用户QQ群聊天记录导出的实现

一、把QQ群的聊天记录txt格式导出 消息管理器 -> 选择要导出的群 -> 右击、导出   这里要注意 : 导出之后的 文本是 unicode 编码的,需要转换 ==|| 之前不知道,搞了大半天。 ...
  • u011239443
  • u011239443
  • 2016-06-13 10:01:00
  • 1169

VC++写的手机QQ<em>聊天记录导出</em>工具

2010-04-16 上传大小:31KB VC++手机QQ<em>聊天记录</em> 本程序用vc++编写,功能只负责将<em>聊天记录导出</em>到文本文档中,其实稍加修改就可以做到将2008和2009的<em>聊天记录</em>相互...
  • 2018年01月28日 00:00

ios 版 qq 聊天记录的导出

我所使用的平台: Mac OS X Lion 10.7.2 用到一些东西: 0。iExplorer.app 用于将保存这聊天数据的 sqlite 数据库文件导出到电...
  • u011513212
  • u011513212
  • 2013-07-26 10:20:23
  • 2556

用Python3对QQ导出的文本聊天记录进行整理。

三个月没看QQ群了。 群里有同学分享的近期答辩注意事项,于是乎想把近期QQ聊天记录从头到尾过一遍。 导出聊天记录文本,发觉上万行的文本,这么读效率有点低,所以用python整理了一下。 这个是整...
  • watfe
  • watfe
  • 2016-12-01 14:07:01
  • 2653

群聊天记录,关于优化算法

平民的信使(1637127384) 13:17:20   问下,有没有优化算法,输入:目标函数值,目标函数一阶导数值,和约束函数值和约束函数一阶导数值,进行优化迭代的? 莫欺少年穷(82...
  • pingmin2014
  • pingmin2014
  • 2015-08-17 16:36:22
  • 486

一次群聊天记录的整理(当后台的某个程序忽然死了时,怎么解决,没有日志输出)

电风扇:今天面试一家电子商务公司,一个面试官提的问题:当后台的某个程序忽然死了时,怎么解决,没有日志输出。 电风扇:想了半天没出来 洗衣机:重启 锅:0.0 电风扇: 有人,有好的建议吗 电...
  • huilangeliuxin
  • huilangeliuxin
  • 2014-07-26 16:54:41
  • 1711

QQ群聊天记录分析器

前几天闲来无聊,想清理一下自己建的一个QQ群。有些人长期不发言,着实无奈。突然想起来QQ导出的聊天记录有一定的格式,就试着用JAVA写了个小程序去分析。没想到几行代码就搞定了。 分析出来的效果和...
  • LeadWorld
  • LeadWorld
  • 2006-05-31 21:24:00
  • 2483

探讨原创内容之:提取qq群聊天记录作为网页的案例

一直在找原创内容。其实qq群就是一个很好的原创内容。 我提取出来了,直接保存为网页。如下: http://www.dlnulib.com/jiemengshili.htm 解梦实例 不知道百度如何对...
  • houerfei
  • houerfei
  • 2015-01-14 00:33:11
  • 1791

使用R语言 4秒对10万行qq群聊天记录进行基本的清洗整理

在R语言中通过sapply函数的向量化运算高速对数据进行数据清洗,是传统for循环速度的上千倍...
  • Chucky1992
  • Chucky1992
  • 2017-02-22 12:15:58
  • 421

ios版qq聊天记录的导出

我所使用的平台: Mac OS X Lion 10.7.2 用到一些东西: 0。iExplorer.app 用于将保存这聊天数据的 sqlite 数据库文件导出到电脑里面, 该数据库...
  • yang3wei
  • yang3wei
  • 2012-05-21 12:46:41
  • 12616
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 27万+
    积分: 4015
    排名: 9725
    博客专栏