在好例子网,分享、交流、成长!
您当前所在位置:首页Python 开发实例常用Python方法 → 用 Python 一键生成QQ个人报告

用 Python 一键生成QQ个人报告

常用Python方法

下载此实例
  • 开发语言:Python
  • 实例大小:19.71M
  • 下载次数:19
  • 浏览次数:281
  • 发布时间:2020-01-03
  • 实例类别:常用Python方法
  • 发 布 人:aon
  • 文件格式:.zip
  • 所需积分:2
 相关标签: python python QQ

实例介绍

【实例简介】

生成一份属于自己的QQ历史报告

【实例截图】


from clipboard


from clipboardfrom clipboard

【核心代码】

# -*- coding:utf-8 -*-

# 引用自定义库
from qq_bot import *
from static_data import *

# 引用第三方库
from threading import Thread
from os.path import exists
from os import makedirs
from shutil import rmtree
from base64 import b64decode
import time


# 初始化所需文件夹
def init_folders():

    for dir in ['data']:
        if(not (exists(dir))):
            # 目录不存在时则创建
            makedirs(dir)
        else:
            # 目录存在时则先删除递归删除该目录再重新创建
            rmtree(dir)
            makedirs(dir)


# 写入相关资源文件到本地
def write_data():

    key_dict = {
        'qq_icon':qq_icon,
        'level_star':level_star,
        'level_moon':level_moon,
        'level_sun':level_sun,
        'level_crown':level_crown
    }
    for name in ['qq_icon', 'level_star', 'level_moon', 'level_sun', 'level_crown']:
        # 保存qq_icon图片到本地data目录
        with open('data/' name '.png', 'wb') as file:
            # 解码图片
            png = b64decode(key_dict[name])
            # 将解码得到的数据写入到图片中
            file.write(png)


# 根据Q等级绘制等级图标
def calculate_level(level):
    level = int(level)
    star_count = 0
    moon_count = 0
    sun_count = 0
    crown_count = 0

    # //表示向下取整 %表示取余
    crown_count = level // 64
    tmp = level % 64

    sun_count = tmp // 16
    tmp = tmp % 16

    moon_count = tmp // 4
    tmp = tmp % 4

    star_count = tmp // 1

    return star_count, moon_count, sun_count, crown_count


# 获取个人数据
def generate_data():

    # 定义欲输出的markdown字符串
    markdown_content = '''
<p align="center">
    <font size='6px'>{qq_number}的个人QQ历史报告</font>
    <img src="{qq_icon_png}" align="right" height="60">
</p>
'''

    # 初始化文件夹
    init_folders()
    # 写入项目所需资源文件到本地目录
    write_data()




    # 创建一个自己编写的qq bot对象
    bot = Bot()
    custom_print(u'登录成功,正在获取数据...')
    # 更新一下欲输出的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'

    # 将key换成中文文本
    key_dict = {
        'bind_email':'绑定邮箱',
        'last_contact_friend_count': '最近联系人数量',
        'friend_count': '好友数量',
        'group_count': '好友分组数量',
        'qq_level': '账号等级',
        'qq_level_rank': '等级排名',
        'nickname': '昵称',
        'odd_friend_count': '**单向好友数量**',
        'qq_age': 'Q龄',
        'remark_friend_count':'已备注的好友数量',
        'mobile_qq_online_hour': '**手机QQ累计在线时间(小时)**',
        'no_hide_online_hour': '**未隐身状态下累计在线时间(小时)**',
        'total_active_day': '**在线活跃时间**',
        'age': '真实年龄',
        'birthday': '出生日期',
        'qq_signature': '个性签名(前20字)',
    }

    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 * '![](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 = content
    markdown_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'])




    # 获取所有群信息
    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天内退出的群名单
    custom_print(u'获取过去30天退出的群...')
    data = bot.get_quit_of_group()
    delete_group_count = 0
    # content为markdown语法文本
    content = '\n\n<br/><br/>\n' '## 过去30天内我退出的群\n'
    if 'ls' in data.keys():
        delete_group_count = len(data['ls'])
    content = '过去30天内,我退出的群个数为**{}**个'.format(delete_group_count)

    if(delete_group_count > 0):
        content = ',它们分别是:\n' '序号|群名|群号|退出时间\n:- | :-| :-| :-\n'
        for index, group in enumerate(data['ls']):
            timeStamp = int(group['t'])
            timeArray = time.localtime(timeStamp)
            otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)

            content = '{}|{}|{}|{}\n'.format(str(index),group['n'],group['gc'],otherStyleTime)

    content = '\n\n'
    # 更新一下欲输出的markdown文本
    markdown_content = content
    # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据
    with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:
        file.write(markdown_content)






    # 获取过去364天内删除的好友名单
    custom_print(u'获取过去12个月删除的好友名单...')
    delete_friend_list = bot.get_delete_friend_in_360day()
    delete_friend_count = len(delete_friend_list)
    # content为markdown语法文本
    content = '\n\n<br/><br/>\n' '## 过去364天内我删除的好友\n'
    content = '过去364天内,我删除的好友个数为**{}**个'.format(delete_friend_count)
    if(delete_friend_count > 0):
        content = ',它们分别是:\n' '序号|Q号\n:- | :-\n'
        for index, qq_number in enumerate(delete_friend_list):
            content = '{}|{}\n'.format(str(index),str(qq_number))

    content = '\n\n'
    # 更新一下欲输出的markdown文本
    markdown_content = content
    # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据
    with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:
        file.write(markdown_content)








    # 判断此次登录的qq是否为vip或者svip
    # content为markdown语法文本
    content = '\n\n<br/><br/>\n' '## 财产分析\n'
    custom_print(u'判断该QQ是否为高级用户...')
    data = bot.is_vip_svip()
    isSvip = data['isSvip']
    isVip = data['isSvip']
    if(str(isVip) == '0' and str(isSvip) == '0'):
        content = '此时此刻,我既不是**QQ VIP**,也不是**QQ SVIP**\n'
    elif(str(isVip) != '0' and str(isSvip) != '0'):
        content = '此时此刻,我既是**QQ VIP**,也是**QQ SVIP**\n'
    elif(str(isVip) == '0' and str(isSvip) != '0'):
        content = '此时此刻,我不是**QQ VIP**,但我是**QQ SVIP**\n'
    elif(str(isVip) != '0' and str(isSvip) == '0'):
        content = '此时此刻,我是**QQ VIP**,但不是**QQ SVIP**\n'

    # 获取qb值
    custom_print(u'获取账户QB值...')
    qb_value = bot.get_qb()
    timeArray = time.localtime()
    otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)
    content = '截止到**{}**,我剩余的Q币个数为:**{}**个\n\n'.format(otherStyleTime,qb_value)

    # 获取代付信息
    custom_print(u'获取代付信息中...')
    pay_list = bot.get_pay_for_another()
    content = '截止到**{}**,我收到的代付信息条数为:**{}**个'.format(otherStyleTime, len(pay_list))
    if(len(pay_list) > 0):
        content = ',它们分别是:\n' '序号|索要者QQ|索要者昵称|留言内容|索要时间\n:- | :-| :-| :-| :-\n'
        for index, pay_info in enumerate(pay_list):
            if(str(pay_info['fromuin']) != '0'):
                nick = pay_info['nick'].replace('&nbsp;',' ')
                timeArray = time.localtime(int(pay_info['trantime']))
                otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)
                content = '{}|{}|{}|{}|{}\n'.format(str(index),str(pay_info['fromuin']),nick,str(pay_info['content']),otherStyleTime)

    content = '\n\n'
    # 更新一下欲输出的markdown文本
    markdown_content = content
    # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据
    with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:
        file.write(markdown_content)





    # 亲密度排行榜 谁在意我
    custom_print(u'分析好友亲密度数据-谁在意我...')
    # content为markdown语法文本
    content = '\n\n<br/><br/>\n' '## 谁在意我\n'
    data_list = bot.who_care_about_me()
    n = 10
    if(len(data_list) < 10):
        n = len(data_list)

    if (len(data_list) > 0):
        content = '序号|头像|QQ|亲密度\n:- | :-| :-| :-\n'
        for index, sub_data in enumerate(data_list[:n]):
            uin = sub_data['uin']
            score = sub_data['score']
            profile = bot.get_profile_picture(uin, size=40)
            with open('data/' str(uin) '.jpg', 'wb') as f:
                f.write(profile)
            content = '{}|![](data/{}.jpg)|{}|{}\n'.format(index, uin, uin, score)

        # 更新一下欲输出的markdown文本
        markdown_content = content
        # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据
        with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:
            file.write(markdown_content)





    # 亲密度排行榜 我在意谁
    custom_print(u'分析好友亲密度数据-我在意谁...')
    # content为markdown语法文本
    content = '\n\n<br/><br/>\n' '## 我在意谁\n'
    data_list = bot.i_care_about_who()
    n = 10
    if(len(data_list) < 10):
        n = len(data_list)

    if (len(data_list) > 0):
        content = '序号|头像|QQ|亲密度\n:- | :-| :-| :-\n'
        for index, sub_data in enumerate(data_list[:n]):
            uin = sub_data['uin']
            score = sub_data['score']
            profile = bot.get_profile_picture(uin, size=40)
            with open('data/' str(uin) '.jpg', 'wb') as f:
                f.write(profile)
            content = '{}|![](data/{}.jpg)|{}|{}\n'.format(index, uin, uin, score)

        # 更新一下欲输出的markdown文本
        markdown_content = content
        # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据
        with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:
            file.write(markdown_content)




    # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据
    with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file:
        file.write(markdown_content)
    custom_print(u'所有数据获取完毕, 并生成了一份报告文件:[{}的个人QQ历史报告.md], 该文件为markdown格式文件, 请下载typora软件以便查看该格式文件, 下载地址为https://typora.io/#windows'.format(bot.qq_number))

if __name__ == "__main__":


    # 启动获取数据线程
    t = Thread(target=generate_data, name='generate_data')
    t.start()

    # 启动tkinter gui
    gui()

标签: python python QQ

实例下载地址

用 Python 一键生成QQ个人报告

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 亚历山大号 发表于: 2020-12-24 20:55 37
作者GitHub 链接 https://github.com/shengqiangzhang/examples-of-web-crawlers

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警