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(); ?>
이렇게 됩니다.
이렇게 수정하면 되는줄 알았더니 뭐..역시 불러오지를 않는군요.
그래서 크론의 설정문제인가? 생각하고 웹크론 스샷을 찍어봤죠.
그래서 수동으로 크론작업을 해봤습니다. 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();
이런식으로 수정을 해도 달라지는게 없습니다 ㅠㅠ
게시판 모듈 설정문제인가 또 생각이 들어 스샷을 찍어봤습니다.
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; } } ?>
아무리 생각해도 뭐가 문제인지 모르겠네요.
아예 처음부터 다시 다 뜯어고쳐야 하나요?