Line氣象通知

 

開發動機

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

常常空氣都不太好

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

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

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

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

早上起床這樣也比較舒服

 

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

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

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

提醒大家出門要戴口罩

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

想弄個自動通知的Micro Service

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

 

Demo

先看一下Demo結果

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

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

 

需求

想了幾天後

我歸納出以下幾個需求

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

 

空氣盒子截圖

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

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

還是全台不好

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

主要使用puppeteer的mouse movescreenshot功能

 

氣象局鄉鎮預報

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

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

所以就串了氣象局的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