2022年6月8日 星期三

Python 學習筆記 : Line Notify 訊息推播 (一) : 文字

周一在張佑成老師的線上課程上學會用 Line Notify 推播訊息的方法, 用法比 Line Bot 要簡單得多, 首先是要到 Line 官網取得使用 Line Notify API 的 token (權杖或通行碼) 並指定接收者或群組, 然後在 Python 程式中以此 token 為憑向 Line Notify 伺服器發出要推播的訊息即可. Line Notify 是免費服務, 但每個權杖每小時只能發出 1000 則訊息. 參考 Line Notify API 文件 :


課堂上老師是以偵測台股今日收盤價與昨日相比若下跌就傳送提醒訊息為例, 但這範例會用到爬蟲與 Python + Excel 操作, 為了簡化 Line Notify 的用法說明, 以下用手動執行傳送動作為例. 


1. 登入 Line Notify 官網產生權杖 :

Line Notify 的官網與 Line 首頁不同, 網址如下 : 





按右上方的 "登入", 用自己的 Line 帳號 (email) 與密碼登入 : 




帳密若正確會顯示一組 4 碼的認證碼例如 : 




這時該 Line 帳號所在裝置 (例如手機) 之 Line App 會自動開啟顯示認證頁面, 必須在三分鐘內輸入上面那個認證碼 :



 
認證完成後 Line Notify 頁面才會進入登入狀態 (右上角的 '登入' 變成 Line 帳戶名稱).

 


然後將頁面拉到最底下的 "發行存取權杖 (開發人員用)", 按 "發行權杖" 鈕 : 



在彈出的頁面中, 於 "請填寫權杖名稱" 欄中填入一個代表此推播的權杖名稱 (可任意取名, 會顯示在接收者收到的訊息最前面), 然後在底下的聊天室選單中點選 "透過 1 對 1 聊天接收 Line Notify 的通知" 那個, 再按最底下的 "發行" 即可 : 




結果會彈出一個頁面, 上方會顯示所發行的權杖 (token), 按底下的 "複製" 鈕將其複製到剪貼簿, 然後開啟一個記事本將此 token 貼上後存檔給後續的 Python 程式使用 : 




注意, 這個 token 如果沒記下來的話一按 "關閉" 就無法查到, 必須重新發行, 上面的過程要重來一遍. 建立權杖後在 Line Notify 個人頁面最上方的 "已連動的服務" 中就會出現連動的對象 :




如要刪除此連動關係 (即刪除推播), 只要按右邊的 "解除" 即可. 


2. 撰寫 Python 程式推播訊息 :

呼叫 Line Notify 服務來推播訊息是透過 HTTPS 的 POST 方法向 Line Notify API 伺服器提出請求, 並將要傳送的訊息放在訊息內容 params 參數的 message 鍵中即可, Line Notify 伺服器會從 header 中取得 token 來辨識發送者並找出其傳送對象, 其程式碼非常制式, 可以寫成如下的自訂函式 notify()  :

import requests   

def notify(msg, token):
    url="https://notify-api.line.me/api/notify"                          # Line Notify API 網址
    headers={"Authorization": "Bearer " + token}                   # HTTPS 表頭
    payload={"message": msg}                                                # HTTPS 承載 (內容)
    r=requests.post(url, headers=headers, params=payload)    # 提出 POST 請求
    return "訊息發送成功!"

其中第一參數 msg 為欲推播之訊息字串; 第二參數 token 是所申請的權杖, 只要呼叫 notify() 並傳入這兩個參數, 就會向指定對象傳送訊息, 例如 : 

>>> import requests     
>>> def notify(msg, token):
    url="https://notify-api.line.me/api/notify"   
    headers={"Authorization": "Bearer " + token}     
    payload={"message": msg}     
    r=requests.post(url, headers=headers, params=payload)         
    return "訊息發送成功!"        

>>> token='ud7PaDL45fz849A0e1f4oaMCbRIkxMXapQCt3-------'      
>>> msg='你好嗎?'       
>>> notify(msg, token)     
'訊息發送成功!'
>>> msg='Hello World!'     
>>> notify(msg, token)     
'訊息發送成功!'
>>> msg='你在說哈囉嗎?'      
>>> notify(msg, token)         
'訊息發送成功!'
>>> msg='\nHello Tony!'     
>>> notify(msg, token)    
'訊息發送成功!'

下面是指定接收者手機 Line 的截圖 : 




可見指定接收者會收到名為 Line Notify 者轉送來的訊息, 注意, 傳送的訊息會緊跟在推播權杖名稱後面, 如果要換列顯示訊息只要在訊息最前面加上 '\n' 強制換列即可. 實務上可將此 Python 程式用例如 crontab 的定時觸發機制執行, 當條件符合時 (例如股價到價時) 呼叫 notify() 送出訊息.  


3. 解除連動 (刪除權杖) :

如果要刪除這個一對一 Line Notify 訊息推播, 只要按 Line Notify 個人網頁上已連動服務右邊的解除即可 : 





解除連動後該 token 即失效, 無法再使用. 


4. 推播訊息到群組 :

上面在發行權杖時選擇的訊息接受者為個人 (1 對 1), 其實推播對象也可以是群組, 但這群組必須先邀請 "Line Notify" 加入群組才能順利推播, 下面以我的個人群組 Snowball 為例說明 :

首先進入 Line 群組後點上方的 "邀請+" 鈕 : 




點選底下的 "Line Notify" 後再按右上角的 "邀請" :




這時檢查手機的群組會發現 "Line Notify" 已加入此 Snowball 群組內了 : 




接下來就可以為連動至此群組來申請權杖了, 過程與上面一樣, 只是不要選 "1 對 1", 而是要選欲推播之群組 : 





注意, 此處是選群組 Snowball 來產生權杖. 按 "複製" 將此權杖先存到記事本後按 "關閉", 這時個人頁面的已連動服務就會出現 Snowball 群組了 :




將上面複製的權杖貼到程式的 token 變數進行測試 : 

>>> token='GqLl4am2GvkCo4FT8hOe6sdt5KwWIFk0pmsE-------'   
>>> msg='\nHello Tony!'    
>>> notify(msg, token)     
'訊息發送成功!'
>>> notify(msg, token)    
'訊息發送成功!'
>>> msg='你在說哈囉嗎?'    
>>> notify(msg, token)    
'訊息發送成功!'

結果如下 :



 
可見訊息已傳到 Snowball 群組中了. 



2022-06-30 補充 :

今天找到下面這個用 Google 試算表結合 Line Notify 的範例, 等我有空要練 GAS 時再來研究 :


另外 Line Notify 也可以傳送圖片, 參考 :


沒有留言 :