1

주제: rss 받아오는 소스좀 봐주세요

기존의 rss 피딩하는 플러그인들이 다 동작하지 않아서
어렵게 인터넷을 뒤져서 rss를 긁어오는 소스로 플러그인을 만들어 보았습니다.
그냥 단순하게 제목 날짜 출력해서 링크시키려고 하거든요.
그런데 일단 출려은 되는데, 스킨에 삽입하면 원하는 자리가 아니라 문서의 맨 처음에 들어가더라구요.
어딜 고쳐야 제대로 삽입이 될런지, 도움좀 부탁드립니다.

index.php

<?

include_once 'lib.php';

function get_rss() {
    //가져올 RSS 주소를 지정하면됩니다. 
    $urls = array('http://site.com/rss.php');

     foreach ($urls as $url):
         $handle = fopen($url, 'r');

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

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

              fclose($handle);

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

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

              $rss = NULL;
         endif;
    endforeach;


}


?>

lib.php

<?php

 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);
 }


 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;
//                    echo "<div class='rssbox'>";
                    $this->printItem();        // 저장된 포스트를 출력하거나 DB로 자장하면 됨.
//                    echo "</div>";
                     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 "<div class='date'>".$this->date."</div>";
          echo "<div class='title'><a href=",$this->link,">",$this->title,"</a></div>";
     }
   
 }//end of class







?>

2

답글: rss 받아오는 소스좀 봐주세요

index.xml은 없나요?

스킨에는 어떻게 삽입하셨나요?

3

답글: rss 받아오는 소스좀 봐주세요

깜빡했네요.
대충 다른 플러그인보고 만들어봤구요. 

사이드바에 [##_sr_rss_##] 삽입했습니다.
위에 말했다시피 결과는 제대로 출력되는데
사이드바가 아닌 문서의 맨 위에 출력이됩니다.

<?xml version="1.0" encoding="utf-8"?>
<plugin version="1.0">
    <title>@실버레인 rss</title>
    <version>1.0</version>
    <description>
         silverain.org에서 rss feed in을 위한 플러그인입니다.
    </description>
    <license>GPL</license>
    <safety changeData="no" exposeData="no" accessLocal="no" accessRemote="no" accessRaw="no" />
    <requirements>
        <tattertools>1.1.*</tattertools>
    </requirements>
    <binding>
        <tag name="sr_rss" handler="get_rss" />
        <config dataValHandler="" manifestHandler="sr_include_Config"></config>
    </binding>
</plugin>

4

답글: rss 받아오는 소스좀 봐주세요

http://dev.textcube.org/wiki/PluginCode를 보시면 아시겠지만

<?php
     function Helloworld_Show($target) {
          return $target.'Hello World!';
     }
?>

요런식으로 $target을 받아온 후 $target에다가 쓰고 싶은걸 쓰고 돌려 주면 되요

근데 일단 만들어진 소스 많이 고치기 귀찮으니깐



index.php
<?

include_once 'lib.php';

function get_rss($target) {//target을 받아옵니다.
    ob_start();//출력 버퍼를 켭니다. 일단 출력되려고 하는 내용은 출력하지말고 저장 해 둡니다.


    //가져올 RSS 주소를 지정하면됩니다.
    $urls = array('http://site1.com/rss.php','http://site2.com/rss.php','http://site3.com/rss.php');

     foreach ($urls as $url):
         $handle = fopen($url, 'r');

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

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

              fclose($handle);

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

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

              $rss = NULL;
         endif;
    endforeach;
$output=ob_get_contents();//출력버퍼에 있는 내용을 담습니다.
ob_end_clean();//출력버퍼를 지웁니다.
return $target.$output;
//target과 함께 원하는걸 넘겨 줍니다.

}


?>


http://dev.textcube.org/wiki/PluginSidebar 요런식으로 만들면 위젯에서 드레그앤드롭으로 이 플러그인을 배치 할 수 있어요

hoyajigi (2009-02-09 16:58:10)에 의해 마지막으로 수정

5

답글: rss 받아오는 소스좀 봐주세요

정말 감사합니다 ^^
딱 제가 원하는대로 결과가 나오네요

한가지만 더 여쭤봐도 될까요?
제가 등록하려는 rss가
다른 rss구독기로 보면 글이 많이 보이는데
이걸로 하면 4개밖에 안보이더라구요.
혹시 코드로 더 많이 긁어오게 할 수는 없을까요?