再開一系列紀錄工作中學的、玩的、聽到的
前言
如果廣告中能即時show出距離自己最近測站的溫度,是不是有很炫的感覺(? 其實還好….)
不過既然有opendata可以用,能延伸的應(ㄌ一ㄢˋ)用(ㄍㄨㄥ)蠻多的
像是….
- 搭配昱廷教過的LineBot可以做一隻天氣機器人,查詢天氣或是看天氣預報
- 寫一個天氣app
- blablabla
在廣告中,像是冷氣或是風扇,和溫度調節有關的產品,有時候會有串天氣資料或是根據即時溫度決定是否投放該則廣告。
氣象局資料
氣象資料開放平台 寫得蠻清楚的!
(可以選擇氣象會員登入 or Facebook會員登入)
資料提供兩種方式取用:
-
網站下載,有JSON和XML格式
-
API下載
// 範例 https://opendata.cwb.gov.tw/fileapi/v1/opendataapi/{dataid}?Authorization={apikey}&format={format}
Authorization:登入會員就可以取得授權碼,必填!
by Postman測試示意
shell script
新人守則裡提到 shell script 需要略懂略懂,所以選擇使用shell script來做搭配
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
可能會長得像這樣
格式為
分 時 日 月 星期幾 指令
分: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
串串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
注意事項
這篇Linux crond 不執行原因分析 ,整理很多原因
自己這次剛好就遇到了兩個…..執行script ok, 透過cron 就不成功
1. 指令找不到
在用cron job執行時, 可能會出現指令找不到的錯
因為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