最近留意到Python语言中有一个非常好玩的库:itchat,基于web 微信的开放api做成的集成库,它:
是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如实现微信自动回复,个人微信社交网络属性的数据分析。该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。
目前此接口开源于GitHub,传送门在此。
本文简单的介绍了基于itchat,运行一个简单的爬虫程序,来对我个人的朋友圈进行地毯式偷窥,并试图从我的朋友圈中挖出几个变态。
环境
本实验基于Python3.5,IDE工具PyCharm,并依赖以下库:
- itchat,一套开源的微信号接口;
- jieba, 分词工具,用于将抓取到的个人签名分词,方便做高频词统计;
- wordcloud,词云工具,可以将高频词做成词云图形;
- numpy,数据图表快速生成工具
以上库均可以通过pip方式快速安装,如:
pip install itchat
代码
首先先把核心代码放上来:
#导入itchat包
import itchat
#获取个人微信号好友信息
if __name__=="__main__":
#登录个人微信,扫码登录
itchat.login()
#爬取自己好友相关信息
friends=itchat.get_friends(update=False)[0:]
#设置需要爬取的信息字段
result=[('RemarkName','备注'),('NickName','微信昵称'),('Sex','性别'),('City','城市'),('Province','省份'),('ContactFlag','联系标识'),('UserName','用户名'),('SnsFlag','渠道标识'),('Signature','个性签名')]
for user in friends:
with open('myFriends.txt','a',encoding='utf8') as fh:
fh.write("-----------------------\n")
for r in result:
with open('myFriends.txt','a',encoding='utf8') as fh:
fh.write(r[1]+":"+str(user.get(r[0]))+"\n")
print("完成")
以上是本次实验的核心模块,其作用是把个人微信号中的所有好友的昵称、备注、个性签名、性别、城市等等抓取下来,并存成txt文件。
在程序运行过程中,会弹出一个二维码,需要扫码登录你的微信号,然后就会开始爬去这个号的朋友圈;
在此基础上我们可以对这些数据动刀子了:
import jieba
wordlist_jieba = jieba.cut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
# wordcloud词云
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import os
import numpy as np
import PIL.Image as Image
d= os.path.dirname(__file__)
alice_coloring = np.array(Image.open(os.path.join(d, "wechat.jpg")))
my_wordcloud = WordCloud(background_color="white", max_words=2000,mask=alice_coloring,max_font_size=40, random_state=42,font_path='/Users/sebastian/Library/Fonts/Arial Unicode.ttf').generate(wl_space_split)
image_colors = ImageColorGenerator(alice_coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
# 保存图片 并发送到手机
my_wordcloud.to_file(os.path.join(d, "wechat_cloud.png"))
itchat.send_image("wechat_cloud.png", 'filehelper')
出来的效果图如下:
嗯。。。看到我的微信好友都这么正能量我就放心了····
其实基于这个接口我们可以统计到更多的数据,比如统计一下我微信里面的男女比例:
import itchat
itchat.login()
friends = itchat.get_friends(update=True)[0:]
# 初始化计数器,有男有女
male = female = other = 0
for i in friends[1:]:
sex = i["Sex"]
if sex == 1:
male += 1
elif sex == 2:
female += 1
else:
other += 1
total = len(friends[1:])
print (u"男:%.2f%%" % (float(male) / total * 100))
print (u"女:%.2f%%" % (float(female) / total * 100))
print (u"其他:%.2f%%" % (float(other) / total * 100))
最终打印出来的结果是:
男:45.23%
女:51.12%
其他:3.65%
我也不知道为什么我的微信里面妹子比较多···
但是我知道里面其实有很多大雕萌妹就对了····
更多玩法
我们可以设一些自动回复:
import itchat
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
message = msg['Text']
replay = u'Sir, 对方暂时无法进行交流'
if u'在干嘛' in message:
replay = u'sorry,你所联系的人正在思考人生不方便回你信息'
elif u'生气' in message:
replay = u'忙完给你买好吃的呐(づ ̄3 ̄)づ'
elif u'好吧' in message:
replay = u'乖~'
return replay
#以上是一些例子,可以依样多弄几个判断条件来实现更多很黄很暴力的聊天内容
itchat.auto_login()
itchat.run()
还可以看看我的好友都来自哪里:
#这里省略了扫码登录和将抓取到的数据存到本地文件的代码,如果忘记了,
可以查看上方代码示例
Province = df_friends.Province
Province_count = Province.value_counts()
Province_count = Province_count[Province_count.index!='']
#有一些好友地理信息为空,过滤掉这一部分人。
统计结果完成后,我发现我的好友大多来自广东(废话,我是广东人),上海和北京(我是用工作微信号做测试的,估计这部分好友都是客户爸爸2333)
然后来看看,我那些来自广东的好友们,都是哪个城市比较多:
City = df_friends.City #[(df_friends.Province=='广东')]
City_count = City.value_counts()
pinrt '主要来自这些城市:%s(%d)、%s(%d)、%s(%d)、%s(%d)、%s(%d)和%s(%d)。'[(City_count[0],City_count.index[1],City_count[1],City_count.index[2],City_count[2],City_count.index[3],City_count[3],City_count.index[4],City_count[4],City_count.index[5],City_count[5]))']
最终打印出来的结果显示,广东的好友们最多来自于:
- 广州:工作号加了一大堆广州的同事,很合理;
- 云浮:老家,很正常;
- 深圳:加了一堆深圳分部的同事,以及一些大学的同学?
- 佛山:??????
- 湛江:·····不想说话