最近留意到Python語(yǔ)言中有一個(gè)非常好玩的庫(kù):itchat,基于web 微信的開(kāi)放api做成的集成庫(kù),它:
是一個(gè)開(kāi)源的微信個(gè)人號(hào)接口,使用python調(diào)用微信從未如此簡(jiǎn)單。使用不到三十行的代碼,你就可以完成一個(gè)能夠處理所有信息的微信機(jī)器人。當(dāng)然,該api的使用遠(yuǎn)不止一個(gè)機(jī)器人,更多的功能等著你來(lái)發(fā)現(xiàn),比如實(shí)現(xiàn)微信自動(dòng)回復(fù),個(gè)人微信社交網(wǎng)絡(luò)屬性的數(shù)據(jù)分析。該接口與公眾號(hào)接口itchatmp共享類似的操作方式,學(xué)習(xí)一次掌握兩個(gè)工具。
目前此接口開(kāi)源于GitHub,傳送門(mén)在此。
本文簡(jiǎn)單的介紹了基于itchat,運(yùn)行一個(gè)簡(jiǎn)單的爬蟲(chóng)程序,來(lái)對(duì)我個(gè)人的朋友圈進(jìn)行地毯式偷窺,并試圖從我的朋友圈中挖出幾個(gè)變態(tài)。
環(huán)境
本實(shí)驗(yàn)基于Python3.5,IDE工具PyCharm,并依賴以下庫(kù):
- itchat,一套開(kāi)源的微信號(hào)接口;
- jieba, 分詞工具,用于將抓取到的個(gè)人簽名分詞,方便做高頻詞統(tǒng)計(jì);
- wordcloud,詞云工具,可以將高頻詞做成詞云圖形;
- numpy,數(shù)據(jù)圖表快速生成工具
以上庫(kù)均可以通過(guò)pip方式快速安裝,如:
pip install itchat
代碼
首先先把核心代碼放上來(lái):
#導(dǎo)入itchat包
import itchat
#獲取個(gè)人微信號(hào)好友信息
if __name__=="__main__":
#登錄個(gè)人微信,掃碼登錄
itchat.login()
#爬取自己好友相關(guān)信息
friends=itchat.get_friends(update=False)[0:]
#設(shè)置需要爬取的信息字段
result=[('RemarkName','備注'),('NickName','微信昵稱'),('Sex','性別'),('City','城市'),('Province','省份'),('ContactFlag','聯(lián)系標(biāo)識(shí)'),('UserName','用戶名'),('SnsFlag','渠道標(biāo)識(shí)'),('Signature','個(gè)性簽名')]
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("完成")
以上是本次實(shí)驗(yàn)的核心模塊,其作用是把個(gè)人微信號(hào)中的所有好友的昵稱、備注、個(gè)性簽名、性別、城市等等抓取下來(lái),并存成txt文件。
在程序運(yùn)行過(guò)程中,會(huì)彈出一個(gè)二維碼,需要掃碼登錄你的微信號(hào),然后就會(huì)開(kāi)始爬去這個(gè)號(hào)的朋友圈;
在此基礎(chǔ)上我們可以對(duì)這些數(shù)據(jù)動(dòng)刀子了:
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()
# 保存圖片 并發(fā)送到手機(jī)
my_wordcloud.to_file(os.path.join(d, "wechat_cloud.png"))
itchat.send_image("wechat_cloud.png", 'filehelper')
出來(lái)的效果圖如下:

嗯。。??吹轿业奈⑿藕糜讯歼@么正能量我就放心了····
其實(shí)基于這個(gè)接口我們可以統(tǒng)計(jì)到更多的數(shù)據(jù),比如統(tǒng)計(jì)一下我微信里面的男女比例:
import itchat
itchat.login()
friends = itchat.get_friends(update=True)[0:]
# 初始化計(jì)數(shù)器,有男有女
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))
最終打印出來(lái)的結(jié)果是:
男:45.23%
女:51.12%
其他:3.65%
我也不知道為什么我的微信里面妹子比較多···
但是我知道里面其實(shí)有很多大雕萌妹就對(duì)了····
更多玩法
我們可以設(shè)一些自動(dòng)回復(fù):
import itchat
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
message = msg['Text']
replay = u'Sir, 對(duì)方暫時(shí)無(wú)法進(jìn)行交流'
if u'在干嘛' in message:
replay = u'sorry,你所聯(lián)系的人正在思考人生不方便回你信息'
elif u'生氣' in message:
replay = u'忙完給你買好吃的吶(づ ̄3 ̄)づ'
elif u'好吧' in message:
replay = u'乖~'
return replay
#以上是一些例子,可以依樣多弄幾個(gè)判斷條件來(lái)實(shí)現(xiàn)更多很黃很暴力的聊天內(nèi)容
itchat.auto_login()
itchat.run()
還可以看看我的好友都來(lái)自哪里:
#這里省略了掃碼登錄和將抓取到的數(shù)據(jù)存到本地文件的代碼,如果忘記了,
可以查看上方代碼示例
Province = df_friends.Province
Province_count = Province.value_counts()
Province_count = Province_count[Province_count.index!='']
#有一些好友地理信息為空,過(guò)濾掉這一部分人。
統(tǒng)計(jì)結(jié)果完成后,我發(fā)現(xiàn)我的好友大多來(lái)自廣東(廢話,我是廣東人),上海和北京(我是用工作微信號(hào)做測(cè)試的,估計(jì)這部分好友都是客戶爸爸2333)
然后來(lái)看看,我那些來(lái)自廣東的好友們,都是哪個(gè)城市比較多:
City = df_friends.City #[(df_friends.Province=='廣東')]
City_count = City.value_counts()
pinrt '主要來(lái)自這些城市:%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]))']
最終打印出來(lái)的結(jié)果顯示,廣東的好友們最多來(lái)自于:
- 廣州:工作號(hào)加了一大堆廣州的同事,很合理;
- 云?。豪霞?,很正常;
- 深圳:加了一堆深圳分部的同事,以及一些大學(xué)的同學(xué)?
- 佛山:??????
- 湛江:·····不想說(shuō)話