기상청 날씨정보 파싱 소스
1. 기상청 날씨 정보를 파싱해서 사이트에 효과를 줘보자.
2. 매번 파싱을 하게 되면 사이트 속도가 느려지므로 (생각보다 기상청이 느리다..) 캐시를 설정해서 사이트 이용에 지장이 없게 하자.
<?php
//기상청 날씨 정보 파싱
//캐시 설정
// 캐시 이름
$w_cache_key = "weather_kma";
//캐시 간격 = 15분
$w_cache_time = 15;
$oCacheHandler = CacheHandler::getInstance();
//캐시가 사용 가능하고 캐시 간격이 남아 있으면 ~
if($w_cache_time && $oCacheHandler->isSupport() && $oCacheHandler->isValid($w_cache_key,$w_cache_time))
{
//캐시 정보를 가져온다.
$weather = $oCacheHandler->get($w_cache_key,$w_cache_time);
}
// 만약 캐시가 없다면...
else
{
//타겟 기상청 RSS (서울?) 이던가.. 전국이던가...
$url = "http://www.kma.go.kr/wid/queryDFS.jsp?gridx=67&gridy=108";
// xml로 파싱
$xml = simplexml_load_file($url);
//예보 시간
$weather = sprintf('%d',$xml->header->tm);
if(count($xml->body->data) > 1)
{
//가장 최신의 날짜 정보를 저장한다.
//온도 (단위: 섭씨)
$weather .= sprintf(',%s',$xml->body->data[0]->temp);
//날씨예보 = 눈, 비, 눈/비, 맑음, 흐림 등등등
$weather .= sprintf(',%s',$xml->body->data[0]->wfKor);
}
//캐시를 사용할 수 있으면~
if($oCacheHandler->isSupport())
{
//캐시에 저장
$oCacheHandler->put($w_cache_key, $weather, $w_cache_time * 60);
}
}
//캐시든 파싱이든 가져온 날짜 정보를 ,로 구분하여 배열로 ~
$_weather = explode(',',$weather);
//메타 정보에 날짜 정보를 넣기 위한 작업 - 삭제해도 됨 단순 테스트 목적
foreach($_weather as $k => $v)
{
if($k == 0)
{
$weatherMeta = zDate($v,'Y-m-d H:i:s');
}
else
{
$weatherMeta .= ', '.$v;
}
}
Context::addMetaTag('weather', $weatherMeta);
// 여기까지 메타를 위한
//날짜 정보가 있으면 각각 구분하여 변수로 할당해주자...
if(count($_weather))
{
$time = $_weather[0]; // 예보 시각
$temp = $_weather[1]; //현재온도
$weat = $_weather[2]; //날씨상태(맑음,구름조금,구름많음,흐림,비,눈/비,눈)
}
//여기서 부터 활용..! 날씨 상태에 눈이라는 단어가 있다면 snowly 변수룰 설정하고 true를 주자..
if(preg_match('/눈/',$weat))
{
Context::set('snowly',true);
}
//활용은 레이아웃이든.. if 문이나 cond를 사용하여 snowly가 true면 눈내리는 효과를 뿌리면 된다. 끝.
?>
//기상청 날씨 정보 파싱
//캐시 설정
// 캐시 이름
$w_cache_key = "weather_kma";
//캐시 간격 = 15분
$w_cache_time = 15;
$oCacheHandler = CacheHandler::getInstance();
//캐시가 사용 가능하고 캐시 간격이 남아 있으면 ~
if($w_cache_time && $oCacheHandler->isSupport() && $oCacheHandler->isValid($w_cache_key,$w_cache_time))
{
//캐시 정보를 가져온다.
$weather = $oCacheHandler->get($w_cache_key,$w_cache_time);
}
// 만약 캐시가 없다면...
else
{
//타겟 기상청 RSS (서울?) 이던가.. 전국이던가...
$url = "http://www.kma.go.kr/wid/queryDFS.jsp?gridx=67&gridy=108";
// xml로 파싱
$xml = simplexml_load_file($url);
//예보 시간
$weather = sprintf('%d',$xml->header->tm);
if(count($xml->body->data) > 1)
{
//가장 최신의 날짜 정보를 저장한다.
//온도 (단위: 섭씨)
$weather .= sprintf(',%s',$xml->body->data[0]->temp);
//날씨예보 = 눈, 비, 눈/비, 맑음, 흐림 등등등
$weather .= sprintf(',%s',$xml->body->data[0]->wfKor);
}
//캐시를 사용할 수 있으면~
if($oCacheHandler->isSupport())
{
//캐시에 저장
$oCacheHandler->put($w_cache_key, $weather, $w_cache_time * 60);
}
}
//캐시든 파싱이든 가져온 날짜 정보를 ,로 구분하여 배열로 ~
$_weather = explode(',',$weather);
//메타 정보에 날짜 정보를 넣기 위한 작업 - 삭제해도 됨 단순 테스트 목적
foreach($_weather as $k => $v)
{
if($k == 0)
{
$weatherMeta = zDate($v,'Y-m-d H:i:s');
}
else
{
$weatherMeta .= ', '.$v;
}
}
Context::addMetaTag('weather', $weatherMeta);
// 여기까지 메타를 위한
//날짜 정보가 있으면 각각 구분하여 변수로 할당해주자...
if(count($_weather))
{
$time = $_weather[0]; // 예보 시각
$temp = $_weather[1]; //현재온도
$weat = $_weather[2]; //날씨상태(맑음,구름조금,구름많음,흐림,비,눈/비,눈)
}
//여기서 부터 활용..! 날씨 상태에 눈이라는 단어가 있다면 snowly 변수룰 설정하고 true를 주자..
if(preg_match('/눈/',$weat))
{
Context::set('snowly',true);
}
//활용은 레이아웃이든.. if 문이나 cond를 사용하여 snowly가 true면 눈내리는 효과를 뿌리면 된다. 끝.
?>
레이아웃 가장 상단에 배치하면 되겠다.
xe 관련 함수 사용이 있으므로 XE 안에서 돌아가거나 config.inc.php 파일을 불러와야 한다.
댓글 26
위젯 쓰실분은 이거 써보시고 피드백 주세요☺
피드백 : 좋음!
근데 다소 희망사항은 지금은
내일날씨를 보여주는데요....
현재시간 부터 간격단위로 내일의 현시간 까지 날씨를 보여주면 좋겠다는 생각을 볼때마다 합니다.
왜냐면 오전 오후 저녁 이렇게 날씨가 변하는 케이스가 종종 있는데 내일날씨 밖에 확인이 안되니 좀 애매한 거 같아요.
원하시는 항목들이 출력 될거에요..
문제가 ㅠㅠ 제가 디자인을 정말 못합니다..
그림만으로라도 디자인을 해주시면 스킨으로 만들어 올리겠습니다.
나중에 한번 해보겠습니다!
딱! 쿠플존 스킨은 원하시는대로 뜹니다.
모양도 더 예쁠거에요 ㅎㅎ
지역은 두 개 넣을 수 있는데 하나만 넣으셔도 돼요.한 개 지역만 넣으면 뭔가 문제가 있네요.. 저녁에 살펴봐야 할거 같아요.xetown 에서 받으시려면 https://xetown.com/xepoint/105171 여기입니다.
전국 중기예보는 안될까요?
지역별로 하나하나 모두 넣기가 좀 많아서요. ^^;
저는 전국날씨를 다 봐야하는 사진사이트라서요...ㅎㅎ 고쳐서 쓸 능력은 안됍니다^^
시간 될 때 한번 해볼게요 @.@...
https://github.com/misol/soo_kma_rss/releases/tag/0.3 또는 https://xetown.com/xepoint/104966 에서 다운로드 받으실 수 있습니다.
미솔님 발표시간이 01/01 09:00 표기되네요.
날씨는 제대로 잘 나옵니다
https://github.com/misol/soo_kma_rss/releases/tag/0.3.1 에서 받으실 수도 있습니다.
호스팅에서는 경우에따라 캐싱이 불가능하고 simplexml_load_file() 함수사용이 불가능하여 소스수정이 필요합니다.
캐싱은 파일로 처리하고, (이건 복잡하니 넘어감..) 함수사용전 ini_set("allow_url_fopen","1"); 먼저 선언해주시면 해당 함수 사용가능하니 참고하시기 바랍니다.