最近留意到Python語言中有一個非常好玩的庫:itchat,基于web 微信的開放api做成的集成庫图甜,它:
是一個開源的微信個人號接口碍粥,使用python調(diào)用微信從未如此簡單。使用不到三十行的代碼黑毅,你就可以完成一個能夠處理所有信息的微信機器人即纲。當(dāng)然,該api的使用遠不止一個機器人辫秧,更多的功能等著你來發(fā)現(xiàn)幽钢,比如實現(xiàn)微信自動回復(fù),個人微信社交網(wǎng)絡(luò)屬性的數(shù)據(jù)分析。該接口與公眾號接口itchatmp共享類似的操作方式搀继,學(xué)習(xí)一次掌握兩個工具。
目前此接口開源于GitHub笆呆,傳送門在此衷戈。
本文簡單的介紹了基于itchat,運行一個簡單的爬蟲程序,來對我個人的朋友圈進行地毯式偷窺衬衬,并試圖從我的朋友圈中挖出幾個變態(tài)买猖。
環(huán)境
本實驗基于Python3.5,IDE工具PyCharm滋尉,并依賴以下庫:
- itchat玉控,一套開源的微信號接口;
- jieba狮惜, 分詞工具高诺,用于將抓取到的個人簽名分詞,方便做高頻詞統(tǒng)計碾篡;
- wordcloud虱而,詞云工具,可以將高頻詞做成詞云圖形开泽;
- numpy牡拇,數(shù)據(jù)圖表快速生成工具
以上庫均可以通過pip方式快速安裝,如:
pip install itchat
代碼
首先先把核心代碼放上來:
#導(dǎo)入itchat包
import itchat
#獲取個人微信號好友信息
if __name__=="__main__":
#登錄個人微信穆律,掃碼登錄
itchat.login()
#爬取自己好友相關(guān)信息
friends=itchat.get_friends(update=False)[0:]
#設(shè)置需要爬取的信息字段
result=[('RemarkName','備注'),('NickName','微信昵稱'),('Sex','性別'),('City','城市'),('Province','省份'),('ContactFlag','聯(lián)系標(biāo)識'),('UserName','用戶名'),('SnsFlag','渠道標(biāo)識'),('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文件滩租。
在程序運行過程中,會彈出一個二維碼利朵,需要掃碼登錄你的微信號律想,然后就會開始爬去這個號的朋友圈;
在此基礎(chǔ)上我們可以對這些數(shù)據(jù)動刀子了:
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ā)送到手機
my_wordcloud.to_file(os.path.join(d, "wechat_cloud.png"))
itchat.send_image("wechat_cloud.png", 'filehelper')
出來的效果圖如下:
嗯绍弟。技即。≌燎玻看到我的微信好友都這么正能量我就放心了····
其實基于這個接口我們可以統(tǒng)計到更多的數(shù)據(jù)而叼,比如統(tǒng)計一下我微信里面的男女比例:
import itchat
itchat.login()
friends = itchat.get_friends(update=True)[0:]
# 初始化計數(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))
最終打印出來的結(jié)果是:
男:45.23%
女:51.12%
其他:3.65%
我也不知道為什么我的微信里面妹子比較多···
但是我知道里面其實有很多大雕萌妹就對了····
更多玩法
我們可以設(shè)一些自動回復(fù):
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豹悬,你所聯(lián)系的人正在思考人生不方便回你信息'
elif u'生氣' in message:
replay = u'忙完給你買好吃的吶(づ ̄3 ̄)づ'
elif u'好吧' in message:
replay = u'乖~'
return replay
#以上是一些例子葵陵,可以依樣多弄幾個判斷條件來實現(xiàn)更多很黃很暴力的聊天內(nèi)容
itchat.auto_login()
itchat.run()
還可以看看我的好友都來自哪里:
#這里省略了掃碼登錄和將抓取到的數(shù)據(jù)存到本地文件的代碼,如果忘記了瞻佛,
可以查看上方代碼示例
Province = df_friends.Province
Province_count = Province.value_counts()
Province_count = Province_count[Province_count.index!='']
#有一些好友地理信息為空脱篙,過濾掉這一部分人。
統(tǒng)計結(jié)果完成后,我發(fā)現(xiàn)我的好友大多來自廣東(廢話绊困,我是廣東人)文搂,上海和北京(我是用工作微信號做測試的,估計這部分好友都是客戶爸爸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]))']
最終打印出來的結(jié)果顯示吧彪,廣東的好友們最多來自于:
- 廣州:工作號加了一大堆廣州的同事,很合理丢早;
- 云敢搪恪:老家,很正常怨酝;
- 深圳:加了一堆深圳分部的同事傀缩,以及一些大學(xué)的同學(xué)?
- 佛山:农猬?赡艰??斤葱?慷垮??
- 湛江:·····不想說話