728x90

특정 지역의 날씨정보를 기상청으로부터 가져오는 코드에 대해 알아보고 적어둔다.


기상청 rss 를 통해 동네예보 rss 구하기

http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp?sido=4100000000&gugun=4146500000&dong=4146554000&x=27&y=14


1번을 누르면 해당지역 rss 에 대한 날씨예보 정보(현재 온도, 시간별 날씨, 강수량, 기온, 습도 등)가 검색된다.

http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4146554000


크롬브라우저와 Firefox가 다르게 검색된 결과를 보여준다.

Firefox 에서는


라고 검색된다.


http://www.kma.go.kr/wid/queryDFS.jsp?gridx=62&gridy=122


X좌표값과 Y좌표값을 넣고 위 URL를 웹브라우저에 입력하면 해당지역 XML 코드가 출력된다.


temp : 온도, hour : 시간, wfKor : 날씨, pop : 강수량, reh : 습도



PHP에서 Web상의 XML 문서를 파싱하기 위해서는 cURL 라이브러리를 이용하면 된다.

String 으로 추출된 결과물을 simplexml_load_string 으로 구조체로 변환한다.

XML 데이터를 JSON 으로 변환한 다음 배열(array)를 읽어서 원하는 자료를 추출하는 것은 foreach 문을 사용하면 되는거 같다.

배열을 출력하는 print_r 함수를 이용하여 내용을 봐가면서 원하는 자료만 추출하면 된다.


<?php

function file_get_contents_curl($url) {
    $ch = curl_init();// curl 리소스를 초기화
    curl_setopt($ch, CURLOPT_URL, $url); // url을 설정
    // 헤더는 제외하고 content 만 받음
    curl_setopt($ch, CURLOPT_HEADER, 0);
    // 응답 값을 브라우저에 표시하지 말고 값을 리턴
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);// 리소스 해제를 위해 세션 연결 닫음
    return $data;
}


$url = "http://www.kma.go.kr/wid/queryDFS.jsp?gridx=62&gridy=122";

$xml_string = file_get_contents_curl($url);

$xml = simplexml_load_string($xml_string);

$json = json_encode($xml); // XML to JSON

$R = json_decode($json,TRUE);//배열로 변환


print_r($R);

echo '<br />';

echo '<br />';

echo $R['header']['tm'].'<br />';//날씨 예보시간

$wData = $R['body']['data'][0];

print_r($wData);

echo '<br />';

echo '<br />';

//echo $wData['hour'].'시 온도:'.$wData['temp'].' 날씨:'.$wData['wfKor'];


foreach($R['body']['data'] as $wData){

    echo $wData['hour'].'시 온도:'.$wData['temp'].' 날씨:'.$wData['wfKor'];

    echo '<br />';

}

?>


위 코드에서 JSON 으로 변경하지 않고 처리한다면

$data = file_get_contents_curl($url);
$xml = simplexml_load_string($data);

echo '<pre>';
print_r($xml);
echo '</pre>';

foreach ($xml->body->data as $row) {
    $hour = $row -> hour;
    $temp = $row -> temp;
    $wfkor = $row -> wfKor;
    $pop = $row -> pop;
    $reh = $row -> reh;
    $wdkor = $row -> wdKor;
}

와 같이 처리하면 원하는 걸 뽑아낼 수 있다.


배열에 나오는 날씨는 내일과 모레 날씨 정보를 보여주는 거 같다.

다음날 오전에 다시 확인해보니 내일, 모레 뿐만 아니라 현재 기준으로 앞으로의 오늘 날씨 정보도 보여주더라.

그런데 날짜 정보가 XML 파일에 기록되지 않아서 해당 정보를 정확하게 파악하기가 쉽지 않다.


cURL 함수 사용이 가능한지 여부를 확인하는 방법

 <?php
if (ini_get('allow_url_fopen') == '1') {
   // file_get_contents() 사용
   echo 'php.ini 환경에서 허용';
} else {
   // curl 함수 이용 가능 여부
   if (function_exists('curl_init')) {
       echo 'curl 함수 사용 가능';
   } else {
       echo 'curl 함수 이용 불가';
   }
}
?>


php.ini에는 'allow_url_fopen'라는 설정항목이 있다.
이 항목이 off일 경우에는 fopen 등의 파일관련 함수에서 URL로 파일을 읽어오는 것이 불가능하다.
'allow_url_fopen'을 off로 하는 대부분의 이유는 '보안 취약성'의 우려가 있기 때문이다.
For example, somebody might pass /etc/passwd as a url, and be able to view its contents.

블로그 이미지

Link2Me

,