Line Notify: 利用Python傳送客製化訊息 — 以吉娃娃長輩圖為例。

Eason
Mar 1, 2021

--

前言

想要寫Medium很久惹,無奈太過忙碌加上我有嚴重拖延症,因此遲遲沒有開始行動。趁著最近開始需要撰寫CV,想要慢慢在Medium紀錄之前寫過的一些小程式,希望未來也能順便把其他想寫的東西一起補齊(希望啦…)。

第一篇將分享如何利用Python以及Line Notify自動化的傳送消息給自己或是指定的群組,文章將使用我最喜歡的吉娃娃長輩貼圖當作舉例,讓大家都能夠利用可愛的吉娃娃長輩圖與朋友們維繫感情🥰。但實際實作後才發現,Line Notify只能使用預設的幾組官方貼圖,無法用自訂的貼圖,原本以為要換個例子惹。但本著對吉娃娃的愛,所以還是厚著臉皮的私訊作者的ig,最後也幸運地得到作者的授權,在這邊要特別感謝大方的作者🥺。大家喜歡的話也可以買幾組貼圖支持哦~ Kogrey的每一組貼圖都超級可愛又實用,大家趕快買起來~~

可愛的吉娃娃長輩貼圖,輕鬆維繫親友感情

事前準備

Line Notify

一開始接觸Line Notify是因為去年幫Eason寫了一些簡單的股票分析,並需要將結果回傳到群組。但如果需要手動貼上結果的話實在是太累惹,不符合我的作風,因此一開始想要利用Line Bot實現這個功能,但因為Line Bot免費版有著訊息數量的限制,為了傳訊息這個簡單功能付費好像也有點不划算。上網研究後,才發現Line提供了Line Notify這個好用而且免費的api。所以雖然Line Bot的可玩性更強,可以實作出更多有趣的功能,但是在價格以及功能考量下,我覺得Line Notify足以滿足大部份人的簡單需求。

想要使用Line Notify的話,首先要先登錄Line Notify的網站

登錄後可以看到個人頁面與管理登錄服務兩個選項,管理登錄服務可以使Line Notify與外部網站連動。但在今天的分享中不會使用到,我們要使用個人頁面中的發行存取權杖來針對選取的群組發送訊息。

權杖發行畫面

進入個人頁面後,在最下方可以看到發行權杖的選項,按下後就能開始進行個人權杖的設定,權杖名稱是傳送訊息時,通知欄會顯示的名稱,大家可以根據自己的目的進行設置,在此我將它命名為『吉娃娃の祝福』。下方則是選擇要接受訊息的群組,一開始建議選擇一對一聊天進行測試,免得後續程式碼寫錯,造成群組被消息淹沒,最後只能跟機器人一起被踹出群組QQ

務必妥善保存拿到的權杖

接著就能拿到專屬的權杖,權杖只會出現一次,所以要好好保管。我個人會將權杖利用Python的Dict保存起來,同時方便記錄哪個權杖對應哪個群組。
拿到權杖後,就可以開始撰寫程式碼囉~如果想要發送訊息到多個群組,只需要重複執行上述的步驟即可,Line Notify並沒有限制群組與訊息數目,算是蠻佛心的。

圖片分析

接著來分析一下吉娃娃長輩圖的分佈組成,方便後續程式碼的撰寫。將圖片分門別類之後,可以發現吉娃娃長輩圖大致分為六大類別:

吉娃娃長輩圖的六大類別

首先我們可以發現足足有39張貼圖,而且每張都很實用,真的是佛心貼圖╰(⊙д⊙)╮佛心貼圖╭(⊙д⊙)╯,接著可以將相同類別的圖片放在相同的資料夾中,並在稍後的程式碼中加上random,讓程式碼每天可以隨機幫我們挑選圖片。因此我們可以整理出『早安』、『午安』、『晚安』、『日常關心』以及『生日快樂』五個資料夾。而節慶類別中,除了新年之外的節慶都是單張不重複的,因此選擇將『新年』整理為獨立的資料夾,剩下的則是統一整理到『節慶』資料夾中,最後整理出來的圖片資料夾如下圖所示。

根據圖片類別,將圖片存入對應的資料夾

程式思路

材料搜集齊全後,就可以開始構想如何撰寫程式啦~

1.程式執行

一開始原本想說既然是每天的問候語,那就是讓程式執行後,在指定的時間中喚醒就好啦~所以很直覺的想要使用time.sleep()完成這項工作。但後來發現有幾個小缺點。首先,程式需要一直卡在背景執行,會很不方便。如果途中發生其他因素導致程式關閉,還需要人為手動重開,且根據啟動的時機點(例如靠近早上還是晚上),所需要休眠的時間以及對應的基準點都不同。導致完整的判別邏輯變得很長,感覺不是很好懂。而且手動重啟這件事實在是太不酷惹,人要懶惰就是要懶惰到底啊,一定要讓程式可以自己跑到海枯石爛最好。所以最後選擇使用crontab編輯排程,讓程式在我指定的時間中執行,並根據前述整理的貼圖類別,作為程式執行的參數。crontab在Mac os與Linux中都可以使用,剛好符合我平常使用的電腦習慣,如果是windows的用戶,似乎系統就有內建排程工作器惹,感覺會比crontab還要好操作。而crontab的設定將會在稍後的段落中進行說明。

2.早安、午安、晚安以及日常關心

這四個類別屬於每天都需要傳送的圖片,且都擁有多種選擇。所以寫法一致,只會在時間點有所不同,所以屬於相對簡單的部分。只需要將資料夾內的圖檔路徑儲存成List,接著使用亂數從中挑選圖片,就能夠每天看到不同的吉娃娃長輩圖組合惹🥳

3.節慶

節慶的思考花了比較多的時間,因為有些節慶是使用農曆作為基準。幸好LunarSolarConverter 這個Python套件提供了解決方法,讓我們可以藉由國曆的日期換算到農曆日期。根據Github上的說明,原生支援到西元2100年的農曆年換算,應該很夠大家用了吧?!解決農曆的問題後,才發現原來還有母親節需要設定,一開始想說要去算這是五月的第二個週日也太麻煩了吧@@後來才想到,直接在crontab設定就好啦!所以這問題也算是輕鬆解決~

4.生日

生日的程式碼並不困難,原則上跟前面的步驟一致,只是前置步驟比較繁瑣,因為你需要去設定出群組中每個朋友的生日😂。可以使用List單純的紀錄哪一天有人生日,也能夠費工的利用Dict去設定哪一筆生日對應到哪一位朋友,方便進行客製化的生日訊息訂做。但考量到暫時沒那麼多時間,所以我選擇前者用List的方式🤣。把應酬式祝賀交給機器人吧!但如果是摯友,還是親手傳送訊息吧!不要依靠機器人啦!

接著,我們就能進入到實際的程式碼撰寫惹🏃🏻

程式碼撰寫

載入所需模組

在這個程式中,我們所需使用的module如下所示。

載入必須的Module

基本參數設定

綜合前面的設定,我們需要使用者在執行程式碼時給予參數,決定需要發送什麼樣的訊息。因此利用stat這個變數承接使用者輸入的參數。HBD儲存了所有群組成員的生日日期。年月日則是後續陽曆轉陰曆時,所需要使用到的參數。token則是剛剛在Line Notify中所得到的個人權杖,如果今天程式碼的結果需要傳送到多個群組,可以將token儲存為Dict或List,在後續傳送訊息時,將token的部份利用迴圈進行替換即可。

設置基本參數

接下來開始的函數,都會在名為Gwawa_Greet 的函數中執行,函數執行後將會回傳Line Notify所要傳送的訊息以及對應的圖片路徑。

從多張圖片中隨機挑選圖片

首先,許多類別都會有相同功能的圖片,但一股腦全部傳送的話。這份關心會變得跟說金城武帥一樣,太過沈重。因此我們每次只需要從中挑選出一張照片即可,這個段落會以早安部分進行示範。其他地方就是複製貼上,略作修改即可。完整的程式碼將會附在文末。

亂數挑選資料夾中的圖片

節慶的曆制轉換

接著程式碼也需要判斷今天是不是什麼特別的節日,但畢竟不是天天過年的(好希望是…),所以如果今天不是節日,也要回傳相應的資訊,告訴程式不需要傳送訊息到群組。在這裡我們延續前面的例子,並以剛剛結束的元旦跨年以及元宵節進行舉例。而母親節情況特殊,所以我們直接將母親節設為一個獨立的參數‘Mom’,來表示對媽媽的尊重。

生日祝福

生日祝賀的程式碼也與前述大同小異,比較辛苦的部分應該就是前置作業的處理惹,要先記錄群組中每個成員的生日。如果要一次發送到多個群組的話,也可以利用Dict對應到不同的群組成員生日。

Line Notify

最後就是這篇文章的重點啦! 我們要將Gwawa_Greet回傳的資訊,藉由Line Notify的API傳送到群組中。這次使用到的功能為傳送訊息與圖片,此外,Line Notify也支援傳送預設貼圖或是以網址傳送圖片等等的功能,有需要可以參考官方文檔

Line Notify推播設定

看完程式碼之後會發現。嗯…欸…真的蠻簡單的🤣 雖然一開始看了網路上舊的教學,在header填入了更多的資訊,結果反而導致圖片無法傳送(顯示Bad request 400)。如果大家想要更改傳送的訊息,只需要將傳入的message與img進行替換,剩下的部份都能做為模板直接沿用。Line的官方介紹也有更多的相關應用,例如使用樹莓派進行整合,讓樹莓派與Line Notify可以當作小型監視器使用。

最後,完整的Gwawa.py程式碼如下所示,只是實際使用時建議將圖片路徑調整為絕對路徑(示範時用的是相對路徑),有時可以避免掉一些麻煩的問題。

將程式撰寫完成之後,我們可以先使用終端機執行指令,測試看看程式是否能夠順利執行。在終端機中輸入 python3 Gwawa.py Concern,Concern的位置就是對應的stat,也能自由更換成早安或午安等指令進行測試。執行後應該就能在群組看到Line Notify傳送的吉娃娃長輩圖。下一步,我們就要結合Crontab,讓程式在我們指定的時間中自動執行。

在終端機輸入指令進行測試,後面所輸入的資訊將會被視為stat輸入程式中。
成功在群組中收到可愛的吉娃娃長輩圖了!

Crontab — 自動化執行程式

在Linux與Mac OS中,都能夠藉由終端機呼叫出crontab並進行自動化的排程設定。許多crontab的設定方法都可以在這篇文章中找到,所以太過詳細的說明就不贅述惹。

首先在終端機中輸入 crontab -e就可以對crontab進行編輯。在mac os中,預設是以vim模式對文件進行編輯。在此模式下,按i可以對文件進行編輯(此時視窗下方會顯示INSERT)。在編輯模式中,我們需要先定義程式執行的時間,分別是分鐘、小時、日期、月份以及星期幾。接著是設定程式的執行指令,由於今天要執行的是python程式碼,所以要先附上存放Python執行程式的絕對路徑,設定後接續打上程式檔名以及要執行的參數,就能讓電腦在特定的時間自動執行。編輯完成後,按下esc鍵就能結束編輯模式,最後在視窗中按下:wq並按下enter就能儲存並離開視窗。設定完成後,如果終端機顯示crontab : installing new crontab,就代表設定成功囉!用文字說明發現步驟有點多,所以直接看文件設定及影片吧~大家可以直接複製後在編輯模式中貼上。

Crontab文件設定

到這邊就完成所有的步驟啦!每天都能在群組看到可愛的吉娃娃長輩圖向你問好囉~~保證一整天元氣滿滿🥰

後記

第一次寫這樣的分享文章,希望對大家有幫助(雖然程式碼其實很簡單🤣)。Line Notify真的很方便,可以省下很多需要手動傳送訊息的重複過程,像是最早幫Eason寫的股票策略或是本篇的吉娃娃長輩圖等等,其實還有很多各式各樣的應用。寫文章的過程也發現很多自己可以改進的地方,像是利用中文敘事的邏輯,順序的編排等等,希望會慢慢進步囉~

大家如果覺得這篇文章有幫助,就幫我按個拍拍手,當作給拖延症患者的鼓勵吧!如果有任何想法,也歡迎留言給我。最後最後,大家如果喜歡吉娃娃貼圖,那就支持一下吧!

參考資料

--

--

Eason

No human is limited, no limits should be set to human.