通常大公司都比較重視企業文化,和學習氛圍,這不咱們的團隊也是如此,每一個人每個月微信分享必須超過5篇內容,一個是提升本身的閱讀量,另外還能夠把有用的資源分享給其餘人。開始記錄的一段時間還算比較順利,但是當你們的分享內容一多的時候,老是發生記漏的狀況,後來我就萌生了一個想法,可不可讓程序來記錄分享數據,這樣就不會發生錯誤了。正好這一段時間恰好在學習python,那就拿這個案例來練練手,網上搜索了一些資料,發現個人需求果真能夠用程序來實現,那麼還等什麼直接開幹吧html
一、自動回覆python
二、生成的excel效果展現web
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')
一、使用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
五、備份用於查看的文件
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)
定時器主要用於後臺定時發送消息給機器人本身,保持本身在線狀態
定時器對象使用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
須要所有代碼的到csdn直接下載:自動聊天機器人-存儲好友分享消息
轉載聲明:本站文章無特別說明,皆爲原創,版權全部,轉載請註明:朝十晚八