제목 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 백성용 헬로우보이