我要訂便當 (3): 用 Python + Line Notify 傳送通知
前情提要:
在 我要訂便當(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 我…
我要訂便當系列
- 我要訂便當(1) —— 用 Python + Selenium 控制瀏覽器取得訂單
- 我要訂便當(2) —— 用 Python + Sqlite 儲存訂單
- 我要訂便當(3) —— 用 Python + Line Notify 傳送通知
- 我要訂便當(4) —— 將 Python 腳本部署上 Heroku
- 我要訂便當(5) —— Heroku 填坑小記
參考資料
其他文章
哈囉,如果你也有 LikeCoin,也覺得我的文章有幫上忙的話,還請不吝給我拍拍手呦,謝謝~ ;)