RSS 2.0, RSS 1.0, ATOM 을 대용하기 위해서 한개의 파일로 만들려고 노력을 하였지만 잘 되지 않았습니다.
<?php class RssParser { var $Agent = "MyAgent"; var $CookieNM = "./cookie.txt"; var $debug = false; function RssParser() { } function RssGet ($RssURL, $RssParam='') { $this->URL = $RssURL; $this->Param = $RssParam; $this->GetHeader(); $this->RssGetAccess(); $this->RssXMLLoad(); // xml 중 테이터가 있을 경우에만 결과값을 돌려줌 if(empty($this->xml->channel->title) == false) { return $this->MyParser(); } } function RssPost ($RssURL, $RssData) { $this->URL = $RssURL; $this->Data = $RssData; $this->ContentLength = strlen($this->Data); } function GetHeader() { //"GET ".$this->Param." HTTP/1.1", $this->Headers = array( "Content-type: application/xml;charset=\"utf-8\"", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3", "Accept-Encoding: ", "Accept-Charset: EUC-KR,utf-8;q=0.7,*;q=0.7", "Keep-Alive: 300", "Connection: keep-alive", "" ); } /** * 실제 데이터 얻어 오는 부분 **/ function RssGetAccess() { $ch = curl_init(); curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false); curl_setopt($ch, CURLOPT_URL, $this->URL); curl_setopt($ch, CURLOPT_HTTPHEADER, $this->Headers); curl_setopt($ch, CURLOPT_REFERER, 'http://www.naver.com'); curl_setopt($ch, CURLOPT_HEADER, false); // 헤더 출력 여부 curl_setopt($ch, CURLOPT_USERAGENT, $this->Agent); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 인증서 체크같은데 true 시 안되는 경우가 많다. curl_setopt($ch, CURLOPT_SSLVERSION,3); // SSL 버젼 (https 접속시에 필요) curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); // TimeOut 값 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 결과값을 받을것인지 $this->Result = curl_exec($ch); $this->Status = curl_getinfo($ch, CURLINFO_HTTP_CODE); if(empty($this->debug) == false) { echo chr(10)."Result : ".$this->Result."\r\n" . chr(10)."\r\n" . chr(10); echo chr(10)."Status : ".chr(10).$this->Status . chr(10) ."\r\n" . chr(10); } curl_close($ch); } /** * 수집한 Feed중 삭제된것은 삭제하기 위한 함수 **/ function RssStatus($RssURL) { $this->GetHeader(); $ch = curl_init(); curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false); curl_setopt($ch, CURLOPT_URL, $FeedURL); curl_setopt($ch, CURLOPT_HTTPHEADER, $this->Headers); curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com'); curl_setopt($ch, CURLOPT_USERAGENT, $this->Agent); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $HTTP_RESULT = curl_exec($ch); $HTTP_STATUS = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $HTTP_STATUS; } /** * PHP 내장 XML 모듈로 처리 **/ function RssXMLLoad() { // cURL의 데이터가 넘어오지 않으면 실행하지 않음 if(empty($this->Result) == false) { $this->xml = @simplexml_load_string($this->Result, 'SimpleXMLElement', LIBXML_NOCDATA); } } /** * 서비스형에 따라서 값이 다른것을 통일하기 위함 **/ function MyParser() { $Rss = new stdClass(); $Rss->channel = new stdClass(); $Rss->image = new stdClass(); $Rss->item = new stdClass(); $Rss->channel->title = $this->xml->channel->title; $Rss->channel->link = $this->xml->channel->link; $Rss->channel->author = $this->OwnerWriteInfo(); $Rss->channel->description = $this->xml->channel->description; $Rss->channel->pubDate = $this->OwnerDateInfo(); $Rss->channel->language = $this->xml->channel->language; $Rss->image->url = $this->xml->channel->image->url; $Rss->image->description = $this->xml->channel->image->description; //var_dump($this->xml->channel->item); // RSS 1.0 대응 unset($tmpItem); $tmpItem = $this->xml->channel->item; if( empty($tmpItem) == true) { $tmpItem = $this->xml->item; } $i=0; foreach($tmpItem as $ItemData) { foreach($ItemData as $ItemKey=>$ItemValue) { // 반복문이나 조건문 처리 하기 switch($ItemKey) { case "category" : unset($CatagoryMerge); foreach($ItemData->{$ItemKey} as $CateData) { if(empty($CatagoryMerge) == true) { $Tmp[$i][$ItemKey] = $CateData; $CatagoryMerge = true; } else { $Tmp[$i][$ItemKey] .= ", ".$CateData; } } break; case "pubDate" : $Tmp[$i][$ItemKey] = strtotime($ItemData->{$ItemKey}); break; default : $Tmp[$i][$ItemKey] = $ItemData->{$ItemKey}; break; } // switch 문으로 하지 못하는것은 뒤에서 처리 // RSS 1.0 대응 $dc = $ItemData->children('dc', true); if(empty($dc) == false) { $Tmp[$i]['author'] = $dc->creator; if(empty($Tmp[$i]['pubDate']) == true) { $Tmp[$i]['pubDate'] = strtotime($dc->date); } } } $i++; } // end foreach $Rss->item = $Tmp; return $Rss; } /** * 글 작성자 정보 * RSS 2.0 * RSS 1.0 **/ function OwnerWriteInfo() { unset($AuthorInfo); if(empty($this->xml->channel->item[0]->author) == false && empty($AuthorInfo) == true) { $AuthorInfo = $this->xml->channel->item[0]->author; } if(empty($this->xml->channel->managingEditor) == false && empty($AuthorInfo) == true) { $AuthorInfo = $this->xml->channel->managingEditor; } // RSS 1.0 대응 if(empty($AuthorInfo) == true) { //$dc = $this->xml->channel->item[0]->children('dc', true); $AuthorInfo = $dc->creator; } return $AuthorInfo; } /** * 발행 날짜 * RSS 2.0 * RSS 1.0 **/ function OwnerDateInfo() { unset($DataInfo); // 블로그의 최종 글 발행일은 이것으로 한번 테스트 $DataInfo = $this->xml->channel->item[0]->pubDate; // RSS 발행일 // naver.com RSS의 XML에 접근하는 시간으로 표현함 if(empty($DataInfo) == true) { $DataInfo = $this->xml->channel->pubDate; } if(empty($DataInfo) == true) { $DataInfo = $this->xml->channel->lastBuildDate; } // RSS 1.0 대응 if(empty($DataInfo) == true) { //$dc = $this->xml->channel->item[0]->children('dc', true); $DataInfo = $dc->date; } return strtotime($DataInfo); } /** * URL에서 도메인 추출 * @ 일단 사용하지 않음. **/ function DetectDomain ($AllUrl) { $Pattern = "/^([a-z:\/\/]*[^\/?]*)([^$]*)/"; // 핵심은 처음나오는 / 나 ? 가 나올 경우로 추출.^^ preg_match($Pattern, $AllUrl, $result); $return = preg_replace("/http\:\/\//", "", $result[1]); return $return; } } ?>