当 Python 遇到了你的微信好友

临近毕业,慢慢的也感伤起来,回想大学这几年,除了技术的成长,最值得庆幸的就是结交了一帮志同道合的好友。后期本身作了公众号,微信好友的数量也愈来愈多,身边人所扮演的角色也愈来愈丰富,有早已结婚生子为人父母的同窗,有沉迷科研学术的教师,固然也少不了一众还在996的程序猿。事实上,你所处圈子的质量很大程度上就决定了你的人生质量,那么今天咱们就来看看当 Python 遇到了你的微信好友后能擦出怎样的火花。python

完整代码可在公众号:「01二进制」后台回复:「微信好友」获取bash

前言

此次咱们直奔主题,本文要作的是如下几件事:微信

  1. 分析微信好友的总人数、男生数、女生数、男女比
  2. 分析好友的地域分布
  3. 利用 天然语言处理 的方法分析出你好友的情感倾向
  4. 获取微信好友的头像并拼接成指定图片

准备

仍是老样子,作实验前,先作好准备工做,实验环境以下:app

  • Python 3.6 (虚拟环境的管理为Pipenv)echarts

  • Pycharm函数

  • 主要使用到的包有:工具

    • itchat
    • pyecharts
    • baidu-aip
    • photomosaic
    • pillow

对Pipenv这个虚拟环境管理工具不熟悉的能够去看我以前的文章:《Python 管理哪家强?》,里面对于 Pipenv 这个虚拟环境管理工具备一些介绍。优化

itchat是一个开源的微信我的号接口,可让咱们使用python来调用微信人工智能

pyecharts是python+echarts的结合,用于进行数据的可视化spa

baidu-aip是百度推出的一个nlp的包

photomosaic是用来生成蒙太奇马赛克图片的

你们获取到源码以后只须要将 Pipfile 复制到大家的项目根路径下,而后再终端执行 pipenv install 便可建立一个安装好全部包的虚拟环境了(前提是你的电脑上已经安装了pipenv了)

作好准备工做后咱们就开始吧。

开始

1. 初始化 itchat

只需一行代码便可初始化 itchat:

itchat.auto_login(hotReload=True)
复制代码

hotReload(热加载),True表示其短期内不须要再次扫码登录

2. 获取好友列表

一样的也只须要一行代码便可获取:

friends = itchat.get_friends(update=True)[0:]
复制代码

返回的数据是类 JSON 格式的,咱们用 Python能够很方便的解析,由于篇幅缘由,返回的示例我就不展现了,大家本身输出查看就能够了。

3. 分析男女分布状况

首先咱们须要获取好友的性别信息,经过分析返回的 JSON 字符串咱们发现,在好友的信息中有 Sex 标签,其规律是当其值为1是表示男生,2表示女生,0表示没有填写的,于是咱们能够这样

# 对好友数进行分析
def analyze_friends_num(friends):
    # 初始化性别的变量(男、女、其余,其余表示的是注册时没有填写性别信息的)
    male = female = others = 0
    # 循环获得的所有好友
    # 在好友的信息中有Sex标签,发现规律是当其值为1是表示男生,2表示女生,0表示没有填写的
    for i in friends[1:]:
        sex = i['Sex']
        if sex == 1:
            male += 1
        elif sex == 2:
            female += 1
        else:
            others += 1
    # 总人数
    total = len(friends[2:])
    print("总人数为", total, "其中男性", male, "人,女性", female, "人,男女比为", round((male / female), 2), ":1")
复制代码

执行的结果为:

总人数为 387 其中男性 228 人,女性 116 人,男女比为 1.97 :1
复制代码

更加直观的显示以下(可视化的代码在 utiils 包下,这里就不放出了,有须要的本身看源码):

friends_num

个人好友里男女比居然是 2:1(那些没填性别信息的人里面不知道还有多少男生),活该没有女友啊,看来下次要多加一些女生的微信了。

4. 好友地域分布

这里咱们只要获取到好友的地域信息,而后用两个 dict (分别是省和市)保存便可,key 为地域, value 为该地域的好友数,循环遍历 friends 最后用饼图表示分布最多的5个省,用柱状图表示分布最多的15个市,代码以下:

# 分析好友的地域分布
def analyze_friends_location(friends):
    province = {}
    city = {}
    for i in friends[1:]:
        if i['Province'] == '':
            i['Province'] = '其余'
        if i['City'] == '':
            i['City'] = '其余'

        province[i['Province']] = province.get(i['Province'], 0) + 1
        city[i['City']] = city.get(i['City'], 0) + 1
    sorted_province = sorted(province.items(), key=lambda item: item[1], reverse=True)
    sorted_city = sorted(city.items(), key=lambda item: item[1], reverse=True)

    # 画出分布图
    draw_friends_location(sorted_province[0:5], sorted_city[0:15])
复制代码

结果以下:

看到这你们应该也能猜到我主要的活动区域是哪了吧,有兴趣的你们能够猜一猜而后在文末留言哦。

5. 好友情感分析

当你想要了解一我的心态(注意是心态而不是动态)的时候,你每每都会去看他的签名而不是朋友圈,由于签名更改的频率很低,很大程度上会反映这我的的情绪和心态。相比之下,朋友圈更新的频率较高,由于是要分享本身近期的动态的(我就见过有的女生一条朋友圈分红好几条发,每次只发几个字)。所以对好友的签名进行分析是能够分析出她的情绪的,那么咱们该如何分析情感呢?

这里实名夸奖一下百度,做为国内技术的老大哥,好久以前百度就已经免费开放了他的一些人工智能接口,其中就有情感倾向分析,官网是ai.baidu.com/tech/nlp_ap…,这些免费的人工智能接口的开放对于咱们这些我的开发者无疑是个福音。下面是他的功能演示截图:

他的用法也很简单,安装好baidu-aip包以后,申请下appkey、appid和secretkey后便可使用:

client = AipNlp(APP_ID, API_KEY, SECRET_KEY)

def analyze_text(text):
    res = client.sentimentClassify(text.strip())
    return res['items'][0]['sentiment']
复制代码

所以咱们要作的无非就是获取好友的签名,而后传入analyze_text函数便可:

# 分析好友的签名
def analyze_friends_signature(friends):
    positive = 0
    negative = 0
    others = 0

    print('签名情感分析中,请稍后......')
    for index, item in enumerate(friends[1:]):
        text = item['Signature']
        if text != '':
            try:
                print('正在分析第', index, '条签名:', text, '他的做者是:', item['NickName'], '你给他的备注是:', item['RemarkName'])
                res = analyze_text(text)
                if res == 0:
                    negative = negative + 1
                if res == 1:
                    others = others + 1
                if res == 2:
                    positive = positive + 1
            except:
                continue
复制代码

看到这有人会有疑问了,个人好友人数有上千,免费的接口能用这么屡次吗?事实上,他真的能够用这么屡次😂

看到这我忽然想给百度打call,这也太良心了吧。请问贵公司还缺实习生吗,我想去应聘😂。而后咱们来看看个人好友的情绪分析图吧。

friends_signature_emotion

没想到个人好友里面居然还有17.83%的人有消极情绪,看来必要的时候得"we need to talk"了。

6. 利用好友的微信头像生成指定的照片

看标题大家可能不懂是什么意思,直接放图大家就明白了:

这张图远看是一张一我的跳舞的图片,其实仔细看就知道了,构成这张图的是个人 300 多张微信好友的图像,这里我使用到了一个名为photomosaic的库,它是专门用来制做这种蒙太奇马赛克风格的图片的,是我无心中在知乎上看到的,因此你们有事没事仍是逛逛知乎,多少能发现些好玩意。

接下来咱们来看看如何生成上述图片。

第一步,咱们先获取好友的头像:

# 获取好友头像
def get_friends_avatar(friends):
    for index, item in enumerate(friends):
        print("正在下载第 %d 张头像" % index)
        img = itchat.get_head_img(userName=item["UserName"])
        file_image = open(os.getcwd() + "/app/temp/" + item["UserName"] + ".jpg", 'wb')
        file_image.write(img)
        file_image.close()
复制代码

也很简单,直接调用itchat的get_head_img方法而后保存到本地指定文件夹下便可。

第二步,利用photomosaic生成目标图片

# 利用好友头像生成蒙太奇马赛克图片
def draw_friends_mosaic_image():
    # 读取基准图,即要生成的蒙太奇马赛克图片的原始图
    image = pm.imread(os.getcwd() + '/assets/cxk.jpg')
    # 定义图片库
    pool = pm.make_pool(os.getcwd() + '/temp/*.jpg')
    # 制做50*50的拼图马赛克,(50, 50)是指每一行和每一列使用图片库中的图像的个数
    mosaic = pm.basic_mosaic(image, pool, (50, 50))
    # 保存制做好的图片
    pm.imsave(os.getcwd() + '/output/friends_mosaic_image.jpg', mosaic)
复制代码

四行代码便可,原理的话知乎上有写,有兴趣的能够本身去搜一搜。

固然了,不是每一个人的微信好友都有上千人,因此拼接出来的效果就不是很好,好比我本身的那个就不是很好,既然这样的话我就推荐另外一个拼接头像的方法,不过效果要稍微差点,拼成的图长这样:

friends_avators

这里的代码来自我关注的一个公众号,就不放出代码了,大伙感兴趣的能够去看下他的文章:《一键拼出你的微信好友图片墙》

这张图虽然观赏效果不如上一张,但好在每一个头像都很清楚,大伙儿看看能不能快速找到本身的头像呢?欢迎在留言区评论互动哦~

最后

完整代码可在公众号:「01二进制」后台回复:「微信好友」获取

方法教给你们了,图片素材能够优化,你们能够生成本身喜欢的蒙太奇图片,发到朋友圈,让代码骚动起来吧!

写到这,我想说的是,你朋友的质量决定你生命的质量,想成为一个高层次的人,那就请跟优秀的朋友为舞👇

相关文章
相关标签/搜索