歡迎光臨
每天分享高質量文章

關於微信和Python的點點滴滴

一個自動回覆機器人

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

不願時刻被訊息打擾的人
訊息需要批次處理的人們(比如微商)

對此,我設計了幾個功能:

功能串列:

  • 收到訊息立即自動回覆

  • 收到訊息延遲指定時間回覆

  • 對不同好友定製不同的回覆內容

  • 在手機端隨時進行控制

#自動回覆開關
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'])

收到朋友訊息即時進行自動回覆是很簡單的,但是如何去做延時發送回覆訊息呢?(至於做這個功能有沒有必要的問題可以先擱置,不過我認為在很多場景下是需要這個功能的,大家也可以在評論區討論在什麼場景下需要延遲自動回覆)現在就回到技術的問題,如何實現可設定時間的延時自動回覆。

#延遲傳送訊息的函式
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()

到此為止,主要的功能已經實現了,我用一個測試賬號對我的微信進行了各種測試,看一下以下截圖:

這時功能基本已經完成了

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 &來全方位守護行程


簡單分析微信好友資訊

性別比例


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()

 

基操 勿6 皆坐 觀之

完整程式碼

import itchat
from pyecharts import Bar,Pie,Geo,Map
import re
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
import PIL.Image as Image
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:])
   # 開始畫餅
   attr = list(sex.keys())
   v1 = list(sex.values())
   pie = Pie("好友性別比例")
   pie.add("", attr, v1, v1, is_label_show=True)
   pie.render()
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
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
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()
if __name__ == '__main__':
   itchat.auto_login(True)
   # city=get_data("City")
   # province=get_data("Province")
   # signature=get_data("Signature")
   # nickname=get_data("NickName")
   # 微信好友省份分佈
   # 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()
   微信江蘇好友分佈
   attr,value=friends_jiangsu()
   map = Map("江蘇好友分佈","@寒食君", width=1200, height=600)
   map.add("", attr, value, maptype='江蘇', is_visualmap=True,
           visual_text_color='#000')
   map.render()
   # friends_signature()

作者:寒食君

源自:

https://juejin.im/post/5b1e630ee51d4506bb3a7c3a

贊(0)

分享創造快樂