Line氣象通知
專案連結:https://github.com/ciao-chung/line-weather-notify
開發時間:2018年12月
開發動機
冬天這陣子中南部因為大陸的空污以及地形造成的空污滯留
常常空氣都不太好
所以這陣子常用空氣盒子來看空氣品質
空氣盒子滿方便的有出Web跟App版
我習慣早上起床看一下空氣盒子
如果都是綠色的我就會把窗戶全開讓空氣流動
早上起床這樣也比較舒服
每天早上起床都做點開空氣盒子的動作實在有點覺得麻煩
而且有時候空氣比較差的時候
我會截圖然後傳到家人的Line群組
提醒大家出門要戴口罩
久了以後就覺得重複性太高有點麻煩
想弄個自動通知的Micro Service
底層的話仍然是使用我最熟悉的Node.js來實做所有功能
Demo
先看一下Demo結果
此影片為開發模式所以有關閉puppeteer的headless(方便debug)
在正式機上則是啟用headless模式
需求
想了幾天後
我歸納出以下幾個需求
並希望能夠每天固定幾個時間都自動發通知到Line群組中
空氣盒子截圖
我希望能截一張全台、一張台中
讓看的人清楚知道今天是單一地方空氣不好
還是全台不好
至於實做我就使用puppeteer的headless模式來操作chrome
主要使用puppeteer的mouse move與screenshot功能
氣象局鄉鎮預報
我是想說既然要送空氣品質的截圖了
那就順便連一些簡單的天氣預報資料都一併發一發好了
所以就串了氣象局的Open Data API
取得指定鄉鎮的一些預測資料
像是溫度、降雨率或是風向
取資料的實做我就直接使用axios來發Rest API
可用性
考慮到這個服務的可用性
不能只將空氣盒子截圖還有氣象預報限制在單一區域
因此在我提供用設定檔來操作空氣盒子的截圖
也能設定多個縣市、鄉鎮的氣象預報(包含預報欄位)
主要使用技術、工具
Line Notify API
這個算是Line提供的一個Notify機制
跟Line Message API不太一樣
Message API是可以跟User做雙向的互動
而Notify API則是單向通知
透過Line官方一個叫Line Notify的帳號來做通知
重點是它免費(Message API好像只有開發人員帳號是免費)
最重要的是
實做通知起來很簡單
登入Line Notify管理頁後建立一個token
如果發訊息的對象是一個群組的話
要將Line Notify帳號加入群組中
再拿這個token直接發Rest API就可以發訊息了
而我這個服務直接用curl一行像是這樣就能發訊息
curl -X POST -i https://notify-api.line.me/api/notify -H "Authorization: Bearer AccessToken" -H "Content-Type: multipart/form-data" -F "message=我是訊息" -F "imageFile=@/path/to/photo"
實做Line通知真的算很方便
中央氣象局Open Data API
這部份使用的是中央氣象局的資料開放平台
一樣也是註冊一個Token(他們平台叫做會員授權碼)
就能針對各種氣象資料做存取
另外今年串氣象局的API時候才發現他們有改版
平台跟文件算是好很多
在大學時期串過一次
那時候真的不太好用
文件也不太清楚
現在平台上還可以直接設定欄位跟資料直接抓資料測試
不過吐的資料結構還是滿可怕的
抓回來後還是花了點時間整理資料
排程通知
目前使用情境是每天早上九點、下午兩點通知一次
排程則是使用我的另一個專案cron-service來管理
大概像是這樣寫個json就能管理了
{
"jobs": {
"lineWeather": {
"name": "Line氣象通知(每天0900、1400)",
"schedule": ["0 0 9 * * *", "0 0 14 * * *"],
"commands": [
{
"command": "line-weather-notify --config=/path/to/config.json",
"description": "啟動Line Weather Notify"
}
],
"notify": ["line"]
}
}
}
佈署
為了佈署方便
我將這個服務發佈到npm上
使用yarn就能將它裝起來
並直接使用CLI操作
# installation
yarn global add line-weather-notify
# run service
line-weather-notify --config=/path/to/config/file
更多設定檔設定、說明請看我的Repo