中文编程,最精致的python访客登记系统实例项目,微信机器人不再只当人工智障------07
中文編程,最精致的python訪客登記系統實例項目,微信機器人不再只當人工智障------07 - 浩海泛舟的文章 - 知乎 https://zhuanlan.zhihu.com/p/51771041
?
面向套路編程(上)
泛舟n天沒更新,終于把這篇琢磨出來了.
在泛舟的零基礎入門系列里,開篇就指明了編程就是一個 數據輸入>>>方法計算>>>輸出結果 這個恒久不變的套路.或者可以裝一點,叫道生一,一生二,二生三,三生萬物.所有的編程,都是這樣一個連環套中套.小套大再更大套大一直下去.
而回到我們的正題,就是我上上一篇的代碼,可以算是面向過程的代碼,直接描述流程,基本不能重用,重復的特別多.
而接下來做的代碼優化,就是要優化成面向對象的代碼.我習慣叫面向套路的代碼,這里,也就是面向套路的編程.
看下面流程圖,就是整體程序的流程,也就是真個程序的套路:
?
?
?
?
上面的代碼,就是整個主程序的代碼.
根據消息,判斷來自誰,判讀超時,讀取任務記錄表,根據任務記錄表的步驟,讀取步驟對應的方法.每一條消息,都是這個套路.就完成了一個來訪登記程序的主要套路.為什么任務記錄,任務時間這些不寫在這個主方法,或者叫住套路里面,因為這個套路每條信息都會重新更新一次,如果寫在里面,就根本不可能做到步驟記錄.
再看這個住套路里面套了兩個小一級的套路,可以理解成里面包含了兩個組件.一個是 方法_超時判斷,一個是方法_步驟處理.如果主套路是第一層,那么這里就是第二層.
?
?
超時判斷這里,沒有套到其他方法,所以這里就再沒有下一層了.
?
?
方法_步驟處理,這里很明顯就是整個程序的重點部分.而其中最重點的就是這個:
?
?
?
?
根據任務記錄,讀取步驟對應的信息類型,檢測信息類型是否吻合,然后重新構造方法名稱.再調用 eval函數,這個函數厲害,就是可以根據字符串調用名稱相同的函數.就是這個方法,可以動態調用其他方法.在這里,就是可以動態調用其他套路.
根據我們實際情況和流程設計,步驟一共六部,也就是6套方法套路.我就不具體說,看下圖.
?
?
整個程序總共六層套路.
其實一般使用并沒有那么復雜,泛舟的經驗就是,愛怎么寫怎么寫,不管黑貓白貓,捉到老鼠的就是好貓.能幫泛舟完成任務,節省時間的,就是好程序.但是總得有點追求,畢竟泛舟寫在網上供所有人閱讀的嘛.最后貼上泛舟優化后的程序代碼.下一篇將繼續優化代碼,繼續套路之旅.
感謝各位的閱讀,望勿噴.
?
# -*- coding: utf-8 -*- """ Created on Tue Dec 4 10:19:35 2018 模塊 itchat ,中文測試 @author: 浩海泛舟 """import time as 包_時間 import itchat as 包_微信機器人 import 身份證識別 as 包_身份證識別 #import 包名不能是中文 import pandas as 包_科學計算 from pandas.core.frame import DataFrame as 包_制表def 方法_更新excel記錄(數據):錯誤代碼 = 0 try:#讀取excel文檔電子表格1 = './excel/訪客登記表.xlsx'數據表1 = 包_科學計算.read_excel(電子表格1, sheet_name=None)['Sheet1']#數據 = [['張一','sxxx0089','面試','2018-11-30 14:35']]數據表 = []數據表.append(數據)數據表2 = 包_制表(數據表)數據表2.columns = ['姓名','身份證號碼','來訪目的','來訪時間']#合并兩個表數據列 = [數據表1,數據表2]數據表3 = 包_科學計算.concat(數據列,sort=False) #要加后面的 sort=False ,不然程序提示錯誤 數據表3.to_excel(電子表格1,index = False) except:錯誤代碼 = 1 return 錯誤代碼def 方法_圖片檢測(消息):信息列表 = []回復信息 = '' if 消息['Type'] != 'Text':圖片名稱 = 消息['FileName']圖片路徑 = './pic/%s'%圖片名稱消息['Text'](圖片路徑)圖片 = 包_身份證識別.方法_獲取圖片碼(圖片路徑)#print(圖片)try:姓名,性別,民族,出生日期,地址,身份證號碼 = 包_身份證識別.方法_獲取身份證信息(圖片)回復信息 = '姓名:%s \n性別:%s \n民族:%s \n出生日期:%s \n地址:%s \n身份證號碼:%s \n請確認身份證信息是否正確 \n請回復 是或否'%(姓名,性別,民族,出生日期,地址,身份證號碼)信息列表 = [姓名,性別,民族,出生日期,地址,身份證號碼]return 信息列表,回復信息except:回復信息 ='圖片處理失敗,請發送正確的身份證圖片,或者選擇更清晰的身份證圖片發送!'return 信息列表,回復信息else: return 信息列表,回復信息def 方法_回復信息(回復內容,回復對象):回復 = 包_微信機器人.send(回復內容,回復對象)print(回復['BaseResponse']['ErrMsg'])def 方法_超時判斷(消息):global 任務記錄global 任務時間消息時間 = 消息['CreateTime']if 0 < (消息時間-任務時間) < 301: #判讀時間差,是不是5分鐘之內.returnelse:任務記錄 = '步驟0'returndef 方法_步驟0(消息):global 任務記錄global 任務時間if 消息['Text'] == '來訪登記': 任務記錄 = '步驟2'任務時間 = 消息['CreateTime'] 方法_回復信息(步驟_回復信息_字典['步驟1'],消息['FromUserName'])else:方法_回復信息(步驟_回復信息_字典['步驟0'],消息['FromUserName'])returndef 方法_步驟1(消息):方法_步驟0(消息)returndef 方法_步驟2(消息):global 任務記錄global 任務時間global 身份證信息臨時表global 步驟_回復信息_字典信息列表,回復信息 = 方法_圖片檢測(消息)身份證信息臨時表 = 信息列表[:]任務記錄 = '步驟3'任務時間 = 消息['CreateTime']步驟_回復信息_字典['步驟2'] = 回復信息方法_回復信息(回復信息,消息['FromUserName'])def 方法_步驟3(消息):global 任務記錄global 任務時間global 步驟_回復信息_字典global 訪客信息記錄表if 消息['Text'] in ['是','否']:if 消息['Text'] == '是':回復信息 = '請輸入來訪目的'任務記錄 = '步驟4'任務時間 = 消息['CreateTime']步驟_回復信息_字典['步驟3'] = 回復信息訪客信息記錄表 = [身份證信息臨時表[0],身份證信息臨時表[-1]]方法_回復信息(回復信息,消息['FromUserName'])else:回復信息 = '請重新發送清晰身份證圖片'任務記錄 = '步驟2'任務時間 = 消息['CreateTime']步驟_回復信息_字典['步驟3'] = 回復信息方法_回復信息(回復信息,消息['FromUserName'])else:回復信息 = 步驟_回復信息_字典['步驟2']方法_回復信息(回復信息,消息['FromUserName'])def 方法_步驟4(消息):global 任務記錄global 任務時間global 來訪目的global 步驟_回復信息_字典回復信息 = '請確認來訪目的是否正確,請輸入 是或否 '任務記錄 = '步驟5'任務時間 = 消息['CreateTime']步驟_回復信息_字典['步驟4'] = 回復信息來訪目的 = 消息['Text']方法_回復信息(回復信息,消息['FromUserName'])def 方法_步驟5(消息):global 任務記錄global 任務時間global 來訪目的global 訪客信息記錄表global 步驟_回復信息_字典if 消息['Text'] in ['是','否']: if 消息['Text'] == '是':回復信息 = '正在寫入登記信息' 步驟_回復信息_字典['步驟5'] = 回復信息方法_回復信息(回復信息,消息['FromUserName'])來訪時間 = 包_時間.strftime("%Y-%m-%d %H:%M",包_時間.localtime())訪客信息記錄表[2] = 來訪目的訪客信息記錄表[3] = 來訪時間寫入文件 = 方法_更新excel記錄(訪客信息記錄表)if 寫入文件 == 0:任務記錄 = '步驟0'回復信息 = '登記完成,謝謝!'步驟_回復信息_字典['步驟5'] = 回復信息方法_回復信息(回復信息,消息['FromUserName'])else :任務記錄 = '步驟6'回復信息 = 'excel表出現問題,可能excel表被打開或者表格被移除,請檢查!已經處理好問題請輸入:是;重新開始處理登錄程序,請輸入:否.'步驟_回復信息_字典['步驟5'] = 回復信息方法_回復信息(回復信息,消息['FromUserName'])else:任務時間 = 消息['CreateTime']回復信息 = '請重新發送來訪目的'任務記錄 = '步驟4'方法_回復信息(回復信息,消息['FromUserName']) else:回復信息 = 步驟_回復信息_字典['步驟4']方法_回復信息(回復信息,消息['FromUserName'])def 方法_步驟6(消息):global 任務記錄global 步驟_回復信息_字典global 訪客信息記錄表if 消息['Text'] == '是':#訪客信息記錄表 = 訪客信息記錄表[:2]方法_步驟5(消息)else:任務記錄 = '步驟0'回復信息 = 步驟_回復信息_字典[任務記錄]方法_回復信息(回復信息,消息['FromUserName'])def 方法_步驟處理(消息):global 任務記錄global 任務時間global 步驟_信息類型_字典global 步驟_回復信息_字典if 消息['Type'] == 步驟_信息類型_字典[任務記錄]:方法名稱 = '方法_' + 任務記錄eval(方法名稱)(消息)else:if 任務記錄 == '步驟0':方法_回復信息(步驟_回復信息_字典[任務記錄],消息['FromUserName'])else:上一步驟 = '步驟' + str(int(任務記錄[2:])-1) 方法_回復信息(步驟_回復信息_字典[上一步驟],消息['FromUserName'])步驟_信息類型_字典 = {'步驟0':'Text','步驟1':'Text','步驟2':'Picture','步驟3':'Text','步驟4':'Text','步驟5':'Text','步驟6':'Text'}步驟_回復信息_字典 ={'步驟0':'上一次操超時或沒有對應的關鍵字,您是需要登記來訪信息嗎?請重新輸入關鍵字:來訪登記','步驟1':'請給我發送清晰的身份證圖片,以便提取身份證信息!','步驟2':'Picture','步驟3':'Text','步驟4':'Text','步驟5':'Text','步驟6':'Text'}#步驟任務說明 = ['步驟名稱','檢測消息類型','任務類型','關鍵字','處理方法','回復信息']包_微信機器人.auto_login(hotReload=True) # itchat.auto_login(hotReload=True) 推出程序后暫存登陸狀態,即一段時間不用掃碼。#獲取公司微信號機器碼,用于后面作判斷 朋友列表 = 包_微信機器人.search_friends(name = '公司微信號') 公司微信機器碼 = 朋友列表[0]['UserName'] #print(朋友列表)#創建任務記錄表 任務記錄 = '步驟0' 任務時間 = int(包_時間.time()) 身份證信息臨時表 = [] 來訪目的 = '' 訪客信息記錄表 = []#注冊信息類型,作用是當微信收到文本信息,或者圖片信息時,執行下面的程序. @包_微信機器人.msg_register([包_微信機器人.content.TEXT,包_微信機器人.content.PICTURE]) def 方法_消息處理(消息):#判讀是否公司微信號if str(消息['FromUserName']) == 公司微信機器碼:print('判斷成功!')#判斷時間方法_超時判斷(消息)#根據步驟處理消息方法_步驟處理(消息)else:print('不是公司賬號,不處理!')if __name__ == '__main__':包_微信機器人.auto_login()包_時間.sleep(1)包_微信機器人.send("文件助手你好哦", toUserName="filehelper")包_微信機器人.run()?
總結
以上是生活随笔為你收集整理的中文编程,最精致的python访客登记系统实例项目,微信机器人不再只当人工智障------07的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两步彻底解决数据库中的日志已满的情况
- 下一篇: 联想G50-30出厂win8换win7心