RSS Reader 만들기 > 퍼블리셔팁

퍼블리셔팁

퍼블리싱과 관련된 유용한 정보를 공유하세요.
질문은 상단의 QA에서 해주시기 바랍니다.

RSS Reader 만들기 정보

HTML RSS Reader 만들기

본문

여기에 오래전에 RSS 관련해서 글을 적었을 때 제가 로컬에서 테스트해서 올렸는데
최근에 웹호스팅에서 하다보니 보안상 fopen은 막아 놓아더라구요.

그래서 사이트 검색 해보니 fsoketopen을 사용해서 하는 방식이 있어 다시 정래해서 올립니다.

우선 사용하는 페이지입니다.
RSS 기본 자체가 utf-8 형식이니 이점만 주의하시면 될 것 같아요.
요즘 메타사이트 관련 작업 문의가 많은데..
개발자님들 참고하셔서 커스터마이징 해서 사용하시기 바랍니다.

------------------------------------------------------------------------------------------
<html>
<head>
  <title>Test</title>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</head>
<body>
<?

//echo phpinfo();

include_once './lib/lib.php';

//가져올 RSS 주소를 지정하면됩니다.
// 새로운 적용 방식 - 보안 때문에 fopen을 사용할 수가 없군요
$urls = array('http://blog.rss.naver.com/minsoub.xml', 'http://kori2sal.innori.com/rss');


foreach ($urls as $url):

$handle = get_url_fsockopen($url);

if ($handle != "")
{
$rss = new RSSParser;

// parsing
$rss->setRSS($handle);
rssParse($rss);

$rss = NULL;
}
endforeach;

// 이전 소스 적용 방식
/* foreach ($urls as $url):
    $handle = fopen($url, 'r');

    if ($handle):
          $document = '';

          while (!feof($handle))
              $document .= fgets($handle, 4096);

          fclose($handle);

          echo document;

          //파서 생성
          $rss = new RSSParser;

          //파싱
          $rss->setRSS($document);
          rssParse($rss);

          $rss = NULL;
    endif;
endforeach;  */

?>
</body>
</html>
------------------------------------------------------------------------------------------

다음은 클래스와 함수입니다.
-------------------------------------------------------------------------------------------
<?

 function rssParse($rss_obj)
 { 
      //내장 XML 파서 생성
    $xml_parser = xml_parser_create('UTF-8');
 
    xml_set_object($xml_parser, $rss_obj); 
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, FALSE);

      //XML 파서에 이벤트 핸들러를 할당
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "characterData");

      //XML 파싱
    xml_parse($xml_parser, $rss_obj->getRSS());
    xml_parser_free($xml_parser);
 }


    function get_url_fsockopen( $url ) {
        $URL_parsed = parse_url($url);

        $host = $URL_parsed["host"];
        $port = $URL_parsed["port"];
        if ($port==0)
            $port = 80;

        $path = $URL_parsed["path"];
        if ($URL_parsed["query"] != "")
            $path .= "?".$URL_parsed["query"];

        $out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

        $fp = fsockopen($host, $port, $errno, $errstr, 30);
        if (!$fp) {
        echo "$errstr ($errno)<br>\n";
        } else {
            fputs($fp, $out);
            $body = false;
            while (!feof($fp)) {
                $s = fgets($fp, 128);
                if ( $body )
                    $in .= $s;
                if ( $s == "\r\n" )
                    $body = true;
            }

            fclose($fp);
            return $in;
        }
    }


 class RSSParser
{
    private $rss_doc;
 
    private $current_element;
    private $in_item = FALSE;
    private $in_description = FALSE;
    private $title;
    private $date;
    private $link;
    private $category;
    private $content;

 
    function setRSS($rss_text)
    {
          $this->rss_doc = $rss_text;
    }
 
    function getRSS()
    {
          return $this->rss_doc;
    }

    //태그가 시작하는 부분에서 처리할 내용 
    function startElement($parser, $element, $attrs)
    {
          if ($this->in_description) return;   

          $this->current_element = strtoupper($element);
 
          switch ($this->current_element):
              case 'ITEM' :
                    $this->in_item = TRUE;
                    break;

              case 'DESCRIPTION' :
                    if ($this->in_item) {
                        $this->in_description = TRUE;
                        $this->content = '';
                    }
                    break;
   
              default:
                    break;   
          endswitch;
    }
 
    function endElement($parser, $element)
    {
          $el = strtoupper($element);

          if ($this->in_description and 'DESCRIPTION' != $el) return;

          switch (strtoupper($el)):
              case 'ITEM' :
                    $this->in_item = FALSE;
                    $this->printItem();        // 저장된 포스트를 출력하거나 DB로 자장하면 됨.
                    break;

              case 'DESCRIPTION' :
                    if ($this->in_item) {
                        $this->in_description = FALSE;
                    }
                    break;

              default:
                    break;   
          endswitch;

          $this->current_element = '';
    }
 
    function characterData($parser, $data)
    { 
          if ('' == trim($data)) return;
 
          if ($this->in_item):
 
          switch ($this->current_element):
                case 'TITLE' :
                    $this->title = $data;
                    break;

                case 'DESCRIPTION' :
                    $this->content .= $data; //반드시 .= 연산자를 써야함!
                      break;

                case 'CATEGORY' :
                    $this->category = $data;   
                    break;

                case 'PUBDATE' :
                    $this->date = $data;
                    break;

                case 'LINK' :
                    $this->link = $data;
                    break;
          endswitch; 
   
          endif;
    }     

      //여기서는 바로 출력을 하지만, DB에 저장하는 방식으로 구현할 수도 있습니다.
      private function printItem()
    {
          echo "<P><STRONG>";
          echo $this->title;
          echo "</STRONG>";
 
          echo "  (";
          echo $this->date.")</P>";
 
          echo $this->content;
          echo "<BR>";
          echo $this->category." | ";
          echo $this->link;
 
          echo "<br><br>";
    }
 
 }//end of class

?><div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:16:08 PHP & HTML에서 이동 됨]</div>
추천
0

댓글 6개

전체 4

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT