Extra Form
PHP PHP 7.0
CMS Rhymix

RSS 게시판 업데이터( https://xe1.xpressengine.com/index.php?mid=download&package_srl=19519188 )에 관한 질문입니다.

 

일단, 라이믹스 1.9.8.1 버전 쓰고 있는데 안됩니다.

이거 사용할려면 수정할께 많다고 해서 약 3시간동안 구글링하면서 필요한 부분을 다 찾아냈습니다.

다만 문제는 이게 라이믹스에서도 동작할지는..;

 

XE 공홈에서 찾은 결과로는( https://xe1.xpressengine.com/tip/21738550 ),

"rssboard.cron.php를 열어서 define('__ZBXE__', true); 윗 부분에 define('__XE__', true); 를 추가"  하라고 하길래 추가했습니다.

 

그래서 rssboard.cron.php의 전체 소스는 (참고로 rssboard.cron.php 이건 rx설치되어있는 최상단에 위치해 있습니다)

 

<?php

    /**
 * @file rssboard.cron.php
     * @author ChoiHeeChul, KimJinHwan, ParkSunYoung
     * @brief  RSS 게시판 업데이터 모듈을 주기적으로 실행시키기 위한 cron 용 스크립트 \n
     * 참고사이트 http://www.moonseller.net/247  
    */

define('__XE__', true);
define('__ZBXE__', true); 

/** 
* @brief 필요한 설정 파일들을 include 
**/ 
require('./config/config.inc.php');
//require('./config/config.user.inc.php');

/** 
* @brief Context 객체를 생성하여 초기화 
* 모든 Request Argument/ 환경변수등을 세팅 
**/ 
$oContext = &Context::getInstance(); 
$oContext->init();

include './modules/rssboard/rssboard.class.php'; 
include './modules/rssboard/rssboard.controller.php';

require_once './modules/document/document.class.php';
require_once './modules/document/document.model.php'; 
require_once './modules/document/document.controller.php';

// RSS 게시판 업데이터의 doCrawl 실행
$rssboard = new rssboardController(); 
$rssboard->init();
$ret = $rssboard->doCrawl();
print "{$ret->message}\n"; // webcron 서비스를 위해서 output 생성
$oContext->close();

?>

 

이렇게 됩니다.

 

이렇게 수정하면 되는줄 알았더니 뭐..역시 불러오지를 않는군요.

그래서 크론의 설정문제인가? 생각하고 웹크론 스샷을 찍어봤죠.

1.PNG

2.PNG

 

 

그래서 수동으로 크론작업을 해봤습니다. https://ungabi.ga/rssboard.cron.php 그냥 이주소 들어가봤죠.

그럼 'success' 라는 문구가 뜨더군요. 그런데 게시판 가보면 전혀 정상적으로 작동하지를 않네요.

 

또 검색질을 하던중 공홈에서 

 

' 다만 설치된 php 버젼에 따라 rssboard.cron.php를 돌릴때 user-agent값이 null로 들어가는 경우가 있기 때문에      rssboard.controller.php 내용중 65라인 주변을 다음과 같이 수정해주셔야 합니다.(user-agent값 추가)

 

// SimplePie Library 를 이용해 RSS 가져오기
                $feed = new SimplePie();
                $feed->force_feed();
                $feed->set_feed_url($rssboard->rssurl);
                $feed->enable_cache(false);
                $feed->set_useragent("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)");
                $feed->init();

 

이런식으로 수정을 해도 달라지는게 없습니다 ㅠㅠ

 

게시판 모듈 설정문제인가 또 생각이 들어 스샷을 찍어봤습니다.

 

1.PNG

2.PNG

 

rss를 수집할 url은 http://www.seoulwire.com/rss/allArticle.xml 입니다.

 

뭐가 문제인지 전혀 갈피가 안잡히네요.

밑에는 rss게시판 업데이터 모듈의 총 소스입니다

 

rssboard.admin.controller.php

<?php
    /**
 * @file rssboard.admin.controller.php
     * @class rssboardAdminController
     * @author ChoiHeeChul, KimJinHwan, ParkSunYoung
     * @brief rssboard Admin Controller
     **/
class rssboardAdminController extends rssboard {

/**
 * @brief 초기화
**/
    function init() {
}

/**
 * @brief 관리자 페이지에서 추가한 RSS 주소와 대상 게시판을 추가/업데이트 
 **/
function procRssboardAdminUpdate() {

// 기본 인자를 가져옴
$args = Context::getRequestVars();
$args->module_srl = $args->target_module;

// Database 적용
if (isset($args->rssboard_srl) )
{
$output = executeQuery('rssboard.updateRssboard',$args);
}
else
{
$args->rssboard_srl = getNextSequence();
$output = executeQuery('rssboard.insertRssboard',$args);
}
$this->setMessage('success_registed');
}

/**
 * @brief 관리자 페이지에서 삭제한 업데이트 대상 RSS 를 삭제
 **/
function procRssboardAdminDelete() {

// 대상 rss 게시판 번호를 가져와서 삭제. 
$args->rssboard_srl = Context::get('rssboard_srl');
$output = executeQuery('rssboard.deleteRssboard',$args);
$this->setMessage('success_deleted');
}
}
?>

 

rssboard.admin.view.php

<?php
    /**
 * @file rssboard.admin.view.php
     * @class  rssboardAdminView
     * @author ChoiHeeChul, KimJinHwan, ParkSunYoung
     * @brief  rssboard Admin View
     **/

class rssboardAdminView extends rssboard {

/**
 * @brief 초기화
**/
    function init() {
    // 템플릿 경로 지정 (board의 경우 tpl에 관리자용 템플릿 모아놓음)
        $template_path = sprintf("%stpl/",$this->module_path);
        $this->setTemplatePath($template_path);
}

/**
* @brief RSS 게시판 목록을 보여줌. 
**/
function dispRssboardAdminContent() {

// RSS 게시판 목록을 페이징으로 보여줌
// board 모듈을 참고하였음 
        $args->sort_index = "rssboard_srl";
        $args->page = Context::get('page');
        $args->list_count = 20;
        $args->page_count = 10;

        $output = executeQueryArray('rssboard.getRssboardList', $args);

        // 템플릿에 사용할 값들을 설정
        Context::set('total_count', $output->total_count);
        Context::set('total_page', $output->total_page);
        Context::set('page', $output->page);
        Context::set('rssboard_list', $output->data);
        Context::set('page_navigation', $output->page_navigation);

        // 템플릿 파일 지정
        $this->setTemplateFile('index');
    }

/**
* @brief RSS 게시판 세부정보/수정 (게시판 입력과 동일)
**/
function dispRssboardAdminInfo() {
$this->dispRssboardAdminInsert() ;
    }

/**
* @brief RSS 게시판 수정/입력
**/
function dispRssboardAdminInsert() {

// rssboard_srl 이 있을 경우 수정
$rssboard_srl = Context::get('rssboard_srl');
if (isset($rssboard_srl))
{
// DB 에서 이름,URL,카테고리 가져오기
$args->rssboard_srl = $rssboard_srl;
$output = executeQuery('rssboard.getRssboard', $args);
Context::set('rssname',$output->data->rssname);
Context::set('rssurl',$output->data->rssurl);
Context::set('category_srl',$output->data->category_srl);

// 대상 모듈 정보 가져오기
$oModuleModel = &getModel('module');
        $target_module = $oModuleModel->getModuleInfoByModuleSrl($output->data->module_srl);
Context::set('target_module',$target_module);

// 대상 모듈의 카테고리 정보 가져오기
$oDocumentModel = &getModel('document');
$category_list = $oDocumentModel->getCategoryList($output->data->module_srl);
Context::set('category_list',$category_list);
}

$this->setTemplateFile('rss_insert');
    }

}
?>

 

rssboard.class.php

<?php
    /**
     * @file    rssboard.class.php   
     * @class   rssboard
     * @author  ChoiHeeChul, KimJinHwan, ParkSunYoung
     * @brief   rssboard module의 최상위 클래스
     *    
     * @mainpage RSS board updater Module
     * @section intro 소개
     * RSS 게시판 업데이터 모듈은 RSS로 공개되어 있는 외부 컨텐츠를 지속적으로 특정 게시판에 수집하는 모듈입니다. \n
     * 기능
     * - crontab 에 등록하여 주기적으로 업데이트 된 글을 등록
     * - 출처에 따라 다른 분류로 등록
     **/

    class rssboard extends ModuleObject {

        /**
         * @brief 설치시 추가 작업이 필요할시 구현
         **/
        function moduleInstall() {
            return new Object();
        }

        /**
         * @brief 설치가 이상이 없는지 체크하는 method
         **/
        function checkUpdate() {
            return false;
        }

        /**
         * @brief 업데이트 실행
         **/
        function moduleUpdate() {
            return new Object();
        }

        /**
         * @brief 캐시 파일 재생성
         **/
        function recompileCache() {
        }
    }
?>

 

rssboard.controller.php

<?php
    /**
 * @file rssboard.controller.php
     * @class  rssboardController
     * @author ChoiHeeChul, KimJinHwan, ParkSunYoung
     * @brief  rssboard Controller
     **/

require_once('./modules/rssboard/simplepie.inc');


class rssboardController extends rssboard {


    /**
     * @brief 초기화 / 게시글 작성을 위한 관리자 정보를 저장
    **/
    function init() {
$oMemberModel = &getModel('member');
$this->admin_info = $oMemberModel->getMemberInfoByUserID('ungabi');
    }

    /**
     * @brief rss 업데이트 대상 목록을 가져와서 각각 업데이트
     **/
    function doCrawl() {

$output = executeQueryArray('rssboard.getRssboardAll');

// 실패시 처리
if(!$output->toBool()) return $output;

foreach ($output->data as $val) {
$this->doUpdateRss($val);
}

return new Object(0,'success');
}

/**
 * @brief 각 개별 RSS 를 업데이트
 **/
function doUpdateRss($rssboard)
{
if( !isset($rssboard) || !isset($rssboard->rssurl) )
return ;

// 최종 업데이트 기준일 가져오기
$last_updatedate = 0;
if( $rssboard->updatedate!=0 )
{
$last_updatedate = $this->getRegdateTime($rssboard->updatedate);

// 최종 업데이트 시간이 10분 이내면 무시
if( time() < ($last_updatedate + 600) )
return ;
}

// document module의 controller 객체 생성
$oDocumentController = &getController('document');

// 현재 시간을 업데이트 시간으로 설정
$updatetime = date('YmdHis');

// SimplePie Library 를 이용해 RSS 가져오기
$feed = new SimplePie();
$feed->force_feed();
$feed->set_feed_url($rssboard->rssurl);
$feed->enable_cache(false);
$feed->init();
$items = $feed->get_items();

$link = $rssboard->rssurl;

// 최종 업데이트 일 이후에 작성된 글을 대상 게시판에 추가
foreach(array_reverse($items,true) as $item)
{
if ($last_updatedate > $item->get_date('U') )
continue;
$obj = null;
$obj->title = htmlspecialchars_decode($item->get_title());

// item link 를 가져오지 못할 경우 불가피하게 RSS 주소 사용
if($item->get_link())
$link = $item->get_link();

$obj->content =  $item->get_description() . "<br/><br/><br/> 원문출처 : <a href='" . $item->get_link() . "' target='_blank'>" . $item->get_link() . "</a>";
$obj->module_srl = $rssboard->module_srl;
$obj->member_srl = $this->admin_info->member_srl;
$obj->user_id =  $this->admin_info->user_id;
$obj->user_name =  $this->admin_info->user_name;
$obj->nick_name =  $this->admin_info->nick_name;
$obj->email_address =  $this->admin_info->email_address;
$obj->regdate = $item->get_date('YmdHis');
$obj->category_srl = $rssboard->category_srl;
$obj->allow_comment = 'Y';

$output=$oDocumentController->insertDocument($obj,true);
}

// 최종 업데이트 시간 저장
$args = null;
$args->updatetime = $updatetime;
$args->rssboard_srl = $rssboard->rssboard_srl;
$output = executeQuery('rssboard.updateRssboardDate',$args);
    }

    /**
    * @brief DB에 저장된 시간을 unixtimestamp 로 변환 /n
    * document.item.php 에서 차용
    */
    function getRegdateTime($regdate) {
        $year = substr($regdate,0,4);
        $month = substr($regdate,4,2);
        $day = substr($regdate,6,2);
        $hour = substr($regdate,8,2);
        $min = substr($regdate,10,2);
        $sec = substr($regdate,12,2);
        return mktime($hour,$min,$sec,$month,$day,$year);
    }
}
?>

 

rssboard.view.php

<?php
    /**
 * @file rssboard.view.php
     * @class  rssboardView
     * @author ChoiHeeChul, KimJinHwan, ParkSunYoung
     * @brief  rssview Controller
     **/
class rssboardView extends rssboard {

/**
 * @brief 초기화 / 게시글 작성을 위한 관리자 정보를 저장
**/
    function init() {
    }
    
    /**
    * @brief 특정 모듈의 카테고리 정보를 읽어온 후 JSON 으로 반환
    **/
    function dispRssboardCategoryList() {

// 대상 module_srl
        $module_srl = Context::Get("module_srl");

        $oDocumentModel = &getModel('document');
        $category_list = $oDocumentModel->getCategoryList($module_srl);
        
// JSON 형식으로 변환
        $i = 0;
        $result = '{"categories":[';
        foreach($category_list as $v)
        {
            if ($i!=0) $result .= ", ";
            $i ++ ;
            
            $result .= '{"category_srl":' . $v->category_srl . ',';
            $result .= '"title":"' . $v->title . '"}';
        }
        $result .= ']}';
        
// 별도 헤더와 내용 출력 후 추가 처리를 방지하기 위해 종료
        header ("Content-type: application/json; charset=UTF-8");
header ("Pragma: no-cache");
        echo $result;
        exit;
    }

}
?>

 

아무리 생각해도 뭐가 문제인지 모르겠네요.

아예 처음부터 다시 다 뜯어고쳐야 하나요?

 

 

 

  • profile
    기존 rss 업데이트는 작동을 안합니다. php버전이 올라감에 따라 문법상 rss 불러오는 라이브러리가 작동을 안하죠 .. rss 라이브러리를 고쳐야 합니다. 전 그렇게 쓰고 있습니다.
  • profile ?
    어떻게 고치셨나요?