用python實現微信聊天
準備工作
安裝非常簡單,從官方源下載安裝
pip install -U wxpy
或者從豆瓣源安裝
pip install -U wxpy -i "https://pypi.doubanio.com/simple/"
模塊初探
安裝完成後,我們來試下幾個基本的功能
1. 掃碼登錄微信
from wxpy import *
bot = Bot()
運行上面的程序,會彈出二維碼,用手機微信掃一掃即可實現登錄。
但上面的程序有一個缺點,每次運行都要掃二維碼。不過wxpy非常貼心地提供了緩存的選項,如下
bot = Bot(cache_path=True)
這樣把登錄信息保存下來,就不用每次都掃二維碼了。
2. 發送消息
bot.file_helper.send("hello")
這裡的file_helper就是微信的文件傳輸助手,我們給文件傳輸助手發送一條消息,可以在手機端收到如下的消息
3. 接受消息
我們實現一個收到消息自動回覆的功能。
@bot.register()
def print_message(msg):
print(msg.text)
return msg.text
# 進入Python命令行,讓程序保持運行
embed()
打開自己的公眾號管理平臺,在後端向自己發送消息,就可以收到如下的消息回覆
4. 搜索好友及微信群
我們來實現一個搜索公司群、定位老闆並轉發老闆消息的功能
from wxpy import *
bot = Bot(cache_path=True)
# 定位公司群
company_group = bot.groups().search('公司微信群')[0]
# 定位老闆
boss = company_group.search('老闆大名')[0]
# 將老闆的消息轉發到文件傳輸助手
@bot.register(company_group)
def forward_boss_message(msg):
if msg.member == boss:
msg.forward(bot.file_helper, prefix='老闆發言')
# 堵塞線程
embed()
對於老闆喜歡在群裡面喊話的同學來說,這是一個福音,以後再也不用擔心錯失老闆的重要信息了~~
數據統計
wxpy的好友統計功能非常好用,可以很方便地統計好友的地理位置分佈和性別分佈。
下面的代碼中,統計了下自己的好友的分佈情況,並打印出人數最多的10個地區。
from wxpy import *
bot = Bot(cache_path=True)
friends_stat = bot.friends().stats()
friend_loc = [] # 每一個元素是一個二元列表,分別存儲地區和人數信息
for province, count in friends_stat["province"].iteritems():
if province != "":
friend_loc.append([province, count])
# 對人數倒序排序
friend_loc.sort(key=lambda x: x[1], reverse=True)
# 打印人數最多的10個地區
for item in friend_loc[:10]:
print item[0], item[1]
統計出來的地區分佈數據畫成圖表如下
大多數的好友也來自上海,上面的圖表也如實地反應了這一情況。
統計性別分佈的代碼如下
for sex, count in friends_stat["sex"].iteritems():
# 1代表MALE, 2代表FEMALE
if sex == 1:
print "MALE %d" % count
elif sex == 2:
print "FEMALE %d" % count
把性別分佈的數據生成圖表如下
可以看到好友中男性佔了大多數。男性朋友多多,老婆放心多多,嗯~~
聊天機器人
有了上面功能簡介部分的基礎,我們來實現一個聊天機器人。
聊天機器人基於圖靈機器人。圖靈機器人可以在圖靈機器人-中文語境下智能度最高的機器人大腦註冊賬號,並創建機器人。需記下api key,調用圖靈API的時候會用到。
# -*- coding: utf-8 -*-
import json
import requests
from wxpy import *
# 調用圖靈機器人API,發送消息並獲得機器人的回覆
def auto_reply(text):
url = "http://www.tuling123.com/openapi/api"
api_key = "你的api key"
payload = {
"key": api_key,
"info": text,
"userid": "123456"
}
r = requests.post(url, data=json.dumps(payload))
result = json.loads(r.content)
return "[tuling] " + result["text"]
bot = Bot(console_qr=True, cache_path=True)
@bot.register(mp)
def forward_message(msg):
return auto_reply(msg.text)
embed()
運行上面的程序,發送消息給自己,可以看到如下的對話
機器人太逗了,上來就要紅包,還把我當男朋友了~
Python實現的微信好友數據分析
數據分析
分析微信好友數據的前提是獲得好友信息,通過使用 itchat 這個模塊,這一切會變得非常簡單,我們通過下面兩行代碼就可以實現:
itchat.auto_login(hotReload = True)
friends = itchat.get_friends(update = True)
同平時登錄網頁版微信一樣,我們使用手機掃描二維碼就可以登錄,這裡返回的friends對象是一個集合,第一個元素是當前用戶。所以,在下面的數據分析流程中,我們始終取friends[1:]作為原始輸入數據,集合中的每一個元素都是一個字典結構,以我本人為例,可以注意到這裡有Sex、City、Province、HeadImgUrl、Signature這四個字段,我們下面的分析就從這四個字段入手:
好友性別
分析好友性別,我們首先要獲得所有好友的性別信息,這裡我們將每一個好友信息的Sex字段提取出來,然後分別統計出Male、Female和Unkonw的數目,我們將這三個數值組裝到一個列表中,即可使用matplotlib模塊繪製出餅圖來,其代碼實現如下:
def analyseSex(firends):
sexs = list(map(lambda x:x['Sex'],friends[1:]))
counts = list(map(lambda x:x[1],Counter(sexs).items()))
labels = ['Unknow','Male','Female']
colors = ['red','yellowgreen','lightskyblue']
plt.figure(figsize=(8,5), dpi=80)
plt.axes(aspect=1)
plt.pie(counts, #性別統計結果
labels=labels, #性別展示標籤
colors=colors, #餅圖區域配色
labeldistance = 1.1, #標籤距離圓點距離
autopct = '%3.1f%%', #餅圖區域文本格式
shadow = False, #餅圖是否顯示陰影
startangle = 90, #餅圖起始角度
pctdistance = 0.6 #餅圖區域文本距離圓點距離
)
plt.legend(loc='upper right',)
plt.title(u'%s的微信好友性別組成' % friends[0]['NickName'])
plt.show()
這裡簡單解釋下這段代碼,微信中性別字段的取值有Unkonw、Male和Female三種,其對應的數值分別為0、1、2。通過Collection模塊中的Counter()對這三種不同的取值進行統計,其items()方法返回的是一個元組的集合,該元組的第一維元素表示鍵,即0、1、2,該元組的第二維元素表示數目,且該元組的集合是排序過的,即其鍵按照0、1、2 的順序排列,所以通過map()方法就可以得到這三種不同取值的數目,我們將其傳遞給matplotlib繪製即可,這三種不同取值各自所佔的百分比由matplotlib計算得出。下圖是matplotlib繪製的好友性別分佈圖:
看到這個結果,我一點都不覺得意外,男女比例嚴重失衡,這雖然可以解釋我單身的原因,可我不覺得通過調整男女比例就能解決問題,好多人認為自己單身是因為社交圈子狹小,那麼是不是擴展了社交圈子就能擺脫單身呢?我覺得或許這樣會增加脫單的概率,可幸運之神應該不會眷顧我,因為我的好運氣早在我24歲以前就消耗完啦。在知乎上有一個熱門的話題:現在的男性是否普遍不再對女性展開追求了?,其實哪裡會有人喜歡孤獨呢?無非是怕一次又一次的失望罷了。有的人並不是我的花兒,我只是恰好途徑了她的綻放。曾經有人說我是一個多情的人,可她永遠不會知道,我做出的每一個決定都熾熱而悲壯。所謂”慧極必傷,情深不壽;謙謙君子,溫潤如玉”,世人苦五毒者大抵如此。
用python實現在微信群刷屏
第一步:安裝itchat:
在Python/Lib/site-packages文件夾下增加了sitecustomize.py,
裡邊代碼如下:
try:
reload # Python 2.7
except NameError:
try:
from importlib import reload # Python 3.4+
except ImportError:
from imp import reload # Python 3.0 - 3.3
安裝完成後是這樣的:
第二步:實現發送消息到群
具體代碼如下:
在發送信息前,先登錄微信,
itchat.auto_login(hotReload=True)
這是表示熱登錄,在一定時間內不需要重新登錄
rooms=itchat.get_chatrooms(update=True) #拿到所有微信群
rooms=itchat.search_chatrooms(gname) #搜索指定微信群(模糊搜索)
這兩行代碼,第一個是拿到所有的微信群,第二個是拿到指定的微信群。
在獲取微信群的信息後我們就需要向微信群發送信息了,用到的方法如下:
itchat.send(msg,toUserName),msg指的是發送的內容,toUserName指的是發送的對象(若不指定默認發送給自己)
好,在這裡代碼也就寫完了,我放在了send_onegroup方法,指的是發送一個群,若想發送所有群,去掉rooms=itchat.search_chatrooms(grame).
運行效果如下:
python 獲取微信好友列表
最後
前幾天有私信小編要Python的學習資料,小編整理了一些有深度的Python教程和參考資料,從入門到高級的都有,文件已經打包好了,正在學習Python的同學可以下載學習學習。文件下載方式:點擊小編頭像,關注後私信回覆“資料”即可下載。首先把代碼擼起來!首先把代碼擼起來!首先把代碼擼起來!重要的事說三遍,哈哈。“編程是門手藝活”。什麼意思?得練啊。