본문 바로가기
linux 서버 시스템

Shell Script Open Api 호출 MariaDB insert

by @물비늘 2022. 11. 24.

기상정보 open api를 shell script와 contab을 설정에 주기적으로 실시간 풍향 풍속 정보를 받아와 mariadb에 저장하도록 구현 하였다.

 

 

  • 대표 날씨 open api 목록

공공데이터 포털(무료) - https://www.data.go.kr/data/15084084/openapi.do

 

기상청_단기예보 ((구)_동네예보) 조회서비스

초단기실황, 초단기예보, 단기((구)동네)예보, 예보버전 정보를 조회하는 서비스입니다. 초단기실황정보는 예보 구역에 대한 대표 AWS 관측값을, 초단기예보는 예보시점부터 6시간까지의 예보를,

www.data.go.kr

 

openweathermap(부분 유료) - https://openweathermap.org/

 

Сurrent weather and forecast - OpenWeatherMap

Access current weather data for any location on Earth including over 200,000 cities! The data is frequently updated based on the global and local weather models, satellites, radars and a vast network of weather stations. how to obtain APIs (subscriptions w

openweathermap.org

 

accuweather(유료) - https://www.accuweather.com/

 

지역, 전국, 세계 일일 날씨 예보 | AccuWeather

AccuWeather has local and international weather forecasts from the most accurate weather forecasting technology featuring up to the minute weather reports

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

 

PowerShell Open Api 호출 MariaDB insert

파워셸 실행 권한 체크 파워셸에서 ExecutionPolicy 명령어 입력. "Restricted" 라는 결과가 나온다면 스크립트 코드를 제한한다는 의미입니다 실행권한부여 Set-ExecutionPolicy Unrestricted 또는 Set-ExecutionPolic

skyblue-java.tistory.com

 

댓글