用Python做个微信自动回复机器人
微信已經成為我們生活不可或缺的一部分,每天有380億條消息從微信上發出,其中6億條是語音消息,有350萬個活躍的公眾賬號,并存在著8億活躍粉絲。微信是一個龐大的生態群體。
今天我們來玩轉一下微信,微信有關的第三方框架很多,比如wxpy,wxBot等。今天要使用的是其中著名的itchat Python模塊來做兩件有趣的事情。
?
一個自動回復的機器人
微信自上線以來,一直沒有自動回復的功能,想必是有他們的理念。但是有些人群,確實對此功能有一定需求,我舉兩個栗子:
-
不愿時刻被消息打擾的人
-
消息需要批量處理的人們(比如微商)
功能列表:
-
收到消息立即自動回復
-
收到消息延遲指定時間回復
-
對不同好友定制不同的回復內容
-
在手機端隨時進行控制
1.啟用itchat模塊
itchat的原理是通過掃碼進行遠程微信網頁端的登錄,然后通過在移動端進行操作,網頁端進行響應,來實現一些功能,雖然似乎繞了個彎子,但是在微信的限制下,這似乎已經是一種最佳的方式了。
首先我們需要考慮別的問題是:程序如何在微信端接收到你的指令。此時出現了一個非常重要的角色:文件管理器。(當網頁端微信登陸后,消息列表會出現)此時,文件管理器充當了移動端和web端的橋梁。
我們可以先通過設定幾個全局變量來做作為功能的開關和保存數據的容器。
然后通過判斷web端在”文件管理器“中接收到的字符串指令來進行不同操作,假如此時我們收到了朋友的消息,需要程序給出自動回復。
?
收到朋友消息即時進行自動回復是很簡單的,但是如何去做延時發送回復消息呢?我先談一談我的想法,拋磚引玉:
?
-
一般發送消息需要用到隊列,進行入隊和出隊,我在這里設置了一個字典來保存消息發送者的數據。
-
鍵為消息發送者的昵稱,值是一個長度為2的數組,分別保存消息發送者的微信id和接收消息時的時間戳。
-
這樣我將每條發送過來的朋友信息保存在這個字典中,再通過將設定延遲時間同消息時間戳求和與當前時間戳進行對比,若當前時間戳較大,那么執行發送消息的操作。
-
此時再開啟一個線程作為定時任務,定時去檢測字典中每條數據是否到達了發送的臨界要求(當前時間戳>=消息時間戳+設定的延遲時間)。
-
Python中有個專門做定時任務的模塊叫sched,但是我嘗試了一下,sched會阻塞當前主線程,也會阻塞itchat的線程,所以并不合適。
-
這里我還是采用了threading的Timer來充當定時器,不過要注意使用遞歸,否則將會出現運行一次就結束的情況。
?
到此為止,主要的功能已經實現了,我用一個測試賬號對我的微信進行了各種測試,看一下以下截圖:
?
?
?
2.增強功能
這時功能基本已經完成了,這就結束了嗎?別著急,再想想有沒有需要完善一下的地方?用過微信web端的同學應該知道,當web端長期處于未操作的狀態下會失去連接。
?
在我們這個情況下,假如你長時間未收到微信消息,后臺程序將會與微信失去連接,再次開啟需要登上服務器重啟程序,這顯然非常麻煩。有沒有什么簡單的解決辦法呢?
?
我想到一些應用的后臺通常會做一道心跳檢測機制,那我就模仿這個思路,定時給我的”文件管理器“發一個字符串,來保持連接。
?
def?keep_alive():text="保持登錄"itchat.send(text, toUserName="filehelper")global?timer2timer2 = threading.Timer(60*60,keep_alive)timer2.start()?
最后,我們需要將這個程序發布在服務器上,讓它全天候為我的微信服務。
?
這里需要注意,如果僅用python xxxx.py來運行的話,關閉shell會導致進程結束,所以我們需要使用nohup python xxxx.py &來全方位守護進程,這里啰嗦一句,nohup和&的功能是不一樣的,很多人容易混淆,感興趣的話可以去查下資料區分一下。
?
??? 簡單分析微信好友信息
?
上文提到,既然我們能通過itchat來獲取好友的信息,那讓我們看看都有哪些好玩的信息。這是以json形式返回的我的信息,同理我的好友的這些公開信息我也能獲取到。
?
?
我們就來進行一些簡單的的數據抓取,清洗與呈現。我看中的字段是:Sex、City、Province、Signature。我想做的是通過圖表來直觀地展示我微信好友中的性別比例,家鄉分布(當然不一定準確,很多人都是胡亂設置的),我的江蘇朋友的市級分布,以及好友個性簽名的詞云。
?
這部分內容主要是需要熟悉諸如pyecharts、jieba、wordcloud模塊的API調取,難度不大,但需要細心調試。我這里就不詳細贅述了。
?
1).性別比例
?
用餅圖可視化一下:
?
?
2).好友省級分布
def?get_data(type):result=[]my_friends = itchat.get_friends(update=True)[0:]for?item?in?my_friends:result.append(item[type])return?resultdef?friends_province():# 獲取好友省份province= get_data("Province")# 分類province_distribution = {}for?item?in?province:#刪除英文省份,因為中國地圖表中沒有if?bool(re.search('[a-z]',item)):continueelif?not?province_distribution.__contains__(item):province_distribution[item] =?1else:province_distribution[item] +=?1#將省份名為空的刪除province_distribution.pop('')#提取地圖接口需要的數據格式province_keys=province_distribution.keys()province_values=province_distribution.values()return?province_keys,province_valuesif?__name__ ==?'__main__':itchat.auto_login(True)微信好友省份分布attr,value=friends_province()map = Map("我的微信好友分布",?"@寒食君",width=1200, height=600)map.add("", attr, value, maptype='china', is_visualmap=True,visual_text_color='#000')map.render()?
用地圖來顯示一下:
?
3).個性簽名詞云
def?friends_signature():signature = get_data("Signature")wash_signature=[]for?item?in?signature:#去除emoji表情等非文字if?"emoji"?in?item:continuerep = re.compile("1f\d+\w*|[<>/=【】『』♂ω]")item=rep.sub("", item)wash_signature.append(item)words="".join(wash_signature)wordlist = jieba.cut(words, cut_all=True)word_space_split =?" ".join(wordlist)coloring = np.array(Image.open("C:/Users/casua/Desktop/test1.JPG"))my_wordcloud = WordCloud(background_color="white", max_words=800,mask=coloring, max_font_size=80, random_state=30, scale=2,font_path="C:/Windows/Fonts/STKAITI.ttf").generate(word_space_split)image_colors = ImageColorGenerator(coloring)plt.imshow(my_wordcloud.recolor(color_func=image_colors))plt.imshow(my_wordcloud)plt.axis("off")plt.show()?
看一下詞云圖:
?
總結
以上是生活随笔為你收集整理的用Python做个微信自动回复机器人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云主机遭受DDOS攻击IP不能使用如
- 下一篇: Python第二周作业