일단 시작은 기상청 RSS 서비스 제공 페이지에 들어가서 원하는 지역을 선택한 후 RSS 버튼을 클릭하여 유효한 url을 획득해야한다.
- 기상청 날씨누리 RSS 서비스 제공 페이지
www.weather.go.kr/weather/lifenindustry/sevice_rss.jsp
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']; // 날씨한글
?>
- 사용 시 참고사항
매번 요청하는 방식보다 최초 요청 시 쿠키를 구워놓고, 특정 시간 주기로 쿠키를 다시 구워 화면에 출력하는 방식으로 사용하는 것이 좋다.
'PHP' 카테고리의 다른 글
Editplus Tip. FTP 설정 백업 & 에디트플러스 설정 백업하기 (0) | 2021.03.11 |
---|---|
PHP JS AJAX를 이용한 파일 업로드 (비동기 파일 업로드) (0) | 2021.03.02 |
PHP/JS 동적으로 바뀌는 행정구역 select 태그 만들기 [도시선택] (0) | 2021.03.02 |