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

目录

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

    • 简介
    • 功能截图
    • 如何运行
    • 如何打包成二进制可执行文件
    • 编写思路
    • 补充

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

简介

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

其中,在分析好友类型方面,主要统计出你的陌生人、星标好友、不让他看我的朋友圈的好友、不看他的朋友圈的好友数据。在分析地区方面,主要统计所有好友在全国的分布以及对好友数最多的省份进行进一步分析。在其他方面,统计出你的好友性别比例、猜出你最亲密的好友,分析你的特殊好友,找出与你所在共同群聊数最多的好友数据,对你的好友个性签名进行分析,对你的好友头像进行分析,并进一步检测出使用真人头像的好友数据。

目前网上关于这方面的数据分析文章比较多,但是运行起来比较麻烦,而本程序的运行十分简单,只需要扫码登录一步操作即可。

功能截图










如何运行

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

如何打包成二进制可执行文件

# 安装pyinstaller
pip install pyinstaller
# 跳转到当前目录
cd 目录名
# 先卸载依赖库
pip uninstall -y -r requirement.txt
# 再重新安装依赖库
pip install -r requirement.txt
# 更新 setuptools
pip install --upgrade setuptools
# 开始打包
pyinstaller generate_wx_data.py

编写思路

  1. 首先,进行初始化,并根据不同操作系统,启用微信机器人。
    # 初始化所需文件夹
    init_folders()

    # 启动微信机器人,自动根据操作系统执行不同的指令
    if('Windows' in system()):
        # Windows
        bot = Bot(cache_path=True)
    elif('Darwin' in system()):
        # MacOSX
        bot = Bot(cache_path=True)
    elif('Linux' in system()):
        # Linux
        bot = Bot(console_qr=2,cache_path=True)
    else:
        # 自行确定
        print(u"无法识别你的操作系统类型,请自己设置")
        exit()
  1. 登录完微信后,开始获取好友数据和群聊数据。
# 获取所有好友
friends = bot.friends(update=False)

# 获取所有活跃群聊
groups = bot.groups()
  1. 共同所在群聊成员分析,依次对每个好友进行检测。
def group_common_in():

    # 获取所有活跃的群聊
    groups = bot.groups()

    # 每个好友与你相同的群聊个数
    dict_common_in = {}

    # 遍历所有好友,第0个为你自己,所以去掉
    for x in friends[1:]:
        # 依次在每个群聊中搜索
        for y in groups:
            # x在y中
            if(x in y):
                # 获取微信名称
                name = x.nick_name
                # 判断是否有备注,有的话就使用备注
                if(x.remark_name and x.remark_name != ''):
                    name = x.remark_name

                # 增加计数
                if(name in dict_common_in.keys()):
                    dict_common_in[name] += 1
                else:
                    dict_common_in[name] = 1
  1. 获取微信好友头像,以便进一步分析。这里下载头像比较慢,所以采取多线程方式进行下载。在多线程中,使用队列保存我们的头像url,不同线程从队列中获取头像url,并下载到本地。
    # 创建一个队列,用于多线程下载头像,提高下载速度
    queue_head_image = Queue()

    # 将每个好友元素存入队列中
    # 如果为了方便调试,可以仅仅插入几个数据,friends[1:10]
    for user in friends:
        queue_head_image.put(user)

    # 启动10个线程下载头像
    for i in range(1, 10):
        t = Thread(target=download_head_image,args=(i,))
        t.start()

其中download_head_image的具体实现为:

# 下载好友头像,此步骤消耗时间比较长
def download_head_image(thread_name):

    # 队列不为空的情况
    while(not queue_head_image.empty()):
        # 取出一个好友元素
        user = queue_head_image.get()

        # 下载该好友头像,并保存到指定位置,生成一个15位数的随机字符串
        random_file_name = ''.join([str(random.randint(0,9)) for x in range(15)])
        user.get_avatar(save_path='image/' + random_file_name + '.jpg')

        # 输出提示
        print(u'线程%d:正在下载微信好友头像数据,进度%d/%d,请耐心等待……' %(thread_name, len(friends)-queue_head_image.qsize(), len(friends)))
  1. 进行性别、地区统计,并将生产的html文件保存到本地。这里没什么难度,所以就不详细展开了。
# 分析好友性别比例
def sex_ratio():

    # 初始化
    male, female, other = 0, 0, 0

    # 遍历
    for user in friends:
        if(user.sex == 1):
            male += 1
        elif(user.sex == 2):
            female += 1
        else:
            other += 1

    name_list = ['男性', '女性', '未设置']
    num_list = [male, female, other]

    pie = Pie("微信好友性别比例")
    pie.add("", name_list, num_list, is_label_show=True)
    pie.render('data/好友性别比例.html')
  1. 分析你认识的好友、最亲密的人以及特殊好友。以特殊好友为例,我们将好友分为星标好友(很重要的人), 不让他看我的朋友圈的好友, 不看他朋友圈的好友, 消息置顶好友, 陌生人。这里分类的依据是根据itchat中的StarFriendContactFlag而来的。根据经验可知,StarFriend为1表示为星标好友,ContactFlag为1和3表示好友,259和33027表示不让他看我的朋友圈,65539和65537和66051表示不看他的朋友圈,65795表示两项设置全禁止, 73731表示陌生人。
# 特殊好友分析
def analyze_special_friends():

    # 星标好友(很重要的人), 不让他看我的朋友圈的好友, 不看他朋友圈的好友, 消息置顶好友, 陌生人
    star_friends, hide_my_post_friends, hide_his_post_friends, sticky_on_top_friends, stranger_friends = 0, 0, 0, 0, 0

    for user in friends:

        # 星标好友为1,为0表示非星标,不存在星标选项的为陌生人
        if('StarFriend' in (user.raw).keys()):
            if((user.raw)['StarFriend'] == 1):
                star_friends += 1
        else:
            stranger_friends += 1

        # 好友类型及权限:1和3好友,259和33027不让他看我的朋友圈,65539和65537和66051不看他的朋友圈,65795两项设置全禁止, 73731陌生人
        if((user.raw)['ContactFlag'] in [259, 33027, 65795]):
            hide_my_post_friends += 1
        if ((user.raw)['ContactFlag'] in [66051, 65537, 65539, 65795]):
            hide_his_post_friends += 1

        # 消息置顶好友为2051
        if ((user.raw)['ContactFlag'] in [2051]):
            sticky_on_top_friends += 1

        # 陌生人
        if ((user.raw)['ContactFlag'] in [73731]):
            stranger_friends += 1

    bar = Bar('特殊好友分析')
    bar.add(name='', x_axis=['星标', '不让他看我朋友圈', '不看他朋友圈', '消息置顶', '陌生人'], y_axis=[star_friends, hide_my_post_friends, hide_his_post_friends, sticky_on_top_friends, stranger_friends], legend_orient="vertical", legend_pos="left")
    bar.render('data/特殊好友分析.html')
  1. 对好友个性签名进行分析,并绘制出词语。这里比较复杂,首先将个性签名列表转化为字符串,调用nlp处理接口,对返回的数据进行过滤。同时,对短语进行分词,过滤,词频统计操作。最后,使用pyechart进行绘制词语图。代码中注释非常多,基本都能看懂,所以在此也无需再详细展开了。
# 分析个性签名
def analyze_signature():

    # 个性签名列表
    data = []
    for user in friends:

        # 清除签名中的微信表情emoj,即<span class.*?</span>
        # 使用正则查找并替换方式,user.signature为源文本,将<span class.*?</span>替换成空
        new_signature = re.sub(re.compile(r"<span class.*?</span>", re.S), "", user.signature)

        # 只保留签名为1行的数据,过滤为多行的签名
        if(len(new_signature.split('\n')) == 1):
            data.append(new_signature)

    # 将个性签名列表转为string
    data = '\n'.join(data)

    # 进行分词处理,调用接口进行分词
    # 这里不使用jieba或snownlp的原因是无法打包成exe文件或者打包后文件非常大
    postData = {'data':data, 'type':'exportword', 'arg':'', 'beforeSend':'undefined'}
    response = post('http://life.chacuo.net/convertexportword',data=postData)
    data = response.text.replace('{"status":1,"info":"ok","data":["', '')
    # 解码
    data = data.encode('utf-8').decode('unicode_escape')

    # 将返回的分词结果json字符串转化为python对象,并做一些处理
    data = data.split("=====================================")[0]

    # 将分词结果转化为list,根据分词结果,可以知道以2个空格为分隔符
    data = data.split('  ')

    # 对分词结果数据进行去除一些无意义的词操作
    stop_words_list = [',', ',', '、', 'the', 'a', 'is', '…', '·', 'э', 'д', 'э', 'м', 'ж', 'и', 'л', 'т', 'ы', 'н', 'з', 'м', '…', '…', '…', '…', '…', '、', '.', '。', '!', '!', ':', ':', '~', '|', '▽', '`', 'ノ', '?', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\'', '‘', '’', '“', '”', '的', '了', '是', '你', '我', '他', '她','=', '\r', '\n', '\r\n', '\t', '以下关键词', '[', ']', '{', '}', '(', ')', '(', ')', 'span', '<', '>', 'class', 'html', '?', '就', '于', '下', '在', '吗', '嗯']
    tmp_data = []
    for word in data:
        if(word not in stop_words_list):
            tmp_data.append(word)
    data = tmp_data

    # 进行词频统计,结果存入字典signature_dict中
    signature_dict = {}
    for index, word in enumerate(data):

        print(u'正在统计好友签名数据,进度%d/%d,请耐心等待……' % (index + 1, len(data)))

        if(word in signature_dict.keys()):
            signature_dict[word] += 1
        else:
            signature_dict[word] = 1

    # 开始绘制词云
    name = [x for x in signature_dict.keys()]
    value = [x for x in signature_dict.values()]
    wordcloud = WordCloud('微信好友个性签名词云图')
    wordcloud.add("", name, value, shape='star', word_size_range=[1,100])
    wordcloud.render('data/好友个性签名词云.html')
  1. 拼接所有好友头像,这里使用到PIL的图像处理功能,首先对头像个数进行统计,自适应生成矩形图片。由于我们知道微信头像尺寸为640 * 640,所以处理起来就很方便了。
# 拼接所有微信好友头像
def merge_head_image():
    # 拼接头像
    pics = listdir('image')  # 得到user目录下的所有文件,即各个好友头像
    numPic = len(pics)
    eachsize = int(math.sqrt(float(640 * 640) / numPic))  # 先圈定每个正方形小头像的边长,如果嫌小可以加大
    numrow = int(640 / eachsize)
    numcol = int(numPic / numrow)  # 向下取整
    toImage = Image.new('RGB', (eachsize * numrow, eachsize * numcol))  # 先生成头像集模板

    x = 0  # 小头像拼接时的左上角横坐标
    y = 0  # 小头像拼接时的左上角纵坐标

    for index, i in enumerate(pics):

        print(u'正在拼接微信好友头像数据,进度%d/%d,请耐心等待……' % (index + 1, len(pics)))

        try:
            # 打开图片
            img = Image.open('image/' + i)
        except IOError:
            print(u'Error: 没有找到文件或读取文件失败')
        else:
            # 缩小图片
            img = img.resize((eachsize, eachsize), Image.ANTIALIAS)
            # 拼接图片
            toImage.paste(img, (x * eachsize, y * eachsize))
            x += 1
            if x == numrow:
                x = 0
                y += 1

    toImage.save('data/拼接' + ".jpg")
  1. 检测使用人脸作为头像的好友数量,这里使用到opencv的人脸检测功能,使用opencv默认的模型进行检测。首先载入图片,并进行灰度处理,最后加载人脸识别模型进行检测,若检测到脸数大于0,则说明存在。同时要注意的是,对错误的头像要进行舍弃操作。
# 检测使用真实人脸的好友个数
def detect_human_face():

    # 得到user目录下的所有文件名称,即各个好友头像
    pics = listdir('image')

    # 使用人脸的头像个数
    count_face_image = 0

    # 存储使用人脸的头像的文件名
    list_name_face_image = []

    # 加载人脸识别模型
    face_cascade = CascadeClassifier('model/haarcascade_frontalface_default.xml')

    for index, file_name in enumerate(pics):
        print(u'正在进行人脸识别,进度%d/%d,请耐心等待……' % (index+1, len(pics)))
        # 读取图片
        img = imread('image/' + file_name)

        # 检测图片是否读取成功,失败则跳过
        if img is None:
            continue

        # 对图片进行灰度处理
        gray = cvtColor(img, COLOR_BGR2GRAY)
        # 进行实际的人脸检测,传递参数是scaleFactor和minNeighbor,分别表示人脸检测过程中每次迭代时图
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)
        if (len(faces) > 0):
            count_face_image += 1
            list_name_face_image.append(file_name)

    print(u'使用人脸的头像%d/%d' %(count_face_image,len(pics)))
  1. 所有数据统计完后,我们生产一个总的html网页文件,方便我们直接查看。
# 生成一个html文件,并保存到文件file_name中
def generate_html(file_name):
    with open(file_name, 'w', encoding='utf-8') as f:
        data = '''
            <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
            <meta charset="UTF-8">
            <title>一键生成微信个人专属数据报告(了解你的微信社交历史)</title>
            <meta name='keywords' content='微信个人数据'>
            <meta name='description' content=''>
            <iframe name="iframe1" marginwidth=0 marginheight=0 width=100% height=60% src="data/好友地区分布.html" frameborder=0></iframe>
            <iframe name="iframe2" marginwidth=0 marginheight=0 width=100% height=60% src="data/某省好友地区分布.html" frameborder=0></iframe>
            <iframe name="iframe3" marginwidth=0 marginheight=0 width=100% height=60% src="data/好友性别比例.html" frameborder=0></iframe>
            <iframe name="iframe4" marginwidth=0 marginheight=0 width=100% height=60% src="data/你认识的好友比例.html" frameborder=0></iframe>
            <iframe name="iframe5" marginwidth=0 marginheight=0 width=100% height=60% src="data/你最亲密的人.html" frameborder=0></iframe>
            <iframe name="iframe6" marginwidth=0 marginheight=0 width=100% height=60% src="data/特殊好友分析.html" frameborder=0></iframe>
            <iframe name="iframe7" marginwidth=0 marginheight=0 width=100% height=60% src="data/共同所在群聊分析.html" frameborder=0></iframe>
            <iframe name="iframe8" marginwidth=0 marginheight=0 width=100% height=60% src="data/好友个性签名词云.html" frameborder=0></iframe>
            <iframe name="iframe9" marginwidth=0 marginheight=0 width=100% height=60% src="data/微信好友头像拼接图.html" frameborder=0></iframe>
            <iframe name="iframe10" marginwidth=0 marginheight=0 width=100% height=60% src="data/使用人脸的微信好友头像拼接图.html" frameborder=0></iframe>
        '''
        f.write(data)

补充

完整版源代码存放在github上,有需要的可以下载

项目持续更新,欢迎您star本项目

原文地址:https://www.cnblogs.com/cloudbird/p/10743642.html

时间: 2024-10-01 04:42:03

一键生成微信个人专属数据报告,了解你的微信社交历史的相关文章

微信公众平台数据接口正式对所有认证公众号开放

经过10多天的微信公众平台数据接口内测,现在正式对所有认证公众号开放了.微信公众平台数据接口正式向所有已微信认证(通过资质认证即可)的服务号和订阅号开放.通过数据接口,公众号开发者可以便利地获取更详细.更灵活的运营数据. 1.用户分析数据接口 通过该接口可以获取公众号的用户增减数据和累计用户数据. 2.图文分析数据接口 通过该接口可以获取公众号群发的图文消息的阅读.分享.收藏等数据. 3.消息分析数据接口 通过该接口可以获取用户向公众号发送消息的数据,包括消息发送人数.次数,以及消息发布次数的分

想做微信小程序第三方代理,各位觉得一键生成平台能赚到钱吗?

这几年生意不景气,这是很多人的共识.从2009年开始,各种专家就判断"明年经济是最差的一年."然后,这个明年,一直"明"到了2018年,到最后,我们发现,经济就没好过,一年比一年差. 工厂倒闭.商店关门.电商企业倒闭:虚拟经济都是泡沫,实体经济都是累赘:产品越来越难卖.消费者个性化需求越来越多,售后体验和服务要求越来越高--实体店倒闭潮,这几个词,已经在新闻上被用了好几年. 一边是马云的搞的电商,淘宝,打价格战,压低利润空间,一边是房地产飙升,房租涨涨涨~好不容易出

张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)

今天2017微信公开课PRO版在广州亚运城综合体育馆举行,这次2017微信公开课大会以“下一站”为主题,而此次的微信公开课的看点大家可能就集中在腾讯公司高级副总裁.微信之父——张小龙的演讲上了!今天中午各个互联网圈子里面传的最多的就是张小龙的演讲实录(别急,下面会附上张小龙的演讲实录).说的最多的话题就是微信小程序.今天马浩周带大家来解读和了解下2017微信公开课PRO版到底做了些什么? 从今年的2017微信公开课PRO版上面,我们可以提取出几个重点(敲黑板,划重点啦): 1.微信小程序将在20

「速成应用」一键生成微信小程序平台 可视化制作开发无需代码

经历了频繁的更新迭代,小程序已经构建起了趋于完善的生态,与此同时,以「速成应用」为代表的小程序第三方开发平台也在推动着小程序市场的发展.为了更好地助力企业打造微信内电商生态闭环,实现线上线下引流,「速成应用」于近日进行了全功能的更新,通过对各类功能组件的优化,帮助企业实现商业模式的转型升级与营销突破. 「速成应用」根据商家反馈的问题,重点对小程序模块中的电商.外卖等功能进行优化升级,旨在帮助企业解决门店经营与小程序线上营销两大难题.在这次升级过程中同样也对辅助功能进行了优化.升级完成后,全线功能

转载:使用Python一键生成Oracle性能excel曲线图

文章转自:http://www.shsnc.cn/show-109-970-1.html 进一步具体可参考:http://xlsxwriter.readthedocs.io/tutorial01.html 1.为什么要生成曲线图 做oracle数据库运维,有时会经常要看一周内数据库运行的情况,而通过性能曲线图最能展现数据库系统的性能变化情况了.如果有安装oracle的EM,看这个也不是问题.但有些数据库是没安装的,而且EM的是较难以实现定制化的报表需求的,难以把图表发给用户. 先来看一下要生成的

Java 后台管理开发框架!CURD 一键生成,再也不要重复搬砖了!

JavaWeb CURD 一键生成,再也不要重复搬砖了! JavaWeb CURD 一键生成再也不要重复搬砖了 主流技术框架 技术特色 代码片段 系统展示 高大上的登录界面 开发工具基本配置 CURD属性配置 CURD一键生成 角色编辑 微信设置 微信状态查看 树形演示实体 管理员列表 存储插件列表 二维码生成 获取方式 本文将给您介绍 AppAdmin 后台管理系统开发框架. AppAdmin后台管理系统开发框架是一套Java开发的整合了当前众多比较流行的Java后台开发框架的系统,使用H5响

一键生成JFinal模块代码(Eclipse插件)

代码生成工具在日常开发中是必不可少,因为代码生成工具能够一键生成代码,减少重复的工作,缩短开发周期.五一期间个人开发了一个基于Eclipse插件的代码生成工具(jfinal-generator),这里分享一下. jfinal-generator支持JFinal官方代码生成策略,同时也支持用户自定义代码生成策略,并支持多种数据作为数据源. 1.首先贴出一张效果图,如下图 2.以JFinal官方的Generator为例,生成BaseModel和Model等相关文件,如下图(gif) 3.自定义代码生

点我吧工作总结(技术篇) Ant一键生成APP技术

1.博客概要 本文详细介绍了当今流行的一键生成APP技术.介绍了这种设计思想的来源,介绍了国内外的研究背景,并介绍了这个技术体系中的一些实现细节,欢迎各路大神们多提意见.一键生成技术,说的通俗点就是,要在自有平台上发布若干个代码一致,但包名,版本,引用资源都不同的App,即实现一套代码生成多个不同的APK(注意哦,这一系列的编译打包都是自动化的). 2.认识一个Android项目 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑. 如上图所

2016-2017中国房地产走势大数据报告亮相

站在2016年岁末来看大势,中国楼市分化日益加剧,一线二线城市先扬后抑,三四线城市景气度持续偏低,去库存压力大. 2017年呢?任大炮只丢了一句,下一轮楼市会涨得更厉害!没有人能预见未来,我们只相信数据. 12月21日,一份<2016-2017中国房地产走势大数据报告>在2016年腾讯区域影响力峰会上亮相.它是由腾讯房产联合腾讯网.腾讯研究院房产研究中心.企鹅智酷等多家机构共同完成,报告在200多个城市展开问卷调查,共回收有效问卷19万余份. 在互联网+的大背景下,本次调查围绕用户画像.底层数