微信聊天機器人-存儲好友分享消息

1、背景

    通常大公司都比較重視企業文化,和學習氛圍,這不咱們的團隊也是如此,每一個人每個月微信分享必須超過5篇內容,一個是提升本身的閱讀量,另外還能夠把有用的資源分享給其餘人。開始記錄的一段時間還算比較順利,但是當你們的分享內容一多的時候,老是發生記漏的狀況,後來我就萌生了一個想法,可不可讓程序來記錄分享數據,這樣就不會發生錯誤了。正好這一段時間恰好在學習python,那就拿這個案例來練練手,網上搜索了一些資料,發現個人需求果真能夠用程序來實現,那麼還等什麼直接開幹吧html

2、效果展現

一、自動回覆python

 


二、生成的excel效果展現web

3、wxpy

wxpy
一、wxpy安裝比較簡單,直接使用pip命令行安裝便可:pip install wxpyapi

二、wxpy的幫助文檔仍是比較詳細的,網上大多數的文章都是簡單的使用了下這個庫,沒有詳細的解釋,若是有時間,建議最好本身過一遍幫助文檔微信

三、使用起來也是至關簡單app

3.1先導入wxpy模塊ide

 1 from wxpy import * 學習

3.2構造一個機器人對象(機器人對象可構造多個)spa

 1 bot = Bot() .net

3.3發送消息給文件助手

 1 bot.file_helper.send('你好') 

3.4發送消息給好友

1 friend = bot.friends().search('朝十晚八')[0]
2 friend.send('你好')

3.5自動回覆指定好友消息

 1 @bot.register([Friend])
 2 def auto_monitor_friend_all(msg):
 3     with cond :
 4         if msg.text.startswith(orderHeader) and msg.sender.name in destusers :
 5             print(u'收到一條好友指令消息:', msg.text)
 6             __dealwith_order(msg)
 7         else :
 8             print(u'收到一條好友消息', msg)
 9             if msg.type == PICTURE :
10                 image_cache = image_cache_path + '/' + msg.file_name
11                 msg.get_file(image_cache)
12             tuling.do_reply(msg)

上述自動回覆消息使用了圖靈機器人,使用時須要本身去這兒申請一個圖靈帳號,而後建立一個圖靈機器人,獲得機器人的apikey,而後構造一個Tuling對象,使用該對象進程回覆消息

1 tuling = Tuling(api_key='3d131c218dd44aa88def35ac37b5c9ab')

3.6自動添加好友

1 # 註冊好友請求類消息
2 @bot.register(msg_types = FRIENDS)
3 def auto_accept_friends(msg):
4     with cond :
5         # 接受好友 (msg.card 爲該請求的用戶對象)
6         new_friend = bot.accept_friend(msg.card)
7         new_friend.send(u'圖靈接受了你的好友請求,咱們能夠開始聊天了')

3.7添加後臺定時消息

wxpy構造的機器人對象屬於web方式鏈接,若是長時間沒有消息,可能會掉線,所以咱們開啓一個後臺線程,隔一段時間發送消息給本身。

 1 def restartTimer() :
 2     global t
 3     if t.is_alive() :
 4         t.stop() 
 5 
 6     t = Timer.Timer(deamonMsg, timerInterval)
 7     t.setDaemon(True)
 8     t.start()
 9 
10 def deamonMsg() :
11     with cond :
12         msgCount = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
13         print(u'發送消息給文件夾助手,保持鏈接活躍。消息內容:', msgCount)
14         bot.file_helper.send(msgCount)

上述代碼中cond爲線程同步條件變量,當使用bot對象發送消息時,須要對bot對象進行保護。

3.8處理消息指令,主要用於控制定時器

 1 def __dealwith_order(msg) :
 2     orderstr = msg.text.lower()#不區分大小寫
 3     orderstr = orderstr[len(orderHeader):]
 4     if orderstr == "1" :
 5         bot.registered.enable(auto_accept_friends)
 6         msg.reply('自動接收好友請求已開啓')
 7     elif orderstr == "2" :
 8         bot.registered.disable(auto_accept_friends)
 9         msg.reply('自動接收好友請求已關閉')
10     elif orderstr == "3" :
11         if t.is_alive() :
12             if t.is_pause() :
13                 msg.reply('後臺線程已掛起')
14             else :
15                 msg.reply('後臺線程運行正常')
16         else :
17             msg.reply('後臺線程已退出')
18     elif orderstr == "4" :
19         t.resume()
20         msg.reply('後臺線程已恢復')
21     elif orderstr == "5" :
22         t.pause()
23         msg.reply('後臺線程已掛起')
24     elif orderstr == "6" :
25         restartTimer() 
26         msg.reply('後臺線程已重啓')
27     elif orderstr.startswith("7 ") :
28         global timerInterval
29         timerInterval = int(orderstr[2:].strip())
30         restartTimer() 
31         msg.reply('後臺線程刷新間隔已修改:{0}'.format(timerInterval))
32     else :
33         msg.reply('指令:order+序號\n一、開啓自動接收好友請求\n二、關閉自動接收好友請求\n三、查看後臺線程是否活躍\n四、恢復後臺線程\n五、掛起後臺線程\n六、從新啓動後臺線程\n')
View Code

4、讀寫excel

一、使用pip命令安裝openpyxl:pip install openpyxl

二、使用openpyxl.load_workbook加載excel文件,若是文件不存在則使用openpyxl.Workbook()構造工做簿,操做完成後使用工做簿save接口保存文件

1 if os.path.exists(fileName) :
2     wbk = openpyxl.load_workbook(fileName)
3     names = wbk.sheetnames
4 else :
5     wbk = openpyxl.Workbook()
6     sheet = wbk.active
7     sheet.title = 'all'
8     names.append('all')
9     FixedSheetWidth(sheet)

三、修改列寬度和內容

 1 headList = ['發送者', '羣聊', '接受者', '發送時間', '接受時間','分享內容', '網址']
 2 
 3 def GetCellKey(r, c) : 
 4     cell =  chr(ord('A') + c - 1) + str(r)
 5     return cell
 6     
 7 def FixedSheetWidth(sheet) :
 8     for i in range(0, len(cwidth)):
 9         sheet.column_dimensions[chr(ord('A') + i)].width = cwidth[i]
10 
11 def WriteSheetTitle(sheet) :
12     i = 1
13     for svalue in headList:
14         sheet[GetCellKey(1, i)] = svalue
15         sheet[GetCellKey(1, i)].font = openpyxl.styles.Font(bold = True)
16         i = i + 1

四、添加行數據

 1 def WriteSheetRow(wbk, sheet, rowValueList, rowIndex, isBold):
 2     i = 1
 3     for svalue in rowValueList :
 4         if isBold :
 5             sheet[GetCellKey(rowIndex, i)] = svalue
 6             sheet[GetCellKey(rowIndex, i)].font = openpyxl.styles.Font(bold = True)
 7         else:
 8             sheet[GetCellKey(rowIndex, i)] = svalue
 9         i = i + 1
10 
11     #寫入單獨已用戶名爲標籤的sheet
12     name = rowValueList[0]
13     subsheet = None
14     if name not in names :
15         subsheet = wbk.create_sheet(name)
16         WriteSheetTitle(subsheet)
17         FixedSheetWidth(subsheet)
18         names.append(name)
19     else :
20         subsheet = wbk[name]
21 
22     j = 1
23     rowIndex = subsheet.max_row + 1
24     for svalue in rowValueList:
25         if isBold :
26             subsheet[GetCellKey(rowIndex, j)] = svalue
27         else:
28             subsheet[GetCellKey(rowIndex, j)] = svalue
29         j = j + 1
View Code

五、備份用於查看的文件

1 #備份文件
2 file2see = os.path.join(os.getcwd(), generateFileName(''))
3 if not os.path.exists(file2see) :
4     shutil.copyfile(fileName, file2see)
5 else :
6     if os.access(file2see, os.W_OK) :
7         shutil.copyfile(fileName, file2see)

5、定時器

    定時器主要用於後臺定時發送消息給機器人本身,保持本身在線狀態

 定時器對象使用python的線程對象thread.Thread做爲父類,並添加了pause、is_pause、resume和stop接口,使定時器控制起來更方便

 1 # -*- coding: UTF-8 -*-
 2 
 3 import time
 4 import threading
 5 
 6 class Timer(threading.Thread):
 7     def __init__(self, fun, seconds):
 8         self.__runTime = seconds
 9         self.__runfun = fun
10         self.__elapsed = 0.0 #流失的時間
11         self.__flag = threading.Event()     # 用於暫停線程的標識
12         self.__flag.set()       # 設置爲True
13         self.__running = threading.Event()      # 用於中止線程的標識
14         self.__running.set()      # 將running設置爲True
15         threading.Thread.__init__(self)
16         print("initialize Timer completed!")
17 
18     def run(self):
19         while self.__running.isSet():
20             self.__flag.wait()      # 爲True時當即返回, 爲False時阻塞直到內部的標識位爲True後返回
21             time.sleep(0.1) #100ms檢測一次退出狀態
22             self.__elapsed = self.__elapsed + 0.1
23             if self.__elapsed > self.__runTime :
24                 self.__elapsed = 0.0
25                 self.__runfun()
26 
27     def pause(self):
28         self.__flag.clear()     # 設置爲False, 讓線程阻塞
29 
30     def is_pause(self) :
31         return  self.__flag.isSet() == False
32 
33     def resume(self):
34         self.__flag.set()    # 設置爲True, 讓線程中止阻塞
35 
36     def stop(self):
37         self.__flag.set()       # 將線程從暫停狀態恢復, 如何已經暫停的話
38         self.__running.clear()        # 設置爲False
39         self.__elapsed = 0.0
View Code

6、demo下載

  須要所有代碼的到csdn直接下載:自動聊天機器人-存儲好友分享消息

7、參考文章


轉載聲明:本站文章無特別說明,皆爲原創,版權全部,轉載請註明:朝十晚八

相關文章
相關標籤/搜索