記一次利用Python解決實際問題的思路

一、問題

自己弄了一些賬號在網上出售,賬號默認使用期限是一個月,每個賬號的出售價格也不全部一樣,每個賬號被購買的時間也不一樣。賬號數大概10個左右,所以為了方便記錄每個賬號的賬號信息、價格、購買人、上次購買的時間等數據,我就建了個數據庫表,然后把這些信息存進去,自己每隔幾天查下數據庫,看看哪些人到期了,詢問下是否續期之類的。

剛開始覺得還ok,能接受,畢竟也就10個左右,手動發幾條消息給別人也很容易,將就著用了。

后來就不行了,賬號數量達到了20個左右,這數量翻倍了,每次都得一個一個的去對著看,很煩,也很low。所以,我開始了我的計劃。

二、計劃

既然手動的效率不行,那就得向自動化靠攏了。

之前看哪些過期是數據庫查詢,查詢完了,再通知那些過期的人續費,那么需要自動化的過程就是:

  1. 查詢數據庫里面過期的數據
  2. 通知這些過期的人續費

初期的這個計劃,我們分析一下可行性

  1. 查詢數據庫,對于python來說,小菜一碟,PyMysql完美解決
  2. 通知別人續費,由于現在的溝通方式一般都是微信,這樣比較快,所以首選是能用微信通知,而剛好python里面的itchat能幫助我們實現這個。當然郵件通知也并不是不行,只是不符合當前的趨勢。

那這個計劃,用python是完全可以進行的

三、實施

1、查詢數據庫里面過期的數據

由于我的數據庫里面存的是上次購買的時間,所以在查詢過期數據的時候,需要查詢上次購買時間,再對比今天回退30天的日期,如果上次付款時間比30天前還早,那就是過期了,反之則沒有。說的有點拗口,但總的來說是個很簡單的數據庫查詢,沒什么難度。

2、通知續費

上面我們已經計劃用微信來通知續費,那么就得研究下itchat這個包。

通過看文檔知道,可以通過掃碼來登錄網頁版微信,并支持查詢好友,發送消息。可以通過用戶名、昵稱、備注、微信號等方式查詢好友。這里繼續來分析下,通過哪種方式比較好:

? 用戶名:這里的用戶名是一長串內容,微信后臺生成的,以@開頭,后面是數字和字母,而且最主要是竟然會變,我之前以為是唯一固定的,但是發現同一個人兩次竟然不一樣,不知道是和什么有關。總之,存在不固定性,所以可以排除。

? 昵稱:昵稱就是每個人給自己取的微信名,例如我的是“慢慢慢慢慢熱”,這個就是昵稱,但是微信名是可以改的,如果別人自己更改了昵稱,就找不到這個人,就發送不了消息了,也存在不固定性,所以可以排除。

? 備注:備注是自己給對方設置的,這個備注只有自己可以改,也就是說只要自己不改,這個備注是一直不變的,這就符合了我們的要求。

? 微信號:微信號有的人是沒有設置的,這時候系統會自動給他一個,以wxid_開頭,這種是查詢不到好友的(我在手機版微信中搜索過這種微信號,沒有結果),所以可以排除。

那么綜上,我們唯一的選擇就是使用 備注 來查詢微信好友,然后發送消息給他。

也就是說,我們得給每一個購買賬號的人,取一個備注,這個備注的特點是得唯一,并且,這些人的備注格式應該保持一致,這樣可以更方便的查找,例如:賬號@金額,通過這種特定的格式,我們在微信中查找就更容易,只要查找到好友,發送消息就簡簡單單了。

所以,完成了上兩步之后,我做出了一款小工具,并且打包成exe文件,使用的時候雙擊下就ok

具體的就是:當我雙擊運行后,數據庫查詢截至到今天是否有過期的用戶。如果沒有,則打印信息到窗口告訴我沒有過期的用戶;如果有,則itchat開始工作,生成微信登陸二維碼,登陸后,通過備注自動在我的微信好友中查找那些過期的人并發送過期的信息給他們。

至此,一個最基本的完成了。將之前手動查詢數據庫,手動查找好友,手動發送微信消息,全部自動化實現,算是進了一小步。

四、升級

上面的工具,總的來說,用的也還算可以,每天回去雙擊一下就行,但是我的需求也越來越多了,比如:

? 1、上面的工具,雖然打包成了exe文件,但我不能帶著到處跑吧,我想隨時隨地的查詢

? 2、總有記不住自己賬號信息的人,時不時問我一下,我也記不住啊,全在數據庫里,所以除了要能查詢過期的數據外,我還想能查詢每個賬號的信息

? 3、有人續費了或者不用了,我需要能馬上修改購買時間和賬號狀態

需求是做不完的,以上這些是目前最大的需求,我們來一一實現。想要實現這些,其實很簡單,利用flask寫一個web應用即可,手機都可以操作,但是我不會前端,所以另謀出路。

再來分析一下,查詢過期、查詢某個賬號信息、修改購買時間、修改賬號狀態等等,本質上是操作數據庫,這個實現起來沒有問題,關鍵是怎么去觸發操作數據庫

好在,強大的itchat可以監控好友或群聊消息,比如運行itchat,掃碼登陸微信A,微信A的好友微信B給A發送消息,itchat是可以完全監控到的。這就好辦了,可以把微信B當成遙控器,微信A是接收器,A接收B發送的關鍵字,來進行不同的操作(需要注意的是,在代碼中,接收關鍵字時要指定關鍵字的發送者是遙控器,其他一律不回應,否則任何人都可以操控),比如:

過期:發送關鍵字 [過期],查詢所有過期數據

查詢:發送關鍵字 [查詢+賬號],查詢該賬號的數據

更新:發送關鍵字 [更新+賬號+日期],更新該賬號的購買日期

刪除:發送關鍵字 [刪除+賬號],將該賬號暫時置為無效

全部:發送關鍵字 [全部],查詢所有賬號數據

我們用作為遙控器的微信發送過期、查詢、更新、刪除、全部這幾個關鍵字,每個關鍵字需要按特定的格式發送,當作為接收器的微信收到關鍵字時,再按照程序里面的邏輯去執行不同的操作,程序里的邏輯也就是數據庫操作的邏輯,這樣就達到了使用手機隨地操作的要求了。

但是,還沒有達到隨時的要求,要想隨時,就得在一臺電腦上運行程序,把作為接收器的微信永遠登陸在上面。顯然,如果使用自己家里的電腦,是不太現實的。一個是不可能永遠不關機,另一個是程序崩潰了要晚上才能回去重啟,無法控制。

所以,云服務器是最好的選擇,不管選阿里云還是騰訊云還是自己買的其他VPS都可以。首先安裝mysql在服務器上,然后將本地的數據全部復制到云服務器的mysql中,然后安裝python,安裝必要的包就可以運行了。需要注意的是,需要在服務器上后臺運行腳本,否則在斷開xshell的時候腳本也會停止運行,這里可以了解學習一下linuxnohub命令。

完成以上這些,作為接收器的微信就永遠登陸了,遙控器就可以隨時隨地操作了,我們上面的需求就基本實現了。

五、總結

針對一個自己實際遇到的問題,然后利用自己已學或未學的知識去解決,這是一個很棒的體驗。在這次解決問題的過程中,接觸了mysqlpython編程及itchat包的運用、打包python腳本為exe文件、linux服務器的相關操作、linux服務器部署python應用等知識;也踩過很多坑,比如itchat獲取好友的方式、比如linux部署python應用等等,但是在一番摸索和查找之后,問題也都解決。代碼在碼云上,代碼可能寫的不怎么好,但重在思路,以此來分享一下。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容