Line氣象通知

2018/12/31

專案連結:https://github.com/ciao-chung/line-weather-notify

\n

開發時間:2018年12月

\n

 

\n

Screenshot_20181229-113205_LINE.jpg

\n

 

\n

開發動機

\n

冬天這陣子中南部因為大陸的空污以及地形造成的空污滯留

\n

常常空氣都不太好

\n

所以這陣子常用空氣盒子來看空氣品質

\n

空氣盒子滿方便的有出Web跟App版

\n

我習慣早上起床看一下空氣盒子

\n

如果都是綠色的我就會把窗戶全開讓空氣流動

\n

早上起床這樣也比較舒服

\n

 

\n

每天早上起床都做點開空氣盒子的動作實在有點覺得麻煩

\n

而且有時候空氣比較差的時候

\n

我會截圖然後傳到家人的Line群組

\n

提醒大家出門要戴口罩

\n

久了以後就覺得重複性太高有點麻煩

\n

想弄個自動通知的Micro Service

\n

底層的話仍然是使用我最熟悉的Node.js來實做所有功能

\n

 

\n

Demo

\n

先看一下Demo結果

\n

此影片為開發模式所以有關閉puppeteer的headless(方便debug)

\n

在正式機上則是啟用headless模式

\n
\n

 

\n

需求

\n

想了幾天後

\n

我歸納出以下幾個需求

\n

並希望能夠每天固定幾個時間都自動發通知到Line群組中

\n

 

\n

空氣盒子截圖

\n

我希望能截一張全台、一張台中

\n

讓看的人清楚知道今天是單一地方空氣不好

\n

還是全台不好

\n

至於實做我就使用puppeteer的headless模式來操作chrome

\n

主要使用puppeteer的mouse movescreenshot功能

\n

 

\n

氣象局鄉鎮預報

\n

我是想說既然要送空氣品質的截圖了

\n

那就順便連一些簡單的天氣預報資料都一併發一發好了

\n

所以就串了氣象局的Open Data API

\n

取得指定鄉鎮的一些預測資料

\n

像是溫度、降雨率或是風向

\n

取資料的實做我就直接使用axios來發Rest API

\n

 

\n

可用性

\n

考慮到這個服務的可用性

\n

不能只將空氣盒子截圖還有氣象預報限制在單一區域

\n

因此在我提供用設定檔來操作空氣盒子的截圖

\n

也能設定多個縣市、鄉鎮的氣象預報(包含預報欄位)

\n

 

\n

主要使用技術、工具

\n\n

 

\n

Line Notify API

\n

這個算是Line提供的一個Notify機制

\n

跟Line Message API不太一樣

\n

Message API是可以跟User做雙向的互動

\n

而Notify API則是單向通知

\n

透過Line官方一個叫Line Notify的帳號來做通知

\n

重點是它免費(Message API好像只有開發人員帳號是免費)

\n

 

\n

最重要的是

\n

實做通知起來很簡單

\n

登入Line Notify管理頁後建立一個token

\n

如果發訊息的對象是一個群組的話

\n

要將Line Notify帳號加入群組中

\n

再拿這個token直接發Rest API就可以發訊息了

\n

而我這個服務直接用curl一行像是這樣就能發訊息

\n
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"
\n

實做Line通知真的算很方便

\n

 

\n

官方文件

\n

 

\n

中央氣象局Open Data API

\n

這部份使用的是中央氣象局的資料開放平台

\n

一樣也是註冊一個Token(他們平台叫做會員授權碼)

\n

就能針對各種氣象資料做存取

\n

 

\n

另外今年串氣象局的API時候才發現他們有改版

\n

平台跟文件算是好很多

\n

在大學時期串過一次

\n

那時候真的不太好用

\n

文件也不太清楚

\n

現在平台上還可以直接設定欄位跟資料直接抓資料測試

\n

不過吐的資料結構還是滿可怕的

\n

抓回來後還是花了點時間整理資料

\n

 

\n

排程通知

\n

目前使用情境是每天早上九點、下午兩點通知一次

\n

排程則是使用我的另一個專案cron-service來管理

\n

大概像是這樣寫個json就能管理了

\n
{\n  "jobs": {\n    "lineWeather": {\n      "name": "Line氣象通知(每天0900、1400)",\n      "schedule": ["0 0 9 * * *", "0 0 14 * * *"],\n      "commands": [\n        {\n          "command": "line-weather-notify --config=/path/to/config.json",\n          "description": "啟動Line Weather Notify"\n        }\n      ],\n      "notify": ["line"]\n    }\n  }\n}
\n

 

\n

佈署

\n

為了佈署方便

\n

我將這個服務發佈到npm上

\n

使用yarn就能將它裝起來

\n

並直接使用CLI操作

\n
# installation\nyarn global add line-weather-notify\n\n# run service\nline-weather-notify --config=/path/to/config/file\n
\n

 

\n

更多設定檔設定、說明請看我的Repo

\n

 

\n
\n
 
\n