一键生成QQ个人历史报告(附下载链接)

简介: 一键生成QQ个人历史报告(附下载链接)

导读】最近,我闲着没事在刷全球最大同性交友网站Github时,发现了一个十分有趣的项目。项目主要是生成QQ个人历史报告,从你申请QQ开始到现在的所有数据,且听我慢慢道来。            

项目简介


  近几年,由于微信的流行,大部分人不再频繁使用QQ,所以我们对于自己的QQ数据并不是特别了解。我相信,如果能够生成一份属于自己的QQ历史报告,那将是无比开心的一件事。

  目前本程序获取的数据包括:QQ详细数据、手机在线时间、非隐身状态下在线时间、QQ活跃时间、单向好友数量、QQ财产分析、群聊分析、过去一年我退出的群聊数据、退去一个月我删除的好友数据、所有代付信息、我最在意的人以及最在意我的人。由于相关的数据接口有访问限制,所以本程序并没有对QQ好友进行分析。

功能截图


69b95bc8292d4ad6ad5d2e5491686d67.png

f1451c3d284769528a0dda8a64b37e65.jpg

9b4ca3436d705225933a54f698ab8ad1.jpg

4a8f77af43de3019c06f1f5b3091a4d8.jpg

编写思路


本程序分为多个模块,模块如下:

1、main.py,主程序,用于获取并处理相关数据,并导出数据报告。

2、qq_bot.py, 核心模块,实现了qq相关的接口,较为复杂。

3、tkinter_gui.py,绘制gui模块,使用tkinter绘制基本的交互界面。

4、static_data.py,数据存储模块,所有数据采用base64编码存储。

main.py模块


# 初始化文件夹init_folders()
# 写入项目所需资源文件到本地目录write_data()
# 创建一个自己编写的qq bot对象bot=Bot()
custom_print(u'登录成功,正在获取数据...')
# 定义欲输出的markdown字符串markdown_content='''<palign="center"><fontsize='6px'>{qq_number}的个人QQ历史报告</font><imgsrc="{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'forkey, valueindetail_information.items():
ifkey=='qq_level':
star_count, moon_count, sun_count, crown_count=calculate_level(value)
data=crown_count*'![](data/level_crown.png)'+sun_count*'![](data/level_sun.png)'+moon_count*'![](data/level_moon.png)'+star_count*'![](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文件,以便防止程序出错时能够保存到最新的数据withopen('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') asfile:
file.write(markdown_content)

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

  1. 获取过去30天内退出的群名单
  2. 获取过去364天内删除的好友名单
  3. 判断此次登录的qq是否为vip或者svip
  4. 获取qb值
  5. 获取代付信息
  6. 亲密度排行榜
  7. 共同好友数
  8. 成为好友的天数

qq_bot模块


  此模块实现了获取qq数据的接口,主要通过抓包获得数据、分析数据,对参数进行加密解密等。

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

deflogin_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 ('二维码未失效'inhtml.text):
custom_print(u'(1/3)登录id.qq.com中,当前二维码未失效,请你扫描二维码进行登录')
elif ('二维码认证'inhtml.text):
custom_print(u'(1/3)登录id.qq.com中,扫描成功,正在认证中')
elif ('登录成功'inhtml.text):
self.is_login=Truecustom_print(u'(1/3)登录id.qq.com中,登录成功')
breakif ('二维码已经失效'inhtml.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)

接下来就不一一叙说了,想看源码的话可以去github地址https://github.com/shengqiangzhang/examples-of-web-crawlers/tree/master/下查看。

tkinter_gui模块


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

static_data模块


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

PS:如果想要自己查看QQ历史报告的话,博主已经把这个程序打包好了,可以在公众号后台回复“QQ个人报告”就可以获取下载链接啦!顺便说下,生成的报告是.md文件,如果你没有下载Markdown编辑器的话可以百度在线Markdown编辑器,把生成的.md文件先用记事本打开,然后复制里面的内容到Markdown编辑器就可以了。

相关文章
|
8月前
|
前端开发 JavaScript Java
新闻发布项目——访问温馨提示
新闻发布项目——访问温馨提示
|
4月前
|
机器学习/深度学习 数据可视化 数据处理
利用R语言进行头条主页内容的自动化下载
利用R语言进行头条主页内容的自动化下载
|
7月前
|
开发框架 .NET Java
程序员必知:发个原创小工具,下载autohome论坛帖子离线浏览
程序员必知:发个原创小工具,下载autohome论坛帖子离线浏览
31 0
|
8月前
|
数据可视化 定位技术
全球卫星信息数据下载网站整理
全球卫星信息数据下载网站整理
1010 1
|
8月前
免费公开微博小助手源代码---基于Autojs4的
免费公开微博小助手源代码---基于Autojs4的
147 0
[笔记] Win11各种常见问题记录(持续更新)
[笔记] Win11各种常见问题记录(持续更新)
|
API Python
Pytube下载YouTube视频提示错误'streamingData'
Pytube是一个用Python编写的工具,可以方便地从YouTube下载视频。使用中提示错误‘streamingData’,需要注意以下两个问题,如果想下载高清视频需要使用pytube的12.0.0版本,并且应用上面的第一个方案。
181 0
成功解决最新版腾讯QQ软件出现的二维码加载失败,请点击刷新(一步搞定!)
成功解决最新版腾讯QQ软件出现的二维码加载失败,请点击刷新(一步搞定!)
成功解决最新版腾讯QQ软件出现的二维码加载失败,请点击刷新(一步搞定!)
|
Android开发
autojs历史截图
牙叔教程 简单易懂
224 0

热门文章

最新文章