最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python來開發(fā)微信功能

 更新時間:2018年06月13日 10:43:55   作者:寒食君  
這篇文章主要介紹了使用Python來開發(fā)微信功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

在移動社交時代,微信已經(jīng)成為我們生活不可或缺的一部分。2017年的《微信數(shù)據(jù)報告》中顯示:每天有380億條消息從微信上發(fā)出,其中6億條是語音消息,有350萬個活躍的公眾賬號,并存在著8億活躍粉絲。在其他諸如支付、出行等方面,也更是與我們的生活休憩相關(guān)。正如它的slogan那樣:微信,是一個生活方式。

和微信有關(guān)的第三方框架很多,比如「wxpy」「wxBot」等,今天要使用的是其中著名的「itchat」Python模塊,它是由第三方開發(fā)者@LittleCoder等架構(gòu)實(shí)現(xiàn)的接口,該API的使用場景可以不僅僅只是一個微信機(jī)器人,更多的功能可以由我們自己去發(fā)現(xiàn)拓展?!竔tchat」的功能非常強(qiáng)大,調(diào)用卻十分簡單,同時,將「itchat」結(jié)合「matplotlib」「jieba」等模塊,可以對我們的微信好友的信息進(jìn)行一些收集與分析,讓我們能更直觀的了解我們自己的圈子。

一個自動回復(fù)機(jī)器人

微信自上線以來,一直沒有自動回復(fù)的功能,想必是有他們的理念。但是有些人群,確實(shí)對此功能有一定需求,我舉兩個栗子:

  • 不愿時刻被消息打擾的人
  • 消息需要批量處理的人們(比如微商)

對此,我設(shè)計(jì)了幾個功能:

功能列表:

  • [x] 收到消息立即自動回復(fù)
  • [x] 收到消息延遲指定時間回復(fù)
  • [x] 對不同好友定制不同的回復(fù)內(nèi)容
  • [x] 在手機(jī)端隨時進(jìn)行控制

itchat的原理是通過掃碼進(jìn)行遠(yuǎn)程微信網(wǎng)頁端的登錄,然后通過在移動端進(jìn)行操作,網(wǎng)頁端進(jìn)行響應(yīng),來實(shí)現(xiàn)一些功能,雖然似乎繞了個彎子,但是在微信的限制下,這似乎已經(jīng)是一種最佳的方式了,猶如戴著鐐銬起舞。

首先我們需要考慮別的問題是:程序如何在微信端接收到你的指令。此時出現(xiàn)了一個非常重要的角色:文件管理器。(當(dāng)網(wǎng)頁端微信登陸后,消息列表會出現(xiàn))此時,文件管理器充當(dāng)了移動端和web端的橋梁。比如你給文件管理器傳一個字符串作為指令,網(wǎng)頁端接收到數(shù)據(jù)后就能根據(jù)你的預(yù)定來執(zhí)行相應(yīng)操作。

我們可以先通過設(shè)定幾個全局變量來做作為功能的開關(guān)和保存數(shù)據(jù)的容器。

#自動回復(fù)開關(guān)
SWITCH_REPLY=True
#延遲回復(fù)開關(guān)
SWITCH_DELAY=False
#延遲時間
DELAY_TIME=120
#消息前綴開關(guān)
SWITCH_PREFIX=True
#消息前綴內(nèi)容
PREFIX_CONTENT="[自動回復(fù)]"
#回復(fù)內(nèi)容字典
REPLY_DICT={}
#延遲回復(fù)字典
DELAY_REPLY_DICT={}

然后通過判斷web端在”文件管理器“中接收到的字符串指令來進(jìn)行不同操作,這一部分的代碼比較簡單且冗長,這里就不貼出來了,完整源碼地址將會在文末給出。

假如此時我們收到了朋友的消息,需要程序給出自動回復(fù)。

#獲取發(fā)送消息的朋友的信息
  target_friend=itchat.search_friends(userName = msg['FromUserName'])
  if target_friend:
   #獲取ta的昵稱
   nickName=target_friend['NickName']
   if not REPLY_DICT.__contains__(nickName):
    #設(shè)置默認(rèn)回復(fù)
    REPLY_DICT[nickName]="抱歉我有事暫未看到消息,稍后回復(fù),若有急事可以電話聯(lián)系(•ω•`)"
   
   reply_content=REPLY_DICT[nickName]
   #判斷自動回復(fù)開關(guān)
   if SWITCH_REPLY:
    #判斷延時回復(fù)開關(guān)
    if SWITCH_DELAY:
     localtime = time.time()
     DELAY_REPLY_DICT[nickName]=[localtime,msg['FromUserName']]
     print (DELAY_REPLY_DICT)
     
    if not SWITCH_DELAY:
     #判斷消息前綴開關(guān)
     if SWITCH_PREFIX:
      reply_content = PREFIX_CONTENT + REPLY_DICT[nickName]
     else:
      reply_content = REPLY_DICT[nickName]
     #發(fā)送消息
     itchat.send(reply_content, toUserName=msg['FromUserName'])

收到朋友消息即時進(jìn)行自動回復(fù)是很簡單的,但是如何去做延時發(fā)送回復(fù)消息呢?(至于做這個功能有沒有必要的問題可以先擱置,不過我認(rèn)為在很多場景下是需要這個功能的,大家也可以在評論區(qū)討論在什么場景下需要延遲自動回復(fù))現(xiàn)在就回到技術(shù)的問題,如何實(shí)現(xiàn)可設(shè)置時間的延時自動回復(fù)。

我先談一談我的想法,拋磚引玉。一般發(fā)送消息需要用到隊(duì)列,進(jìn)行入隊(duì)和出隊(duì),我在這里設(shè)置了一個字典來保存消息發(fā)送者的數(shù)據(jù)。鍵為消息發(fā)送者的昵稱,值是一個長度為2的數(shù)組,分別保存消息發(fā)送者的微信id和接收消息時的時間戳。這樣我將每條發(fā)送過來的朋友信息保存在這個字典中,再通過將設(shè)定延遲時間同消息時間戳求和與當(dāng)前時間戳進(jìn)行對比,若當(dāng)前時間戳較大,那么執(zhí)行發(fā)送消息的操作。

此時再開啟一個線程作為定時任務(wù),定時去檢測字典中每條數(shù)據(jù)是否到達(dá)了發(fā)送的臨界要求(當(dāng)前時間戳>=消息時間戳+設(shè)定的延遲時間)Python中有個專門做定時任務(wù)的模塊叫sched,但是我嘗試了一下,sched會阻塞當(dāng)前主線程,也會阻塞itchat的線程,所以并不合適。這里我還是采用了threading的Timer來充當(dāng)定時器,不過要注意使用遞歸,否則將會出現(xiàn)運(yùn)行一次就結(jié)束的情況。

#延遲發(fā)送消息的函數(shù)
def delay_reply():
 #print("開始執(zhí)行")
 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 ("發(fā)送消息")
     del DELAY_REPLY_DICT[item]
   print (DELAY_REPLY_DICT)

 global timer1
 timer1=threading.Timer(DELAY_TIME,delay_reply)
 timer1.start()

到此為止,主要的功能已經(jīng)實(shí)現(xiàn)了,我用一個測試賬號對我的微信進(jìn)行了各種測試,看一下以下截圖:

 

 

這時功能基本已經(jīng)完成了,這就結(jié)束了嗎?別著急,再想想有沒有需要完善一下的地方?用過微信web端的同學(xué)應(yīng)該知道,當(dāng)web端長期處于未操作的狀態(tài)下會失去連接。在我們這個情況下,假如你長時間未收到微信消息,后臺程序?qū)c微信失去連接,再次開啟需要登上服務(wù)器重啟程序,這顯然非常麻煩。有沒有什么簡單的解決辦法呢?我想到一些應(yīng)用的后臺通常會做一道心跳檢測機(jī)制,那我就模仿這個思路,定時給我的”文件管理器“發(fā)一個字符串,來保持連接。

def keep_alive():
 text="保持登錄"
 itchat.send(text, toUserName="filehelper")
 global timer2
 timer2 = threading.Timer(60*60,keep_alive)
 timer2.start()

最后,我們需要將這個程序發(fā)布在服務(wù)器上,讓它全天候?yàn)槲业奈⑿欧?wù)。

 

這里需要注意,如果僅用 python xxxx.py 來運(yùn)行的話,關(guān)閉shell會導(dǎo)致進(jìn)程結(jié)束,所以我們需要使用 nohup python xxxx.py & 來全方位守護(hù)進(jìn)程,這里啰嗦一句,nohup和&的功能是不一樣的,很多人容易混淆,感興趣的話可以去查下資料區(qū)分一下。

到此,微信經(jīng)過了我們的稍稍調(diào)教,已經(jīng)乖了一點(diǎn)。但是,這遠(yuǎn)遠(yuǎn)不夠,思路可以繼續(xù)拓展,比如實(shí)現(xiàn)通過手機(jī)微信來控制電腦的開關(guān)機(jī),電腦軟件的啟動關(guān)閉,都是可以的,甚至實(shí)現(xiàn)控制家中的空調(diào),理論上也未嘗不可,只是比較有難度。

簡單分析微信好友信息

上文提到,既然我們能通過itchat來獲取好友的信息,那讓我們看看都有哪些好玩的信息。這是以json形式返回的我的信息,同理我的好友的這些公開信息我也能獲取到。

我們就來進(jìn)行一些簡單的的數(shù)據(jù)抓取,清洗與呈現(xiàn)。我看中的字段是:Sex、City、Province、Signature。我想做的是通過圖表來直觀地展示我微信好友中的 性別比例 , 家鄉(xiāng)分布 (當(dāng)然不一定準(zhǔn)確,很多人都是胡亂設(shè)置的), 我的江蘇朋友的市級分布 ,以及 好友個性簽名的詞云 。這部分內(nèi)容主要是需要熟悉諸如pyecharts、jieba、wordcloud模塊的API調(diào)取,難度不大,但需要細(xì)心調(diào)試。我這里就不詳細(xì)贅述了,有疑問可以在評論區(qū)討論。

性別比例

def get_sex():
 # 獲取好友數(shù)據(jù)
 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:
  #刪除英文省份,因?yàn)橹袊貓D表中沒有
  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('')
 #提取地圖接口需要的數(shù)據(jù)格式
 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()

 

省內(nèi)分布

def friends_jiangsu():
 # 獲取好友城市
 city_distribution={}
 city = get_data("City")
 jiangsu_city=["南通市","常州市","淮安市","連云港市","南京市","蘇州市","宿遷市","泰州市","無錫市","徐州市","鹽城市","揚(yáng)州市","鎮(zhèn)江市"]
 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
 # 提取地圖接口需要的數(shù)據(jù)格式
 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()

 

總結(jié)

以上所述是小編給大家介紹的使用Python來開發(fā)微信功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python2.7實(shí)現(xiàn)多進(jìn)程下開發(fā)多線程示例

    Python2.7實(shí)現(xiàn)多進(jìn)程下開發(fā)多線程示例

    這篇文章主要為大家詳細(xì)介紹了Python2.7實(shí)現(xiàn)多進(jìn)程下開發(fā)多線程示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • python 實(shí)現(xiàn)樸素貝葉斯算法的示例

    python 實(shí)現(xiàn)樸素貝葉斯算法的示例

    這篇文章主要介紹了python實(shí)現(xiàn)樸素貝葉斯算法的示例,幫助大家更好的理解和學(xué)習(xí)python 機(jī)器學(xué)習(xí)算法,感興趣的朋友可以了解下
    2020-09-09
  • Django中URL的參數(shù)傳遞的實(shí)現(xiàn)

    Django中URL的參數(shù)傳遞的實(shí)現(xiàn)

    這篇文章主要介紹了Django中URL的參數(shù)傳遞的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python套接字流重定向?qū)嵗齾R總

    python套接字流重定向?qū)嵗齾R總

    套接字是一種具有之前所說的“通信端點(diǎn)”概念的計(jì)算網(wǎng)絡(luò)數(shù)據(jù)結(jié)構(gòu)。相當(dāng)于電話插口,沒它無法通信,這個比喻非常形象。今天我們就來匯總一下套接字流重定向的實(shí)例
    2016-03-03
  • 淺談python中真正關(guān)閉socket的方法

    淺談python中真正關(guān)閉socket的方法

    今天小編就為大家分享一篇淺談python中真正關(guān)閉socket的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 使用python庫xlsxwriter庫來輸出各種xlsx文件的示例

    使用python庫xlsxwriter庫來輸出各種xlsx文件的示例

    這篇文章主要介紹了使用python庫xlsxwriter庫來輸出各種xlsx文件的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • python 以16進(jìn)制打印輸出的方法

    python 以16進(jìn)制打印輸出的方法

    今天小編就為大家分享一篇python 以16進(jìn)制打印輸出的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 如何使用Python一鍵修改上萬個文件名

    如何使用Python一鍵修改上萬個文件名

    各位有沒有遇到過需要批量整理多層文件夾結(jié)構(gòu)里各種類型(docx、excel、ppt)的文件材料的時候,下面這篇文章主要給大家介紹了關(guān)于如何使用Python一鍵修改上萬個文件名的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 裝了python再裝anaconda該怎么操作保姆級教程

    裝了python再裝anaconda該怎么操作保姆級教程

    本文詳細(xì)介紹了在已安裝Python的情況下如何正確安裝和配置Anaconda環(huán)境,包括Python環(huán)境變量的配置、Anaconda的下載安裝以及環(huán)境變量配置,文中通過代碼就介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • 使用Python實(shí)現(xiàn)查找PDF中的指定文本并高亮顯示

    使用Python實(shí)現(xiàn)查找PDF中的指定文本并高亮顯示

    在處理大量PDF文檔時,有時我們需要快速找到特定的文本信息,本文將提供三個Python示例來幫助你在PDF文件中快速查找并高亮指定的文本,希望對大家有所幫助
    2024-03-03

最新評論

射洪县| 夏津县| 汝城县| 镇原县| 岳阳县| 班戈县| 泽库县| 郎溪县| 夏邑县| 海兴县| 连山| 岳阳县| 沿河| 柳河县| 珲春市| 南溪县| 贺兰县| 香港 | 城固县| 吉安县| 汉阴县| 西丰县| 霍城县| 河池市| 南昌县| 青田县| 兴山县| 淅川县| 恩平市| 达拉特旗| 罗定市| 广安市| 福建省| 阿克陶县| 志丹县| 平山县| 修文县| 抚顺县| 巴塘县| 临城县| 钟祥市|