前情提要:

我要訂便當(1) —— 用 Python + Selenium 控制瀏覽器取得訂單 中,我們嘗試了用 Selenium 控制瀏覽器去取回訂便當團購網的訂單內容

而在 我要訂便當(2) —— 用 Python + Sqlite 儲存訂單 中,我們使用 Sqlite 達到將訂單儲存起來以判斷是否有新的訂單,因此這邊的下一步就是需要進行通知。

目標:使用 Line Notify,當有新訂單的時候就發送通知

Line Notify 是 Line 上面的通知服務,不像 Line@ 一樣可以有品牌有互動等等,Line Notify 純粹就是訊息通知;但同時對比 Line@ 最近吵得沸沸揚揚的收費和大量跳槽,Line Notify 則是免費的服務。

Line Notify 的運作上分為發送訊息和接受訊息。當我們使用 Line 帳號申請 Line Notify 的服務後就可以得到一個 Access Token,藉由這組 Access Token 就能夠讓我們的程式和服務去發送通知。這些通知會由一個叫做 LINE Notify 的官方帳號發送給有訂閱這個通知的人。

基於這個工作原理,像是需要經營品牌的服務就不太適合 Line Notify,反之像是伺服器斷線、設備超載等等這些個人通知性質比較高的服務就很適合使用 Line Notify。這點從 Line Notify 網頁 下方的示意圖也可以略知一二。

當然像我們這次的需求是「如果有新的團購便當 就 通知我」,相當符合使用場景,因此這邊就嘗試使用看看並記錄下來。

如果需要更多 Line Notify 的說明,保哥的這篇 上手 LINE Notify 不求人:一行代碼都不用寫的推播通知方法 介紹的更為完整,推薦參閱。當然,也可以閱讀 Line Notify 官方文件。那麼,我們開始吧~

申請 Line Notify

首先先到 Line Notify 的頁面右上角登入

登入之後,從右上角選擇 個人頁面

接著可以看到下面這個畫面:如果已經有申請過權杖或服務,就會顯示在上半部分的「已連動的服務」 而我們現在需要的是下方的發行權杖

接著進到選擇通知視窗的畫面,在這邊可以選擇是直接通知你自己 或是將通知傳送到某個群組

選擇通知對象之後,就會顯示存取用的 Token。由於這組 Token 只會顯示一次,請自己複製下來存好!

存取完畢後就可以看到這次申請的服務已經加到已連動的服務囉

並且 Line 也會跳出已連動的通知

到這邊就算是申請完畢了,接下來就要來測試一下是否能發送。

發送 Line Notify

這邊測試的 Code 主要參考 使用 Python 實作發送 LINE Notify 訊息 - Bustle C.,感謝前人的足跡。

import requests

def lineNotifyMessage(token, msg):
    headers = {
        "Authorization": "Bearer " + token, # 權杖,Bearer 的空格不要刪掉呦
        "Content-Type": "application/x-www-form-urlencoded"
    }

    payload = {'message': msg}
    
    # Post 封包出去給 Line Notify
    r = requests.post(
        "https://notify-api.line.me/api/notify",
        headers=headers, 
        params=payload)
    return r.status_code

message = 'Line Notify 測試'
token = '把你的 Token 放在這'
result = lineNotifyMessage(token, message)
print(result) # 印一下回傳代碼

執行 py 檔之後就可以收到訊息囉!

如果回傳成功,r.status_code 就會顯示 200;而如果像是 Token 已經被撤銷等,則會得到 401

關於 200, 401.. 這些回傳的狀態碼,可以參閱 HTTP Status

另外當然也可以傳送圖片或貼圖,請參閱 自建 LINE Notify 訊息通知 - Oxxo studio

和訂便當腳本結合

接著我們就將這個寄發 Line Notify 的 Function 給放回我們之前的訂便當腳本中。並在發現訂單異動的部分去呼叫 lineNotifyMessage 來通知我們

# ...
print("偵測到訂單變動!")
# 做點通知的事
message = "訂單已變動,請到 https://dinbendon.net/ 確認!"
result = lineNotifyMessage(token, message)
print_order(order)
# ...

打完收工!接著不管是要 比對新舊訂單並發送這次新的訂單資訊;或者是要順便發送目前的訂單數量等等,都是只差在訊息內容的修改而已(我是直接發送 ",".join(orderList) 來看目前有哪些訂單)屆此已經可以宣告收工囉。

心得

在像這種單純通知的場合中,Line Notify 有架設簡單、即時方便的特性。並且也已經提供了和 Github 等連接的服務,因此像是伺服器斷線或是有新的提取要求、甚至是爬蟲去看手遊有沒有新活動時,都可以考慮建立一個群組並用 Line Notify 來達到低成本推播的要求,可謂相當方便!希望將來能再回來抄自己這篇把各種推播提醒都拉到 Line Notify 集中管理,不然除了機器人也不會有人 Line 我…

我要訂便當系列

參考資料