歡迎大家訪問我的個人網站《劉江的博客和教程》:www.liujiangblog.com
主要分享Python 及Django教程以及相關的博客
今天偶然看見http://www.cnblogs.com/jiaoyu121/p/6944398.html#top博客,用Python玩轉微信,寫得非常好。
然而,貌似用的Python2版本,並且每次執行都要重復掃碼登錄,這對於我這種Python3的用戶是不行的。
動起手來,自己干!
1. 安裝相應的庫
pip install itchat
pip install echarts-python
2. 實現登陸狀態保存:
import itchat
itchat.auto_login(hotReload=True)
itchat.dump_login_status()
這樣你就可以保持一段時間登錄狀態,而不用每次運行代碼都要掃碼登錄了!
首次登錄,程序會彈出一個二維碼圖片窗口,用微信手機客戶端掃碼就可以登錄了!
3. 使用餅圖展示個人好友性別分布
有一個echarts-python庫可以幫助你方便的使用python代碼在瀏覽器中展示百度Echart圖。但是,但是,這個庫是Python2的,
Python3用起來水土不服,沒辦法只好根據錯誤修改庫的源碼!下圖顯示了應該改的兩個地方(其實還有很多地方)。
改完庫的源碼,就可以執行代碼了。借用前人的代碼,修改了一下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import itchat
itchat.auto_login(hotReload=True)
itchat.dump_login_status()
friends = itchat.get_friends(update=True)[:]
total = len(friends) - 1
male = female = other = 0
for friend in friends[1:]:
sex = friend["Sex"]
if sex == 1:
male += 1
elif sex == 2:
female += 1
else:
other += 1
# print("男性好友:%.2f%%" % (float(male) / total * 100))
# print("女性好友:%.2f%%" % (float(female) / total * 100))
# print("其他:%.2f%%" % (float(other) / total * 100))
from echarts import Echart, Legend, Pie
chart = Echart('%s的微信好友性別比例' % (friends[0]['NickName']), 'from WeChat')
chart.use(Pie('WeChat',
[{'value': male, 'name': '男性 %.2f%%' % (float(male) / total * 100)},
{'value': female, 'name': '女性 %.2f%%' % (float(female) / total * 100)},
{'value': other, 'name': '其他 %.2f%%' % (float(other) / total * 100)}],
radius=["50%", "70%"]))
chart.use(Legend(["male", "female", "other"]))
del chart.json["xAxis"]
del chart.json["yAxis"]
chart.plot()
運行代碼,測試一下,成功在瀏覽器展示出來了:
我好想暴露了什么....
4. 好友個性簽名詞雲
分析好友信息,能發現個性簽名,可以用它做詞雲。
for friend in friends:
signature = friend["Signature"].strip()
signature = re.sub("<span.*>", "", signature)
signature_list.append(signature)
raw_signature_string = ''.join(signature_list)
上面利用正則,去掉一些類似<span class=....>
以及空格之類的無用字符。然后把他們連成一個大的長的字符串
pip install jieba
這個庫是用來將字符串拆分成不重復的一個一個的詞的,貌似都是2字詞。
pip install wordcloud
安裝詞雲庫,會彈出錯誤如下圖
怎么辦?去http://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 頁面下載所需的wordcloud模塊的whl文件
下載后進執行“pip install wordcloud-1.3.1-cp36-cp36m-win_amd64.whl”,就可以了。意文件路徑。
利用jieba的cut方法將字符串裁成一個一個的詞,然后用空格,將它們又連起來。注意是用空格哦!千萬別看錯了!
text = jieba.cut(raw_signature_string, cut_all=True)
target_signatur_string = ' '.join(text)
再導入一些輔助的庫
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import PIL.Image as Image
import os
import numpy as np
這些庫,有的會自動安裝,有的可能要你自己裝,比如pip install numpy
然后提供一張圖片。
wordcloud會根據這張圖片在x和y軸上的顏色以及范圍等等,布置詞雲。這個過程是通過numpy的矩陣和matplot的畫圖能力實現的。
下面的源碼是根據原文的代碼略微修改后的。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import itchat
import re
import jieba
def echart_pie(friends):
total = len(friends) - 1
male = female = other = 0
for friend in friends[1:]:
sex = friend["Sex"]
if sex == 1:
male += 1
elif sex == 2:
female += 1
else:
other += 1
from echarts import Echart, Legend, Pie
chart = Echart('%s的微信好友性別比例' % (friends[0]['Name']), 'from WeChat')
chart.use(Pie('WeChat',
[{'value': male, 'name': '男性 %.2f%%' % (float(male) / total * 100)},
{'value': female, 'name': '女性 %.2f%%' % (float(female) / total * 100)},
{'value': other, 'name': '其他 %.2f%%' % (float(other) / total * 100)}],
radius=["50%", "70%"]))
chart.use(Legend(["male", "female", "other"]))
del chart.json["xAxis"]
del chart.json["yAxis"]
chart.plot()
def word_cloud(friends):
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import PIL.Image as Image
import os
import numpy as np
d = os.path.dirname(__file__)
my_coloring = np.array(Image.open(os.path.join(d, "2.png")))
signature_list = []
for friend in friends:
signature = friend["Signature"].strip()
signature = re.sub("<span.*>", "", signature)
signature_list.append(signature)
raw_signature_string = ''.join(signature_list)
text = jieba.cut(raw_signature_string, cut_all=True)
target_signatur_string = ' '.join(text)
my_wordcloud = WordCloud(background_color="white", max_words=2000, mask=my_coloring,
max_font_size=40, random_state=42,
font_path=r"C:\Windows\Fonts\simhei.ttf").generate(target_signatur_string)
image_colors = ImageColorGenerator(my_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')
itchat.auto_login(hotReload=True)
itchat.dump_login_status()
friends = itchat.get_friends(update=True)[:]
# echart_pie(friends)
word_cloud(friends)
運行后的效果是這樣的:
windows下的顯示效果真不怎么樣!