再開一系列紀錄工作中學的、玩的、聽到的

前言

如果廣告中能即時show出距離自己最近測站的溫度,是不是有很炫的感覺(? 其實還好….)

不過既然有opendata可以用,能延伸的應(ㄌ一ㄢˋ)用(ㄍㄨㄥ)蠻多的

像是….

  • 搭配昱廷教過的LineBot可以做一隻天氣機器人,查詢天氣或是看天氣預報
  • 寫一個天氣app
  • blablabla

在廣告中,像是冷氣或是風扇,和溫度調節有關的產品,有時候會有串天氣資料或是根據即時溫度決定是否投放該則廣告。


氣象局資料

氣象資料開放平台 寫得蠻清楚的!

(可以選擇氣象會員登入 or Facebook會員登入)

資料提供兩種方式取用:

  • 網站下載,有JSON和XML格式

  • API下載

    也有swagger使用說明

    // 範例
    https://opendata.cwb.gov.tw/fileapi/v1/opendataapi/{dataid}?Authorization={apikey}&format={format}
    

    Authorization:登入會員就可以取得授權碼,必填!


    by Postman測試示意

    cwb-api


shell script

新人守則裡提到 shell script 需要略懂略懂,所以選擇使用shell script來做搭配


Curl

Curl用法

如同TechBridge的文章:Linux Curl Command 指令與基本操作入門教學

“Curl 是Linux上透過HTTP Protocol 下載和上傳檔案的指令”

// 基本發request
curl https://example.com
curl ftp://www.example.com

結果會在terminal上顯示 , maybe HTML,JSON,XML…


使用curl抓回氣象觀測資料

// 將{key}替換成授權碼
curl https://opendata.cwb.gov.tw/api/v1/rest/datastore/O-A0003-001?Authorization={key}


其他

// 帳密
curl -u name:passwd http://xxx.xxx

// 將response另存
curl -o filename https://xxx.xxx.xxx
curl -O https://xxx.xxx.xxx 直接使用原始檔名



crontab

cron用來管理工作排程,按照設定的時間執行

// 查看目前排程
crontab -l
// 編輯排程
cronta -e


可能會長得像這樣

cron list


格式為

分 時 日 月 星期幾 指令

分:0~59
時:0-23
日:1-31
月:1-12 (英文也可,ex:Jan)
星期:0-6 (日為0 or 7,六為6, 英文亦可,ex:Sun)
指令: 要執行的command


特殊字元包含

*任意時刻

,分隔不同時間

-時間區間

/n間隔


Ex:

// 每天的8:30執行
30 08 * * * /script.sh

// 每個禮拜天的8:30執行
30 08 * * 0 /script.sh

// 每10分鐘執行一次
*/10 * * * * /script.sh

// 9點到18點 整點執行
00 09-18 * * * /script.sh


懶得記也有線上的排程器可以用:crontab guru

key入時間格式, 顯示下一次的執行時間


cron jobs每次執行預設都會寄信給執行任務的使用者

如果不想寄信可以在cron job後面加上>/dev/null 2>&1

// 範例
5 * * * * /bin/sh /usr/local/temp/xxxx.sh &> /dev/null

>代表重定向

/dev/null 代表空裝置

可以解釋成將程式中的output輸出到/dev/null空裝置

output包含standard error(2) and standard out(1)

也就是不輸出任何資料到terminal

參考unix-stackexchange說明


串串API

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
echo "`curl 'https://opendata.cwb.gov.tw/api/v1/rest/datastore/O-A0003-001?Authorization={key}'`" | /usr/local/bin/jq  '.success'> status


if grep -c 'true' status;  then
   curl 'https://opendata.cwb.gov.tw/api/v1/rest/datastore/O-A0003-001?Authorization={key}' | /usr/local/bin/jq  '.records.location'> /Users/pon.peng/ad_tech_work/2020/06/checkLastChange/weather/temp.json
   date >> /Users/pon.peng/ad_tech_work/2020/06/checkLastChange/weather/temp.log
   echo 'success'

else
   echo 'fail'
   date >> /Users/pon.peng/ad_tech_work/2020/06/checkLastChange/weather/temp_fail.log
fi
rm status

例如這隻用來抓觀測資料的script

如果get Data成功,response中success值會是true

用這個來判斷下載資料是否成功

  • 成功

    將response 利用jq 轉成json

    將測站資料(location存進temp.json)

    並將當下時間output到temp.log

  • 失敗

    將當下時間output到temp_fail.log


註:jq command

注意事項

這篇Linux crond 不執行原因分析 ,整理很多原因

自己這次剛好就遇到了兩個…..執行script ok, 透過cron 就不成功


1. 指令找不到

在用cron job執行時, 可能會出現指令找不到的錯

參考設定 $PATH 路徑環境變數

因為Linux執行指令時, 如果只輸入指令名稱, 而沒有完整指令路徑 ,系統會在$PATH變數設定的目錄底下搜尋相關指令


修改方式:

  • 自訂目錄路徑到$PATH變數中

    (重開機即失效)

or

  • 編輯使用者的 .bash_profile

    (重新開機即生效)

設定完可以echo $PATH做確認


2.絕對路徑/相對路徑

要執行的code, 要寫絕對路徑

*/10 * * * * sh /Users/pon.peng/ad_tech_work/2020/06/checkLastChange/weather/get_temp.sh > /dev/null 2>&1

而且get_temp.sh中, 也都要寫絕對路徑


或是先cd 切換到目錄, 再執行code

30 * * * * cd //Users/pon.peng/ad_tech_work/2020/06/checkLastChange/weather/ && ./get_temp.sh


延伸閱讀&參考圖文

Linux Curl Command 指令與基本操作入門教學

Linux 設定 crontab 例行性工作排程教學與範例

crontab環境變數設定

Scheduling Cron Jobs with Crontab