제목 RSS 강좌 - PEAR를 이용한 RSS 기능 구현
작성자 손상모 작성일 2004.11.20 15:39:55
첨부파일 pearreader.zip(0.93KB)


RSS강좌 목표가 RSS Reader(Aggregator) 구현보다는 RSS에 대한 이해이다 보니 너무 깊게 설명하여, 단순하게 RSS 기능 구현이 목적인 분들은 좀 복잡하다 생각하실 수 있을 것 같아, 이번시간에는 RSS 모듈을 통하여 개발자가 쉽게 RSS를 사용하는 방법을 소개하려고 합니다.

앞의 강좌에서 사용한 RSSReader 클래스( 꽤 쓸만함) 사용하는 것도 좋지만, PHP에는 PEAR(PHP Extension and Application Repository)라는 아주 좋은 솔루션이 있습니다. 그럼 PEAR에 대한 간략한 소개와 PEAR 중의 XML/RSS 클래스 사용방법을 알아 보도록 하겠습니다.

1. PEAR 소개
PEAR는 "PHP Extension and Application Repository" 의 약자로써 Malin Bakken에 의하여 1999.11.12에 시작하여, 현재는 다양한 클래스등을 제공하여 PHP 개발자들이 좀 더 편리하게 개발할수 있는 환경을 제공하고 있습니다.

PHP 설치시 기본적으로 PEAR가 설치지 않기에( 버전과 설치 옵션에 따라서 차이가 있슴)  여러분의 시스템에 현재 PEAR가 설치되어 있지 않을 수 있습니다. PEAR의 설치와 보다 자세한 설명은 아래의 사이트를 참고하여 주십시요.

2. XML/RSS 설치 및 메뉴얼
PEAR 클래스 중에서 XML_RSS를 설치해 보도록 하겠습니다. 사이트에서 직접 소스를 다운로드 받아서 설치하거나, 아님 아래의 예처럼 온라인상에서 바로 설치도 가능합니다. "pear" 의 사용방법은 "c:pearpear help" 로 pear 명령어들에 대한 간단한 설명을 볼수 있습니다.

  • pear list -> 서버에 설치되어 있는 목록을 보여줍니다.
  • pear remote-list -> pear.php.net 에 있는 Package 리스트를 보여줍니다.
  • pear install packagename -> Package를 설치해줍니다.
  • pear uninstall packagename -> Package를 설치해줍니다.
  • pear remote-info packagname -> pear.php.net 에 있는 Package 정보를 보여 줍니다.
C:php>pear install XML_RSS
downloading XML_RSS-0.9.2.tgz ...
Starting to download XML_RSS-0.9.2.tgz (3,515 bytes)
....done: 3,515 bytes
requires package `XML_Tree'
XML_RSS: Dependencies failed

C:php>pear install XML_Tree
downloading XML_Tree-1.1.tgz ...
Starting to download XML_Tree-1.1.tgz (4,826 bytes)
.....done: 4,826 bytes
install ok: XML_Tree 1.1

C:php>pear install XML_RSS
downloading XML_RSS-0.9.2.tgz ...
Starting to download XML_RSS-0.9.2.tgz (3,515 bytes)
....done: 3,515 bytes
install ok: XML_RSS 0.9.2


C:phpPEAR>cd XML
C:phpPEARXML>dir
C 드라이브의 볼륨: 로컬 디스크
볼륨 일련 번호: 58B7-06FB

C:phpPEARXML 디렉터리

2004-11-20  02:07p      <DIR>          .
2004-11-20  02:07p      <DIR>          ..
2004-11-20  02:07p      <DIR>          Parser
2004-11-20  02:07p              18,932 Parser.php
2004-10-22  04:14p      <DIR>          RPC
2004-10-22  04:14p              34,992 RPC.php
2004-11-20  02:02p               8,718 RSS.php
2004-11-20  02:02p      <DIR>          Tree
2004-11-20  02:02p              10,028 Tree.php

4개 파일          72,670 바이트
5 디렉터리   9,076,826,112 바이트 남음

PEAR 메뉴얼 : http://pear.php.net/manual/en/package.xml.xml-rss.php

3. RSS Reader 기능 구현
XML/RSS Package 사용에 대한 간단한 예와 "RSS강좌 - RSSReader Class 제작 및 Reader 만들기"에서 구현한 간단한 RSS Reader를 XML_RSS을 이용하여 구현해 보도록 하겠습니다. 코드들은 앞의 강좌에서 소개한 코드들과 거이 차이가 없고 간단하니 별도의 설명은 하지 않겠습니다.

<?
require_once "XML/RSS.php";

$rss =& new XML_RSS("http://www.ihelpers.co.kr/rss.php?q=all");
$rss->parse();

echo "<pre>";
print_r($rss->getStructure());
print_r($rss->getChannelInfo());
print_r($rss->getItems());
echo "</pre>";
?>

[ demopear.php ]

<?
require_once "XML/RSS.php";

$url = $HTTP_GET_VARS["URL"];

$rss =& new XML_RSS("http://www.ihelpers.co.kr/rss.php?q=all");
$rss->parse();


echo "<html><head><title>Simple RSS Reader</title>
";
echo "<style><!-- BODY,TD,SELECT { FONT: 9pt Arial; LINE-HEIGHT: 17px;} //--></style>
";
echo "<body><form>RSS URL : <input type=text name=URL value="$url" size=70> ";
echo "<input type=submit value="?">
";
echo "<hr>
";
echo "</form>
";

if(!empty($url)){
	$channel = $rss->getChannelInfo();
	while (list($key, $value) = each ($channel)) {
		echo "<li>$key => $value</li>
";
	}

	echo "<p><table width=100%>";
	$count = 0;
	foreach($rss->getItems() as $items){
		
		if($count == 0){
			echo "<tr>";
			while (list($key, $value) = each ($items)) {
				printf("<td bgcolor="#EEEEEE">%s</td>
",$key);
			}
			echo "</tr>";
		}

		echo "<tr>";
		while (list($key, $value) = each ($items)) {
			printf("<td bgcolor="#F7F7F7">%s</td>
",$value);
		}
		echo "</tr>";
		
		$count++;
	}
	echo "</table>";
}
echo "</body></html>
";
?>

[ pearreader.php ]

3. 소스코드

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이
제목 RSS 강좌 - RSS로 만드는 뉴스서비스
작성자 손상모 작성일 2004.11.22 16:11:50
첨부파일 newsmowa.zip(8.96KB)


구글은 검색엔진 기술을 이용하여 웹상의 뉴스정보를 모와서 뉴스서비스(http://www.google.co.kr/news)를 제공하고 있습니다. 이미 야후,네이버등에서 제휴를 통하여 뉴스 서비스를 제공하고 있고, 구글의 뉴스 정보는 링크를 통하여 해당 사이트에서 내용 조회해야 하는 불편함등으로 이용자가 미약하지만, 검색엔진 기술만으로 많은 뉴스정보를 종합적으로 볼수 있다는 것은 참 좋은 것 같습니다. 갑자기 구글의 뉴스이야기를 한 것은 이번시간에 우리는 검색기술이 아닌 RSS를 이용하여 뉴스정보를 제공하는 서비스를 만들어 보기 위해서 입니다.

1. 데모보기

http://www.ihelpers.co.kr/lib/jmrss/newsmowa.php

2. newsmowa.php 소스
라이브러리는 앞에서 소개한 "RSSReader Class"를 사용하였으면, 강좌를 보시는 분들이 코드를 최대한 쉽게 이해하고 다른곳의 활용도를 높이기 위해서 부가적인 기능이 없이 간락하게 코드를 구성해 보았습니다.

프로그램의 주요 기능은 아래와 같습니다.

  1. 각 사이트별로 뉴스 정보를 읽어온다.
  2. 읽어온 뉴스정보를 날짜순으로 정열한다.
  3. 정열된 뉴스정보를 출력해 준다.
$rss = new RSSReader($url,true,600,"./cache");

빠른 조회를 위하여 Cache기능을 사용하였으며, Cache 주기는 10분 단위로 설정하였습니다. cache 디렉토리는 아래와 같이 사전에 생성해 주어야 합니다.

lsh804:~/www/lib/jmrss$ mkdir cache
lsh804:~/www/lib/jmrss$ cd cache/
lsh804:~/www/lib/jmrss/cache$ ls -al			-- 실행전(브라우저 호출전)
total 8
drwxr-xr-x    2 ihelpers ihelpers     4096 11¿u 22 13:22 ./
drwxrwxr-x    3 ihelpers ihelpers     4096 11¿u 22 13:22 ../

lsh804:~/www/lib/jmrss/cache$ ls -al			-- 실행후(브라우전 호출후)
total 84
drwxr-xr-x    2 ihelpers ihelpers     4096 11¿u 22 13:23 ./
drwxrwxr-x    3 ihelpers ihelpers     4096 11¿u 22 13:22 ../
-rw-r--r--    1 ihelpers ihelpers    26480 11¿u 22 13:23 75d78ac73c4bba613383c14364d7cad9
-rw-r--r--    1 ihelpers ihelpers    10296 11¿u 22 13:23 80f7c3964eb777b3c13a1abeae98aaba
-rw-r--r--    1 ihelpers ihelpers    35870 11¿u 22 13:23 cf7ea8604a12ee1ef2887dc93e53d052
lsh804:~/www/lib/jmrss/cache$ 

아래는 RSS를 통하여 얻은 뉴스정보를 최근날짜별로 정열하는 로직입니다. 날짜순 정열을 위하여 발행일을 "YmdHis" 형식의 날짜일련번호 항목을 별도로 저장하였습니다.

/**
 * 날짜별로 정열
 *
 * @access private
 * @return void
 */
function cmp ($a, $b) {
 return strcmp($b["IDXPUBDATE"],$a["IDXPUBDATE"]);
}
...
usort($newsList,"cmp");

<?
include "RSSReader.php";

/**
 * GMT 날짜를 현지 날짜로 변경한다.
 *
 * @access private
 * @param string pubdate
 * @return string
 */
function _TopubDate($pubdate,$fmt = "Y/m/d H:i:s"){
 $result = strtotime($pubdate);
 if($result > 0){
  return date($fmt,$result);
 } else {
  if(preg_match("/(d{4})-(d{2})-(d{2})T(d{2}):(d{2})(:(d{2})|)([-|+])(d{2}):(d{2})/",
   $pubdate,$matches)){
   $op = ($matches[8] == "-")? -1:1;
   $hour = $matches[9]*$op;
   $min  = $matches[10]*$op;
   $timestamp =
    mktime ($matches[4]+$hour,$matches[5]+$min,$matches[6],$matches[2],$matches[3],$matches[1]);
   return date($fmt,$timestamp);
  } else {
  }
 }
}

/**
 * 날짜별로 정열
 *
 * @access private
 * @return void
 */
function cmp ($a, $b) {
 return strcmp($b["IDXPUBDATE"],$a["IDXPUBDATE"]);
}

/**
 * 뉴스목록의 선택여부
 *
 * @access private
 * @param string news key
 * @return boolean
 */
function isChoice($key){
 global $ns;
 return in_array($key,$ns);
}


$news = array(
 "chosun" => array("조선일보","http://www.chosun.com/rss/rss.xml"),
 "joins" => array("중앙일보","http://rss.joins.com/joins_news_list.xml"),
 "kbench" => array("케이벤치","http://rss.kbench.com/news.xml")
);

$ns = $HTTP_GET_VARS["ns"];
if(empty($ns)){ $ns = array_keys($news); }

$newsList = array();
while (list($key, $value) = each ($news)) {
 $url = $value[1];
 $rss = new RSSReader($url,true,600,"./cache");
 $response = $rss->Read();

 foreach($rss->getItems() as $item){

  if(isChoice($key)){
   if(isset($item["dc:date"])) $item["pubdate"] = $item["dc:date"];
   //array_push($newsList,array($value[0],$item["title"],$item["link"],$item["description"],$item["pubdate"]));
   array_push($newsList,
    array(
     NAME => $value[0],
     TITLE => $item["title"],
     LINK => $item["link"],
     DESCRIPTION => $item["description"],
     PUBDATE => $item["pubdate"],
     TOPUBDATE => _Topubdate($item["pubdate"]),
     IDXPUBDATE => _Topubdate($item["pubdate"],"YmdHis")
    )
   );
  }
 }

 $rss->free();
 unset($rss);
}

usort($newsList,"cmp");

echo "<html><head><title>뉴스모와</title> ";
echo "<style><!-- BODY,TD,SELECT { FONT: 9pt Arial; LINE-HEIGHT: 17px;} //--></style> ";
echo "<body>";
echo "<form>";
echo "<table width=100% border=1> ";
echo "<tr><td> ";


foreach($news as $key => $value) {
 $checked = isChoice($key)? "checked":"";
 echo "<input type=checkbox name=ns[] value=$key $checked> $value[0] ";
}

echo "<input type=submit value="조회"></td></tr> ";
echo "</table>";
echo "</form>";

echo "<table width=100% border=1> ";
echo "<tr><td>제목</td><td align=center>발행일</td><td align=center>출처</td></tr> ";
foreach($newsList as $list){
 printf("<tr><td><a href="%s" target=_blank>%s</td><td align=center>%s</td><td align=center>%s</td></tr> ",
  $list[LINK],$list[TITLE],$list[TOPUBDATE],$list[NAME]);
}
echo "</table>";

echo "</body></html> ";
?>

3. 소스코드

이것으로 RSS 연재 강좌를 마치도록 하겠습니다. 아직 국내의 경우는 RSS 활용과 자료가 적어, 부족한 실력이지만 관련 클래스와 강좌를 연재하게 되었습니다.  이 강좌를 보시고 많은 분들이 운영하는 사이트에 RSS를 제공하고, RSS 관련된 좋은 솔루션과 서비스 제작하는데 조금이나마 도움이 되었으면 합니다.

 

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이