기상정보 open api를 shell script와 contab을 설정에 주기적으로 실시간 풍향 풍속 정보를 받아와 mariadb에 저장하도록 구현 하였다.
- 대표 날씨 open api 목록
공공데이터 포털(무료) - https://www.data.go.kr/data/15084084/openapi.do
openweathermap(부분 유료) - https://openweathermap.org/
accuweather(유료) - https://www.accuweather.com/
- 기상 데이터 저장 shell script
#!/bin/sh
# db connect
HOST=localhost
PORT=3306
DB_USER=test
DB_PASSWD=1234
DB_NAME=test
TABLE=weather
# open api
SERVICE_KEY='{token}'
NUM_OF_ROWS='100'
DATA_TYPE='JSON'
BASE_DATE=$(date '+%Y%m%d' -d '40 minute ago')
BASE_TIME=$(date '+%H%M' -d '40 minute ago')
NX='97'
NY='74'
# log
LOG_PATH=/home/test
DATE=$(date "+%Y-%m-%d %H:%M:%S")
SEND_URL="http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst?serviceKey=${SERVICE_KEY}&pageNo=${PAGE_NO}&numOfRows=${NUM_OF_ROWS}&dataType=${DATA_TYPE}&base_date=${BASE_DATE}&base_time=${BASE_TIME}&nx=${NX}&ny=${NY}"
res=$(curl $SEND_URL)
resultCode=$(echo $res | /usr/local/bin/jq .response.header.resultCode)
data=$(echo $res | /usr/local/bin/jq .response.body.items.item)
echo resultCode: $resultCode
if [ $resultCode != "00" ]; then
echo "$DATE get weather success!" >> $LOG_PATH/get-weather.log
vec=$(echo $data | /usr/local/bin/jq .[5].obsrValue)
int=$(echo $vec | sed 's/\"//g')
bd=$(echo $data | /usr/local/bin/jq .[5].baseDate)
bt=$(echo $data | /usr/local/bin/jq .[5].baseTime)
wsd=$(echo $data | /usr/local/bin/jq .[7].obsrValue)
compass=''
if [ $int -ge 0 ] && [ $int -lt 45 ]; then
compass='N'
elif [ $int -ge 45 ] && [ $int -lt 90 ]; then
compass='NE'
elif [ $int -ge 90 ] && [ $int -lt 135 ]; then
compass='E'
elif [ $int -ge 135 ] && [ $int -lt 180 ]; then
compass='SE'
elif [ $int -ge 180 ] && [ $int -lt 225 ]; then
compass='S'
elif [ $int -ge 225 ] && [ $int -lt 270 ]; then
compass='SW'
elif [ $int -ge 270 ] && [ $int -lt 315 ]; then
compass='W'
else
compass='NW'
fi
echo wsd: $wsd
echo vec: $vec
echo compass: $compass
mysql --host=$HOST --port=$PORT --user=$DB_USER --password=$DB_PASSWD $DB_NAME -e "INSERT INTO $TABLE (created_date, modified_date, vec, wsd, compass, nx, ny, base_date, base_time) VALUES(now(), now(), $vec, $wsd, '$compass', '$NX', '$NY', $bd, $bt);"
else
echo "$DATE send url $SEND_URL failed! $res" >> $LOG_PATH/get-weather.log
fi
result code를 체크해 성공과 실패 여부에 따른 log를 생성하도록 설정 하였고, json 파싱은 jq 프로그램을 사용하였다.
- crontab 설정
*/10 * * * * /home/test/get-weather-data-save.sh
기상 데이터가 매 시간 30분마다 생성되고 매시간 40분부터 최신 데이터를 10분마다 제공한다. 그래서 위와 같이 crontab은 10분마다 실행되고, shell script는 현재 시간에서 40분 이전 시간으로 데이터 호출 되도록 설정하였다.
- Windows 서버에서 구현 방법.
https://skyblue-java.tistory.com/4
댓글