您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何使用Python來開發微信功能,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
1、云計算,典型應用OpenStack。2、WEB前端開發,眾多大型網站均為Python開發。3.人工智能應用,基于大數據分析和深度學習而發展出來的人工智能本質上已經無法離開python。4、系統運維工程項目,自動化運維的標配就是python+Django/flask。5、金融理財分析,量化交易,金融分析。6、大數據分析。
在移動社交時代,微信已經成為我們生活不可或缺的一部分。2017年的《微信數據報告》中顯示:每天有380億條消息從微信上發出,其中6億條是語音消息,有350萬個活躍的公眾賬號,并存在著8億活躍粉絲。在其他諸如支付、出行等方面,也更是與我們的生活休憩相關。正如它的slogan那樣:微信,是一個生活方式。
和微信有關的第三方框架很多,比如「wxpy」「wxBot」等,今天要使用的是其中著名的「itchat」Python模塊,它是由第三方開發者@LittleCoder等架構實現的接口,該API的使用場景可以不僅僅只是一個微信機器人,更多的功能可以由我們自己去發現拓展。「itchat」的功能非常強大,調用卻十分簡單,同時,將「itchat」結合「matplotlib」「jieba」等模塊,可以對我們的微信好友的信息進行一些收集與分析,讓我們能更直觀的了解我們自己的圈子。
一個自動回復機器人
微信自上線以來,一直沒有自動回復的功能,想必是有他們的理念。但是有些人群,確實對此功能有一定需求,我舉兩個栗子:
不愿時刻被消息打擾的人
消息需要批量處理的人們(比如微商)
對此,我設計了幾個功能:
功能列表:
[x] 收到消息立即自動回復
[x] 收到消息延遲指定時間回復
[x] 對不同好友定制不同的回復內容
[x] 在手機端隨時進行控制
itchat的原理是通過掃碼進行遠程微信網頁端的登錄,然后通過在移動端進行操作,網頁端進行響應,來實現一些功能,雖然似乎繞了個彎子,但是在微信的限制下,這似乎已經是一種最佳的方式了,猶如戴著鐐銬起舞。
首先我們需要考慮別的問題是:程序如何在微信端接收到你的指令。此時出現了一個非常重要的角色:文件管理器。(當網頁端微信登陸后,消息列表會出現)此時,文件管理器充當了移動端和web端的橋梁。比如你給文件管理器傳一個字符串作為指令,網頁端接收到數據后就能根據你的預定來執行相應操作。
我們可以先通過設定幾個全局變量來做作為功能的開關和保存數據的容器。
#自動回復開關 SWITCH_REPLY=True #延遲回復開關 SWITCH_DELAY=False #延遲時間 DELAY_TIME=120 #消息前綴開關 SWITCH_PREFIX=True #消息前綴內容 PREFIX_CONTENT="[自動回復]" #回復內容字典 REPLY_DICT={} #延遲回復字典 DELAY_REPLY_DICT={}
然后通過判斷web端在”文件管理器“中接收到的字符串指令來進行不同操作,這一部分的代碼比較簡單且冗長,這里就不貼出來了,完整源碼地址將會在文末給出。
假如此時我們收到了朋友的消息,需要程序給出自動回復。
#獲取發送消息的朋友的信息 target_friend=itchat.search_friends(userName = msg['FromUserName']) if target_friend: #獲取ta的昵稱 nickName=target_friend['NickName'] if not REPLY_DICT.__contains__(nickName): #設置默認回復 REPLY_DICT[nickName]="抱歉我有事暫未看到消息,稍后回復,若有急事可以電話聯系(?ω?`)" reply_content=REPLY_DICT[nickName] #判斷自動回復開關 if SWITCH_REPLY: #判斷延時回復開關 if SWITCH_DELAY: localtime = time.time() DELAY_REPLY_DICT[nickName]=[localtime,msg['FromUserName']] print (DELAY_REPLY_DICT) if not SWITCH_DELAY: #判斷消息前綴開關 if SWITCH_PREFIX: reply_content = PREFIX_CONTENT + REPLY_DICT[nickName] else: reply_content = REPLY_DICT[nickName] #發送消息 itchat.send(reply_content, toUserName=msg['FromUserName'])
收到朋友消息即時進行自動回復是很簡單的,但是如何去做延時發送回復消息呢?(至于做這個功能有沒有必要的問題可以先擱置,不過我認為在很多場景下是需要這個功能的,大家也可以在評論區討論在什么場景下需要延遲自動回復)現在就回到技術的問題,如何實現可設置時間的延時自動回復。
我先談一談我的想法,拋磚引玉。一般發送消息需要用到隊列,進行入隊和出隊,我在這里設置了一個字典來保存消息發送者的數據。鍵為消息發送者的昵稱,值是一個長度為2的數組,分別保存消息發送者的微信id和接收消息時的時間戳。這樣我將每條發送過來的朋友信息保存在這個字典中,再通過將設定延遲時間同消息時間戳求和與當前時間戳進行對比,若當前時間戳較大,那么執行發送消息的操作。
此時再開啟一個線程作為定時任務,定時去檢測字典中每條數據是否到達了發送的臨界要求(當前時間戳>=消息時間戳+設定的延遲時間)Python中有個專門做定時任務的模塊叫sched,但是我嘗試了一下,sched會阻塞當前主線程,也會阻塞itchat的線程,所以并不合適。這里我還是采用了threading的Timer來充當定時器,不過要注意使用遞歸,否則將會出現運行一次就結束的情況。
#延遲發送消息的函數 def delay_reply(): #print("開始執行") global DELAY_REPLY_DICT if SWITCH_DELAY: while len(DELAY_REPLY_DICT)>0: localtime = time.time() # print (localtime) # print (DELAY_REPLY_DICT[item][0]) # print (int(DELAY_TIME)) for item in list(DELAY_REPLY_DICT.keys()): if SWITCH_REPLY: reply_content = item + "," + str(round(int(DELAY_TIME) / 60, 1)) + "分鐘過去了," + REPLY_DICT[item] itchat.send(reply_content, toUserName=DELAY_REPLY_DICT[item][1]) # print ("發送消息") del DELAY_REPLY_DICT[item] print (DELAY_REPLY_DICT) global timer1 timer1=threading.Timer(DELAY_TIME,delay_reply) timer1.start()
到此為止,主要的功能已經實現了,我用一個測試賬號對我的微信進行了各種測試,看一下以下截圖:
這時功能基本已經完成了,這就結束了嗎?別著急,再想想有沒有需要完善一下的地方?用過微信web端的同學應該知道,當web端長期處于未操作的狀態下會失去連接。在我們這個情況下,假如你長時間未收到微信消息,后臺程序將會與微信失去連接,再次開啟需要登上服務器重啟程序,這顯然非常麻煩。有沒有什么簡單的解決辦法呢?我想到一些應用的后臺通常會做一道心跳檢測機制,那我就模仿這個思路,定時給我的”文件管理器“發一個字符串,來保持連接。
def keep_alive(): text="保持登錄" itchat.send(text, toUserName="filehelper") global timer2 timer2 = 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調取,難度不大,但需要細心調試。我這里就不詳細贅述了,有疑問可以在評論區討論。
性別比例
def get_sex(): # 獲取好友數據 my_friends = itchat.get_friends(update=True)[0:] sex = {"male": 0, "female": 0, "other": 0} for item in my_friends[1:]: s = item["Sex"] if s == 1: sex["male"] += 1 elif s == 2: sex["female"] += 1 else: sex["other"] += 1 total = len(my_friends[1:])
好友省級分布
def get_data(type): result=[] my_friends = itchat.get_friends(update=True)[0:] for item in my_friends: result.append(item[type]) return result def friends_province(): # 獲取好友省份 province= get_data("Province") # 分類 province_distribution = {} for item in province: #刪除英文省份,因為中國地圖表中沒有 if bool(re.search('[a-z]',item)): continue elif not province_distribution.__contains__(item): province_distribution[item] = 1 else: province_distribution[item] += 1 #將省份名為空的刪除 province_distribution.pop('') #提取地圖接口需要的數據格式 province_keys=province_distribution.keys() province_values=province_distribution.values() return province_keys,province_values if __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()
省內分布
def friends_jiangsu(): # 獲取好友城市 city_distribution={} city = get_data("City") jiangsu_city=["南通市","常州市","淮安市","連云港市","南京市","蘇州市","宿遷市","泰州市","無錫市","徐州市","鹽城市","揚州市","鎮江市"] for item in city: item=item+"市" if item in jiangsu_city: if not city_distribution.__contains__(item): city_distribution[item]=1 else: city_distribution[item]+=1 # 提取地圖接口需要的數據格式 city_keys=city_distribution.keys() city_values=city_distribution.values() return city_keys,city_values if __name__ == '__main__': itchat.auto_login(True) 微信江蘇好友分布 attr,value=friends_jiangsu() map = Map("江蘇好友分布","@寒食君", width=1200, height=600) map.add("", attr, value, maptype='江蘇', is_visualmap=True, visual_text_color='#000') map.render()
個性簽名詞云
def friends_signature(): signature = get_data("Signature") wash_signature=[] for item in signature: #去除emoji表情等非文字 if "emoji" in item: continue rep = 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來開發微信功能”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。