본문 바로가기

PHP

PHP 기상청 RSS 서비스를 이용한 날씨 정보 얻기 특정지역(동네)

반응형

실제로 해당 소스코드가 적용되어 사용 된 화면

 

 

일단 시작은 기상청 RSS 서비스 제공 페이지에 들어가서 원하는 지역을 선택한 후 RSS 버튼을 클릭하여 유효한 url을 획득해야한다.

 

- 기상청 날씨누리 RSS 서비스 제공 페이지

www.weather.go.kr/weather/lifenindustry/sevice_rss.jsp

빨갛게 표시한 섹션에서 원하는 지역을 선택 후 RSS 버튼을 클릭하면, XML 데이터에 접근가능한 URL을 보여준다.

 

 

당연한 얘기지만, 원하는 지역의 zone 값으로 해당 지역의 날씨정보를 얻을 수 있다.

 

 

URL을 브라우저 주소창에 입력하면 위 사진과 같이 XML 노드 트리 결과물이 출력되는 걸 확인할 수 있다.

 

 

RSS 서비스에서 제공한 URL은 cURL로 접근하여 리턴되는 XML 노드들을 사용할 수 있다. 만약 서버에 cURL 모듈이 설치되지 않았다면 사용이 불가능하니, 아래 문서를 참고하여 설치하자.

- PHP Manual < cURL > Document

www.php.net/manual/en/book.curl.php

 

PHP: cURL - Manual

I wrote the following to see if a submitted URL has a valid http response code and also if it responds quickly. Use the code like this: The second argument is optional, and it allows you to check for  a specific

www.php.net

 

 

cURL이 준비되었다면, 아래 소스코드로 사용이 가능하다.

<?
	function produce_XML_object_tree($raw_XML) { // XML노드를 PHP Object자료형으로 변경하는 함수
		libxml_use_internal_errors(true);
		try {
			$xmlTree = new SimpleXMLElement($raw_XML);
		} catch (Exception $e) { // Something went wrong.
			$error_message = 'SimpleXMLElement threw an exception.';
			foreach(libxml_get_errors() as $error_line) {
				$error_message .= "\t" . $error_line->message;
			}
			trigger_error($error_message);
			return false;
		}
		return $xmlTree;
	}

//	$feed_url	= 'http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1159068000';
	$feed_url	= 'http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone='.$_REQUEST['zone']; // 실제로 원하는 zone 값을 삽입

	$ch			= curl_init();

	curl_setopt($ch, CURLOPT_URL, $feed_url);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$xml		= curl_exec($ch);

	curl_close($ch);

	$cont		= produce_XML_object_tree($xml); // XML노드를 Object 형태로 전환
	$channel	= $cont->channel;
	$item		= $channel->item;
	$desc		= $item->description;
	$body		= $desc->body;

	function objectToArray($d) { // Object 형태를 배열로 전환하는 함수
		if (is_object($d))	$d = get_object_vars($d);
 		if (is_array($d))	return array_map(__FUNCTION__, $d);
		else				return $d;
	}

	$body_2	= objectToArray($body); // 필요한 데이터들을 배열로 전환하여 담는다.

/*	echo "<pre>"; print_r($body_2['data'][0]); echo "</pre>"; // 어떤 내용들이 들어있는지 화면에 찍어보는 것도 나쁘지 않다.

    [hour]	=> 21		:시간(3시간단위)
    [day]	=> 0		:번째날(오늘0,내일1,모레2)
    [temp]	=> 10.0		:현재시간온도
    [tmx]	=> -999.0	:최고온도 (-999.0=값이없을경우)
    [tmn]	=> -999.0	:최저온도 (-999.0=값이없을경우)
    [sky]	=> 4		:하늘상태코드 (맑음1,구름많음3,흐림4)
    [pty]	=> 0		:강수상태코드 (없음0,비1,비/눈2,눈3,소나기4)
    [wfKor]	=> 흐림		:날씨한국어 (맑음,구름 많음,흐림,비,비/눈,눈,소나기)
    [wfEn]	=> Cloudy	:날씨영어 (문서참조)
    [pop]	=> 30		:강수확률%
    [r12]	=> 0.0		:12시간예상 강수량범주 (문서참조)
    [s12]	=> 0.0		:12시간예상 직설량범주 (문서참조)
    [ws]	=> 3.0		:풍속(m/s)
    [wd]	=> 0		:풍향(북0,북동1,동2,남동3,남4,남서5,서6,북서7);
    [wdKor]	=> 북		:풍향한국어
    [wdEn]	=> N		:풍향영어
    [reh]	=> 80		:습도
    [r06]	=> 0.0		:6시간예상 강수량범주 (문서참조)
    [s06]	=> 0.0		:6시간예상 직설량범주 (문서참조)
*/
	$temp	= $body_2['data'][0]['temp'];		// 기온값
	$sky	= $body_2['data'][0]['sky'];		// 하늘값
	$pty	= $body_2['data'][0]['pty'];		// 강수값
	$wfKor	= $body_2['data'][0]['wfKor'];		// 날씨한글
?>

 

 

받아온 값 중 현재 시간 날씨데이터를 특정하여 담은 $body_2['data'][0] 배열을 print_r()로 출력하니 화면처럼 나온다. 그럼 성공이다.

 

 

 

 

 

- 사용 시 참고사항 

매번 요청하는 방식보다 최초 요청 시 쿠키를 구워놓고, 특정 시간 주기로 쿠키를 다시 구워 화면에 출력하는 방식으로 사용하는 것이 좋다.

 

 

반응형