近年来,由于微信的流行,几乎所有的人都不再频繁使用QQ,所以我们对自己的QQ数据并不是特别了解。我相信,如果能够制作属于自己的QQ的历史报告的话,那是再好不过的快乐的事情了。

目前QQ的数据分析工具很少,原因是QQ相关的界面更加复杂。**程序的操作非常简单,用户交互界面很好,只需要扫描代码的一步操作

目前,本程序获得的数据包括:QQ详细数据、手机在线时间、非隐形在线时间、QQ活动时间、单向朋友号、QQ属性分析、我在过去一年中退出的群聊数据、我删除的一个月的朋友数据、所有支付信息、我最关心的人和最关心我的人。由于相关数据接口的访问限制,因此本程序不分析QQ好友

功能截图




如何运行

# 跳转到当前目录
cd 目录名
# 先卸载依赖库
pip uninstall -y -r requirement.txt
# 再重新安装依赖库
pip install -r requirement.txt
# 开始运行
python main.py

编写思路
本程序分为多个模块,模块如下:

main.py,主程序,用于获取并处理相关数据,并导出数据报告。
qq_bot.py, 核心模块,实现了qq相关的接口,较为复杂。
tkinter_gui.py,绘制gui模块,使用tkinter绘制基本的交互界面。
static_data.py,数据存储模块,所有数据采用base64编码存储。
main.py模块
首先,初始化相关文件夹,并调用qq_bot.py模块,定义一个qq bot对象,该对象为本程序的核心对象,所有数据获取均从该对象获取。
同时,本程序数据的报告文件为.md格式

遇到问题没人解答?小编创建了一个Python学习交流QQ群:766545907
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''# 初始化文件夹init_folders()# 写入项目所需资源文件到本地目录write_data()# 创建一个自己编写的qq bot对象bot = Bot()custom_print(u'登录成功,正在获取数据...')# 定义欲输出的markdown字符串markdown_content = '''<p align="center"><font size='6px'>{qq_number}的个人QQ历史报告</font><img src="{qq_icon_png}" align="right" height="60"></p>'''# 更新一下欲输出的markdown文本markdown_content = markdown_content.replace('{qq_number}',bot.qq_number)markdown_content = markdown_content.replace('{qq_icon_png}', 'data/qq_icon.png')

登录成功后,开始获取该登录账户的详细资料

    custom_print(u'正在获取该登录账户的详细数据...')detail_information = bot.get_detail_information()# content为markdown语法文本content = '\n<br/><br/>\n' + '## 我的详细资料\n' + '种类|内容\n:- | :-\n'for key, value in detail_information.items():if key == 'qq_level':star_count, moon_count, sun_count, crown_count = calculate_level(value)data = crown_count * '[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umPOkOwj-1569743652391)(data/level_crown.png)]' + sun_count * '[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K1WUEDWq-1569743652392)(data/level_sun.png)]' + moon_count * '[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jeFfaI5r-1569743652393)(data/level_moon.png)]' + star_count * '[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0dQq8px-1569743652394)(data/level_star.png)]'content += '{}|{}\n'.format(key_dict[key], data)else:content += '{}|{}\n'.format(key_dict[key], value)# 更新一下欲输出的markdown文本markdown_content += contentmarkdown_content += '\n> 注:单向好友表示他/她的列表中有你,而你的列表中没有他/她'# 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:file.write(markdown_content)

接着,获取所有qq好友的备注名和qq号

    all_qq_friends = bot.get_all_friends_in_qq()custom_print(u'所有qq好友号码和备注名中...')qq_number_list = []for key, friend_group in all_qq_friends.items():for info in friend_group['mems']:qq_number_list.append(info['uin'])并获取所有群数据
遇到问题没人解答?小编创建了一个Python学习交流QQ群:766545907
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''# 获取所有群信息custom_print(u'获取该QQ加入的所有群信息...')group_list = bot.get_group()print(group_list)# content为markdown语法文本content = '\n\n<br/><br/>\n' + '## 我加入的群资料\n' + '序号|群名|群号|群主QQ\n:- | :-| :-| :-\n'# 获取某个群的群成员信息for index, group in enumerate(group_list):group_number = group['gc']group_name = group['gn']owner = group['owner']content += '{}|{}|{}|{}\n'.format(str(index+1), str(group_name), str(group_number), str(owner))# 更新一下欲输出的markdown文本markdown_content += content# 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:file.write(markdown_content)

接下来的步骤如你所需,也就是获取其他相关的数据,所以本小节就不一一详细解释了,您可以查看相关源代码查看。获取的数据包括:

获取过去30天内退出的群名单
获取过去364天内删除的好友名单
判断此次登录的qq是否为vip或者svip
获取qb值
获取代付信息
亲密度排行榜
共同好友数
成为好友的天数
qq_bot模块
此模块实现了获取qq数据的接口,主要通过抓包获得数据、分析数据,对参数进行加密解密等。

首先,是模拟扫码登录id.qq.com,qun.qq.com,qzone.qq.com。三者登录方式大同小异,唯一有区别的就是提交数据中的参数加密方式不同。
我们以id.qq.com登录为例:

遇到问题没人解答?小编创建了一个Python学习交流QQ群:766545907
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''def login_id_qq_com(self):# 登录id.qq.com# 访问网页,为了获取参数pt_login_siglogin_url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?pt_disable_pwd=1&appid=1006102&daid=1&style=23&hide_border=1&proxy_url=https://id.qq.com/login/proxy.html&s_url=https://id.qq.com/index.html'html = get_html(login_url, '')# 对返回的cookies进行转化为dict类型,方便处理cookies_back_dict = dict_from_cookiejar(html.cookies)pt_login_sig = cookies_back_dict['pt_login_sig']self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)# 访问网页,为了获取参数ptqrtokenqrcode_url = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=1006102&e=2&l=M&s=4&d=72&v=4&t=0.10239549811477189&daid=1&pt_3rd_aid=0'html = get_html(qrcode_url, '')# 对返回的cookies进行转化为dict类型,方便处理cookies_back_dict = dict_from_cookiejar(html.cookies)qrsig = cookies_back_dict['qrsig']ptqrtoken = hash33_token(qrsig)self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)# 将二维码显示到图片框BytesIOObj = BytesIO()BytesIOObj.write(html.content)qr_code = PIL.Image.open(BytesIOObj)image = PIL.ImageTk.PhotoImage(qr_code)image_label['image'] = image# 实时检测二维码状态while (True):# 目标网址target_url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https://id.qq.com/index.html&ptqrtoken=' + str(ptqrtoken) + '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-1556812236254&js_ver=19042519&js_type=1&login_sig=' + str(pt_login_sig) + '&pt_uistyle=40&aid=1006102&daid=1&'# 登录,需要带上访问cookieshtml = get_html(target_url, self.cookies_merge_dict_in_id_qq_com)# 返回的响应码为200说明二维码没过期if (html.status_code):if ('二维码未失效' in html.text):custom_print(u'(1/3)登录id.qq.com中,当前二维码未失效,请你扫描二维码进行登录')elif ('二维码认证' in html.text):custom_print(u'(1/3)登录id.qq.com中,扫描成功,正在认证中')elif ('登录成功' in html.text):self.is_login = Truecustom_print(u'(1/3)登录id.qq.com中,登录成功')breakif ('二维码已经失效' in html.text):custom_print(u'(1/3)登录id.qq.com中,当前二维码已失效,请重启本软件')exit()# 延时time.sleep(2)# 登录成功后,把返回的cookies合并进去self.cookies_merge_dict_in_id_qq_com = dict_from_cookiejar(html.cookies)self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)# print(u'当前cookies:{}'.format(cookies_merge_dict))# 获取此次登录的qq号码qq_list = re.findall(r'&uin=(.+?)&service', html.text)self.qq_number = qq_list[0]# 登录成功后,会返回一个地址,需要对该地址进行访问以便获取新的返回cookiesstartIndex = (html.text).find('http')endIndex = (html.text).find('pt_3rd_aid=0')url = (html.text)[startIndex:endIndex] + 'pt_3rd_aid=0'# 屏蔽https证书警告urllib3.disable_warnings()# 这里需要注意的是,需要禁止重定向,才能正确获得返回的cookieshtml = get(url, cookies=self.cookies_merge_dict_in_id_qq_com, allow_redirects=False, verify=False)# 把返回的cookies合并进去cookies_back_dict = dict_from_cookiejar(html.cookies)self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)

首先是访问指定网址,获取参数pt_login_sig,其次是访问另外一个网址,获取参数qrsig,通过加密函数,将参数qrsig转化为ptqrtoken,然后就是获取二维码图片的状态了。当我们检测到登录成功时,就证明用户已经完成扫码操作,此时将网址返回的cookie保存下来。

这里要说明的是,加密函数的获取,需要具备一定的抓包基础才能获取得到。本程序的几个加密函数如下:

# 对qrsig进行基本的加密,该加密函数由抓包获得,需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数,将其改写成python版本
def hash33_token(t):e, n = 0, len(t)for i in range(0,n):e += (e << 5) + ord(t[i])return 2147483647 & e# 对skey进行基本的加密,该加密函数由抓包获得,需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数,将其改写成python版本
def hash33_bkn(skey):e = skeyt = 5381for n in range(0,len(e)):t += (t << 5) + ord(e[n])return 2147483647 & t

由于该模块下具有许多获取相关数据的qq接口,但是它们的形式非常相似,所以本节仅仅以获取所有qq群数据为例:

    def get_group(self):# 获取所有群基本信息# bkn由参数skey通过另一个加密函数得到bkn = hash33_bkn(self.cookies_merge_dict_in_qun_qq_com['skey'])submit_data = {'bkn': bkn}html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_group_list', self.cookies_merge_dict_in_qun_qq_com, submit_data)group_info = loads(html.text)print(group_info)return group_info['join']

这里主要涉及到的还是参数的加密、解密过程,这是一个难点,其他的话还是比较简单的。

tkinter_gui模块
这个模块是绘制基本的gui模块,采用python内置的tkinter模块完成,用法相当简单,这里就不详细讲了。

static_data模块
这个模块主要是用来存储相关的数据的,在程序每次运行时,将该静态资源文件输出。这么做的原因是可以防止用户将某些静态数据给删除了,导致程序运行错误。

一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?相关推荐

  1. 用Python一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?

    一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深? 简介 近几年,由于微信的流行,大部分人不再频繁使用QQ,所以我们对于自己的QQ数据并不是特别了解.我相信,如果能够生成一份属于自己的 ...

  2. 一键生成你的微信社交数据报告

    苏生不惑第162 篇原创文章,将本公众号设为星标,第一时间看最新文章. 关于微信之前写过以下文章,有兴趣可以点击阅读: 如何导出你的微信语音 c 盘空间又满了?微信清理神器帮你释放空间 微信撤回的消息 ...

  3. 用 Python 一键生成QQ个人报告

    分享一个最近看到的Github项目. 项目介绍 近几年,由于微信的流行,大部分人不再频繁使用QQ,所以我们对于自己的QQ数据并不是特别了解.我相信,如果能够生成一份属于自己的QQ历史报告,那将是无比开 ...

  4. 用Python一键生成微信个人专属数据报告,了解你的微信社交历史

    简介 你是否想过生成一份属于你的微信个人数据报告,了解你的微信社交历史.现在,我们基于python对微信好友进行全方位数据分析,包括:昵称.性别.年龄.地区.备注名.个性签名.头像.群聊和公众号等. ...

  5. 8.一键生成微信个人专属数据报告(了解你的微信社交历史)

    1.你是否想过生成一份属于你的微信个人数据报告,了解你的微信社交历史.现在,我们基于python对微信好友进行全方位数据分析,包括:昵称.性别.年龄.地区.备注名.个性签名.头像.群聊.公众号等. 其 ...

  6. 扫一扫,一键生成微信个人数据报告

    前两天 QQ 个人轨迹火了一把,也有小伙伴问到微信有没有这种统计,这很正常.现在大多数的人越来越离不开微信,微信好友也越来越多,从刚开始的同学朋友亲戚,到现在基本什么人都有,熟悉的不熟悉反正都成微信好 ...

  7. 怎么进行固定资产盘点,资产盘点报告如何一键生成

    固定资产是指企业持有一个会计年度以上用于生产商品.提供劳务.租赁或经营管理的资产.固定资产是企业的重要财产,是企业生产的必要条件,可以提高企业的生产能力,促进技术进步,提高企业的经济效益,对企业的发展 ...

  8. Python办公自动化|一键生成数据分析报告

    前两天逛知乎的时候看到这样一个提问,Python自动化办公能做那些有趣或者有用的事情? 看了一下这个提问,我想这可能是很多职场人面临的困惑,想把Python用到工作中来提升效率,却不知如何下手?Pyt ...

  9. 安卓2.3.6一键root_一键查询qq历史头像2.0安卓下载-一键查询qq历史头像软件2.0版下载免root版...

    一键查询qq历史头像软件版是一个实用的查询qq历史头像工具,大家可以根据QQ号直接查询历史使用的各种头像哦.一键查询qq历史头像app可以帮助大家找回丢失的回忆,想起自己以前做过的一些傻逼事,需要的小 ...

  10. 一键生成网站或qq的二维码

    目录 准备工作(1) 准备工作(2) 生成方法一.用power shell生成二维码 生成网站二维码 生成我们的qq二维码 生成方法二.用python生成二维码 效果展示 准备工作(1) 需要安装py ...

最新文章

  1. 月光博客 - 再谈软件保护中软加密和硬加密的安全强度
  2. idea 快捷键在方法上抛出异常
  3. 基于动态用户偏好和服务质量的推荐算法
  4. SVM实战:如何进行乳腺癌检测
  5. PTA 7-3 地铁一日游 (30 分)
  6. 转: 深入浅出-网络七层模型
  7. JUnit单元测试笔记
  8. 程序员的传奇“破圈”之路
  9. Redis 存储SQL表格 方法
  10. c#中类的简单使用学习
  11. 从研发角度谈存储技术的学习
  12. Android【报错】This class should be public (android.support.v7.internal.widget.ActionBarView.HomeView)
  13. pkm是什么意思_2017年的你应该拥有什么样的PKM系统?
  14. VOSviewer | (一)从零安装教程
  15. Webgl(ThreeJS)空间测量\测距功能(附工程文件)
  16. 哈佛幸福课中提到的书_借助虚拟现实,在哈佛最大的班级中排在前列
  17. C# AHP层次分析法:一致性校验
  18. 计算机应用程序没声音怎么办,电脑没声音怎么办
  19. 关于qt/qte在Ubuntu/Debain下的安装
  20. Mac开发-公证流程记录Notarization-附带脚本

热门文章

  1. 世界十大流行编程语言
  2. S3-s3cmd命令行工具使用
  3. 新手写的一个12306刷票工具
  4. 使用CefSharp开发一个12306“安心刷票弹窗通知”工具
  5. 我在垃圾场捡到一个黑匣子,拆给大家看看
  6. Java计算时间,可以像微信朋友圈那样显示发布的时间
  7. huge形式_Linux hugepage使用与实现
  8. 黑色的计算机英语,黑色英文怎么说_黑色的英文怎么写 - 沪江英语
  9. 036--python--摇骰子游戏
  10. MyDockFinder(mydock myfinder合二为一版)