diff --git a/app/Config/Routes.php b/app/Config/Routes.php index d7b2d38..34dfe32 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -15,10 +15,9 @@ $routes->addPlaceholder('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4} //2. Config/Filters.php -> $aliases = ['authFilter' => AuthFilter::class] $routes->get('/', 'Home::index'); -$routes->group('cli', ['namespace' => 'App\Controllers\CLI'], function ($routes) { - $routes->cli('mangboard/level', 'Mangboard::level'); - $routes->cli('crawler/yamap', 'Crawler::yamap'); - $routes->cli('crawler/yamap/(:any)', 'Crawler::yamap::/$1'); +$routes->group('crawler', ['namespace' => 'App\Controllers\Crawler'], function ($routes) { + $routes->cli('yamap', 'YamapController::crawling'); + $routes->cli('yamap/(:segment)', 'YamapController::crawling::/$1'); }); $routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'authFilter:manager'], function ($routes) { @@ -32,14 +31,9 @@ $routes->group('mangboard', ['namespace' => 'App\Controllers\Mangboard'], functi $routes->group('admin', ['namespace' => 'App\Controllers\Mangboard\Admin', 'filter' => 'authFilter:manager'], function ($routes) { $routes->group('/user', function ($routes) { $routes->get('/', 'UserController::index'); - // $routes->get('insert', 'UserController::form_insert'); - // $routes->post('insert', 'UserController::insert'); - // $routes->get('update', 'UserController::form_update'); - // $routes->post('update', 'UserController::upadate'); - // $routes->get('view', 'UserController::view'); - // $routes->get('delete/', 'UserController::delete', ['filter' => 'authFilter:master']); $routes->get('point', 'UserController::form_point', ['filter' => 'authFilter:master']); $routes->post('point', 'UserController::point', ['filter' => 'authFilter:master']); + $routes->post('level', 'UserController::level', ['filter' => 'authFilter:master']); }); }); }); diff --git a/app/Controllers/CLI/Crawler.php b/app/Controllers/CLI/Crawler.php deleted file mode 100644 index 98faebd..0000000 --- a/app/Controllers/CLI/Crawler.php +++ /dev/null @@ -1,24 +0,0 @@ -setDebug($isDebug); - $yamap->execute(); - log_message("notice", "Crawler->" . __FUNCTION__ . " 작업이 완료되었습니다."); - return true; - } catch (\Exception $e) { - log_message("error", $e->getMessage()); - return false; - } - } -} diff --git a/app/Controllers/CLI/Mangboard.php b/app/Controllers/CLI/Mangboard.php deleted file mode 100644 index 7f67838..0000000 --- a/app/Controllers/CLI/Mangboard.php +++ /dev/null @@ -1,24 +0,0 @@ -setDebug($isDebug); - $user->setLevel(); - log_message("notice", "Mangboard->level 작업이 완료되었습니다."); - return true; - } catch (\Exception $e) { - log_message("error", $e->getMessage()); - return false; - } - } -} diff --git a/app/Controllers/Crawler/YamapController.php b/app/Controllers/Crawler/YamapController.php new file mode 100644 index 0000000..bb9e535 --- /dev/null +++ b/app/Controllers/Crawler/YamapController.php @@ -0,0 +1,49 @@ +setDebug($isDebug); + + //1. 사이트 로그인 처리 + $user = $crawler->login(); + $crawler->getMyStorage()->setUser($user); + $items = []; + //2. 해당사이트 MainPage 처리 + if ($crawler->getDebug()) { + $items[] = [ + 'title' => getenv("yamap.view.test.title"), + 'nickname' => getenv("yamap.view.test.nickname"), + 'detail_url' => getenv("yamap.view.test.url"), + 'time' => date("Y-m-d H:i:s"), + 'hit' => 1 + ]; + } else { + $items = $crawler->mainPage(getenv("yamap.list.url")); + } + if (!count($items)) { + throw new \Exception("Yamap 사이트에서 게시물이 존재하지 않습니다."); + } + //최초 게시물만 등록하기 위함 + $item = $items[0]; + //3. DetailPage 처리 : bbs_view > div.contents 가진 객체를 찾아서 처리 + $fileEntitys = $crawler->detailPage($item["detail_url"]); + //4.망보드 일반게시판에 게시물 등록 처리 + $crawler->createBoard($item, $fileEntitys); + log_message("notice", "Crawler->" . __FUNCTION__ . " 작업이 완료되었습니다."); + return true; + } catch (\Exception $e) { + log_message("error", $e->getMessage()); + return false; + } + } +} diff --git a/app/Controllers/Mangboard/Admin/UserController.php b/app/Controllers/Mangboard/Admin/UserController.php index e9f20a2..b1cbf4f 100644 --- a/app/Controllers/Mangboard/Admin/UserController.php +++ b/app/Controllers/Mangboard/Admin/UserController.php @@ -2,8 +2,8 @@ namespace App\Controllers\Mangboard\Admin; -use App\Libraries\Mangboard\UserLibrary; use App\Controllers\Admin\AdminController; +use App\Models\Mangboard\UserModel; class UserController extends AdminController { @@ -20,16 +20,30 @@ class UserController extends AdminController public function point(): string { try { - $id = $this->request->getVar("id"); - $point = intval($this->request->getVar("point")); - $sign = $this->request->getVar("point") ?? "+"; + $id = $this->request->getPost("id"); + $point = intval($this->request->getPost("point")); + $sign = $this->request->getPost("point") ?? "+"; - $user = new UserLibrary(); - $user->setPoint($id, $point, $sign); + $userModel = new UserModel(); + $userModel->setPoint($id, $point, $sign); return "완료되었습니다."; } catch (\Exception $e) { log_message("error", $e->getMessage()); return $e->getMessage(); } } + public function level(...$params): bool + { + try { + $isDebug = in_array("debug", $params); + $userModel = new UserModel(); + $userModel->setDebug($isDebug); + $userModel->setLevel(); + log_message("notice", "Mangboard->level 작업이 완료되었습니다."); + return true; + } catch (\Exception $e) { + log_message("error", $e->getMessage()); + return false; + } + } } diff --git a/app/Libraries/Mangboard/BoardLibrary.php b/app/Libraries/Mangboard/BoardLibrary.php deleted file mode 100644 index 9607404..0000000 --- a/app/Libraries/Mangboard/BoardLibrary.php +++ /dev/null @@ -1,27 +0,0 @@ -_model = $model; - } - public function getModel(): mixed - { - return $this->_model; - } - - public function create(BoardEntity $entity, array $formDatas = []): BoardEntity - { - $entity = $this->getModel()->create($entity, $formDatas); - log_message("debug", __FUNCTION__ . "=>등록이 완료되었습니다."); - return $entity; - } -} diff --git a/app/Libraries/Mangboard/UserLibrary.php b/app/Libraries/Mangboard/UserLibrary.php deleted file mode 100644 index 5cb953f..0000000 --- a/app/Libraries/Mangboard/UserLibrary.php +++ /dev/null @@ -1,98 +0,0 @@ -_model === null) { - return $this->_model = new UserModel(); - } - return $this->_model; - } - - private function checkLevel(UserEntity $entity): UserEntity - { - //Admin용 Level로는 변경불가 - if ($entity->getLevel() == getenv('mangboard.admin.level')) { - // throw new \Exception("Admin용 Level을 변경하실수 없습니다.\n"); - return $entity; - } - - //사용자 Point별 Level 계산 - $level = intval($entity->getPoint() / getenv('mangboard.point.unit') * getenv('mangboard.point.unit') / getenv('mangboard.point.unit')); - - //운영자면 7~9 - if (getenv('mangboard.manager.level.min') <= $level && $level <= getenv('mangboard.manager.level.max')) { - $level = $level < getenv('mangboard.manager.level.min') ? getenv('mangboard.manager.level.min') : $level; - $level = getenv('mangboard.manager.level.max') < $level ? getenv('mangboard.manager.level.max') : $level; - } - // echo "point:" . $entity->getPoint() . ",level:" . $level . "\n"; - - //사용자 Level 1~5; - if (getenv('mangboard.user.level.min') <= $level && $level <= getenv('mangboard.user.level.max')) { - $level = $level < getenv('mangboard.user.level.min') ? getenv('mangboard.user.level.min') : $level; - $level = getenv('mangboard.user.level.max') < $level ? getenv('mangboard.user.level.max') : $level; - } - // echo "point:" . $entity->getPoint() . ",level:" . $level . "\n"; - - //기존정보와 Level값이 다르면 저장 - if ($entity->getLevel() != $level) { - $old_level = $entity->getLevel(); - $entity->setLevel($level); - $entity = $this->getModel()->modify($entity); - log_message("notice", __FUNCTION__ . "=>{$entity}의 Level이 {$old_level}에서 {$entity->getLevel()}로 변경되었습니다."); - } - return $entity; - } - - public function setPoint($id, int $point, $sign = '+'): UserEntity - { - $entity = is_numeric($id) ? $this->getModel()->getEntityByPK(intval($id)) : $this->getModel()->getEntityByID($id); - if (!$entity) { - throw new \Exception("해당 회원[{$id}]이 없습니다."); - } - - switch ($sign) { - case '-': - if ($point < $point) { - throw new \Exception("기존포인트:{$point}가 감소 포인트:-{$point} 작습니다.\n"); - } - $point = $point - $point; - break; - case '+': - $point = $point + $point; - break; - default: - throw new \Exception(__FUNCTION__ . "에서는 {$sign}은 사용할수 없습니다.\n"); - // break; - } - - //기존정보와 Point값이 다르면 저장 - if ($entity->getPoint() != $point) { - $old_point = $entity->getPoint(); - $entity->setPoint($point); - $entity = $this->getModel()->modify($entity); - log_message("notice", __FUNCTION__ . "=>{$entity}의 Point가 {$old_point}에서 {$entity->getPoint()}로 변경되었습니다."); - } - return $this->checkLevel($entity); - } - public function setLevel(): void - { - foreach ($this->getModel()->getEntitys() as $entity) { - $entity = $this->checkLevel($entity); - log_message("debug", __FUNCTION__ . "=>[{$entity}] 회원님의 Level은 {$entity->getLevel()} 입니다."); - } - } -} diff --git a/app/Libraries/MyCrawler/MyCrawlerLibrary.php b/app/Libraries/MyCrawler/MyCrawlerLibrary.php index ecad4c4..3ad3625 100644 --- a/app/Libraries/MyCrawler/MyCrawlerLibrary.php +++ b/app/Libraries/MyCrawler/MyCrawlerLibrary.php @@ -2,9 +2,8 @@ namespace App\Libraries\MyCrawler; -use Symfony\Component\DomCrawler\Crawler; use App\Libraries\CommonLibrary; -use App\Entities\Mangboard\FileEntity; +use Symfony\Component\DomCrawler\Crawler; abstract class MyCrawlerLibrary extends CommonLibrary { @@ -12,9 +11,8 @@ abstract class MyCrawlerLibrary extends CommonLibrary { parent::__construct(); } - abstract protected function getMySocket(); - abstract protected function getMyStorage(); - abstract public function execute(): void; + abstract public function getMySocket(); + abstract public function getMyStorage(); final protected function getContent(string $url, string $tag): Crawler { diff --git a/app/Libraries/MyCrawler/YamapLibrary.php b/app/Libraries/MyCrawler/YamapLibrary.php index 643e386..f7d62be 100644 --- a/app/Libraries/MyCrawler/YamapLibrary.php +++ b/app/Libraries/MyCrawler/YamapLibrary.php @@ -2,43 +2,30 @@ namespace App\Libraries\MyCrawler; - -use Symfony\Component\DomCrawler\Crawler; +use App\Libraries\MySocket\WebLibrary as MySocketLibrary; +use App\Libraries\MyStorage\MangboardLibrary as MyStorageLibrary; use App\Models\Mangboard\UserModel; use App\Models\Mangboard\BoardModel; -use App\Libraries\MySocket\WebLibrary; -use App\Libraries\Mangboard\FileLibrary; -use App\Libraries\Mangboard\BoardLibrary; use App\Entities\Mangboard\BoardEntity; +use App\Entities\Mangboard\UserEntity; +use Symfony\Component\DomCrawler\Crawler; class YamapLibrary extends MyCrawlerLibrary { + private $_userModel = null; + private $_boardModel = null; private $_mySocket = null; private $_myStorage = null; - private $_boardModel = null; public function __construct() { parent::__construct(); } - - protected function getMySocket(): WebLibrary + private function getUserModel(): UserModel { - if ($this->_mySocket === null) { - $this->_mySocket = new WebLibrary(getenv('yamap.host.url')); + if ($this->_userModel === null) { + $this->_userModel = new UserModel(); } - return $this->_mySocket; - } - - protected function getMyStorage(): FileLibrary - { - if ($this->_myStorage === null) { - $this->_myStorage = new FileLibrary(getenv('yamap.storage.upload.path')); - //원래는 mb_board에서 해당Board정보를 읽어서 처리해아함 - $this->_myStorage->setBoardName(getenv('yamap.storage.board.name')); - $this->_myStorage->setBoardTable($this->getBoardModel()->getTable()); - $this->_myStorage->setBoardlevel(getenv('yamap.storage.board.level')); - } - return $this->_myStorage; + return $this->_userModel; } private function getBoardModel(): BoardModel { @@ -48,23 +35,56 @@ class YamapLibrary extends MyCrawlerLibrary return $this->_boardModel; } - private function mainPage(string $url): array + public function getMySocket(): MySocketLibrary + { + if ($this->_mySocket === null) { + $this->_mySocket = new MySocketLibrary(getenv('yamap.host.url')); + } + return $this->_mySocket; + } + + public function getMyStorage(): MyStorageLibrary + { + if ($this->_myStorage === null) { + $this->_myStorage = new MyStorageLibrary(getenv('yamap.storage.upload.path')); + //원래는 mb_board에서 해당Board정보를 읽어서 처리해아함 + $this->_myStorage->setBoardName(getenv('yamap.storage.board.name')); + $this->_myStorage->setBoardTable($this->getBoardModel()->getTable()); + $this->_myStorage->setBoardlevel(getenv('yamap.storage.board.level')); + } + return $this->_myStorage; + } + + public function login(): UserEntity + { + $entity = $this->getUserModel()->getEntityByID("idcjp"); + // $daemonidc = new MySocketLibrary(getenv('daemonidc.host.url')); + // $daemonidc->setDebug($isDebug); + // $daemonidc->login( + // getenv('daemonidc.login.url'), + // getenv('daemonidc.login.user_id'), + // getenv('daemonidc.login.user_password') + // ); + return $entity; + } + + public function mainPage(string $url): array { $crawler = $this->getContent($url, getenv("yamap.list.tag")); - $items = []; + $items = []; //div.bbs_item를 가진 객체를 찾아서 같은 형식의 객체(sibling)를 배열로 넘김 $crawler->filter(getenv("yamap.list.item.tag"))->each( function (Crawler $node) use (&$items): void { //bbs_item에서 span.g_nickname 객체를 찾아서 작성자가 "관리자" 아닌지 확인 후 Return Bool $nickname = $node->filter(getenv("yamap.list.item.nickname.tag"))->text(); - $hit = $node->filter(getenv("yamap.list.item.hit.tag"))->text(); - $date = $node->filter(getenv("yamap.list.item.date.tag"))->text(); + $hit = $node->filter(getenv("yamap.list.item.hit.tag"))->text(); + $date = $node->filter(getenv("yamap.list.item.date.tag"))->text(); if ($nickname != getenv("yamap.list.item.nickname.except")) { //작성자가 "관리자"가 아니 게시물이면 해당 bbs_item에서 a.list_subject 객체를 찾아서 - $link_node = $node->filter(getenv("yamap.list.item.link.tag")); + $link_node = $node->filter(getenv("yamap.list.item.link.tag")); $detail_url = $link_node->attr("href"); - $title = $link_node->children()->last()->text(); - $items[] = ['title' => $title, 'nickname' => $nickname, 'detail_url' => $detail_url, 'date' => $date, 'hit' => $hit]; + $title = $link_node->children()->last()->text(); + $items[] = ['title' => $title, 'nickname' => $nickname, 'detail_url' => $detail_url, 'date' => $date, 'hit' => $hit]; } } ); @@ -74,7 +94,7 @@ class YamapLibrary extends MyCrawlerLibrary return $items; } - private function detailPage(string $url, array $fileEntitys = []): array + public function detailPage(string $url, array $fileEntitys = []): array { $crawler = $this->getContent($url, getenv("yamap.view.content.tag")); //3. Image 처리 @@ -83,23 +103,20 @@ class YamapLibrary extends MyCrawlerLibrary return $this->download("video", $crawler, ["tag" => "video", "attr" => "src"], $fileEntitys); } - private function createBoard(array $item, array $fileEntitys): BoardEntity + public function createBoard(array $item, array $fileEntitys): BoardEntity { - $board = new BoardLibrary($this->getBoardModel()); - $board->setDebug($this->getDebug()); - //미디어관련정보 entity에 넣기 - $entity = new BoardEntity(); - $entity->title = $item["title"]; - $entity->user_pid = $this->getMyStorage()->getUser()->getPK(); - $entity->user_id = $this->getMyStorage()->getUser()->getID(); - $entity->user_name = $item["nickname"] != "" ? $item["nickname"] : $this->getMyStorage()->getUser()->getTitle(); - $entity->level = $this->getMyStorage()->getBoardLevel(); - $entity->hit = $item['hit']; - $entity->reg_date = date("Y-m-d H:i:s", strtotime($item['date'])); - $entity->data_type = "html"; + $entity = new BoardEntity(); + $entity->title = $item["title"]; + $entity->user_pid = $this->getMyStorage()->getUser()->getPK(); + $entity->user_id = $this->getMyStorage()->getUser()->getID(); + $entity->user_name = $item["nickname"] != "" ? $item["nickname"] : $this->getMyStorage()->getUser()->getTitle(); + $entity->level = $this->getMyStorage()->getBoardLevel(); + $entity->hit = $item['hit']; + $entity->reg_date = date("Y-m-d H:i:s", strtotime($item['date'])); + $entity->data_type = "html"; $entity->editor_type = "S"; - $entity->image_path = false; + $entity->image_path = false; foreach ($fileEntitys as $fileEntity) { if ($entity->image_path === false) { $entity->image_path = $fileEntity->getPath() . DIRECTORY_SEPARATOR . $fileEntity->getTitle(); @@ -113,7 +130,8 @@ class YamapLibrary extends MyCrawlerLibrary // echo $entity->reg_date . "\n"; // exit; //망보드 게시판에 등록 - $entity = $board->create($entity); + $entity = $this->getBoardModel()->create($entity); + log_message("debug", __FUNCTION__ . "=>등록이 완료되었습니다."); //망보드 파일관리툴에 등록된 파일게시물에 등록한 게시판번호 수정하기 foreach ($fileEntitys as $fileEntity) { @@ -121,41 +139,4 @@ class YamapLibrary extends MyCrawlerLibrary } return $entity; } - - public function execute(): void - { - //1. 사이트 로그인 처리 - $userModel = new UserModel(); - $user = $userModel->getEntityByID("idcjp"); - // $daemonidc = new MyWebLibrary(getenv('daemonidc.host.url')); - // $daemonidc->setDebug($isDebug); - // $daemonidc->login( - // getenv('daemonidc.login.url'), - // getenv('daemonidc.login.user_id'), - // getenv('daemonidc.login.user_password') - // ); - $this->getMyStorage()->setUser($user); - $items = []; - //2. 해당사이트 MainPage 처리 - if ($this->getDebug()) { - $items[] = [ - 'title' => getenv("yamap.view.test.title"), - 'nickname' => getenv("yamap.view.test.nickname"), - 'detail_url' => getenv("yamap.view.test.url"), - 'time' => date("Y-m-d H:i:s"), - 'hit' => 1 - ]; - } else { - $items = $this->mainPage(getenv("yamap.list.url")); - } - if (!count($items)) { - throw new \Exception("Yamap 사이트에서 게시물이 존재하지 않습니다."); - } - //최초 게시물만 등록하기 위함 - $item = $items[0]; - //3. DetailPage 처리 : bbs_view > div.contents 가진 객체를 찾아서 처리 - $fileEntitys = $this->detailPage($item["detail_url"]); - //4.망보드 일반게시판에 게시물 등록 처리 - $this->createBoard($item, $fileEntitys); - } } diff --git a/app/Libraries/Mangboard/FileLibrary.php b/app/Libraries/MyStorage/MangboardLibrary.php similarity index 95% rename from app/Libraries/Mangboard/FileLibrary.php rename to app/Libraries/MyStorage/MangboardLibrary.php index 428bd81..6bcff8c 100644 --- a/app/Libraries/Mangboard/FileLibrary.php +++ b/app/Libraries/MyStorage/MangboardLibrary.php @@ -1,15 +1,15 @@ getEntity(); } + private function checkLevel(UserEntity $entity): UserEntity + { + //Admin용 Level로는 변경불가 + if ($entity->getLevel() == getenv('mangboard.admin.level')) { + // throw new \Exception("Admin용 Level을 변경하실수 없습니다.\n"); + return $entity; + } + + //사용자 Point별 Level 계산 + $level = intval($entity->getPoint() / getenv('mangboard.point.unit') * getenv('mangboard.point.unit') / getenv('mangboard.point.unit')); + + //운영자면 7~9 + if (getenv('mangboard.manager.level.min') <= $level && $level <= getenv('mangboard.manager.level.max')) { + $level = $level < getenv('mangboard.manager.level.min') ? getenv('mangboard.manager.level.min') : $level; + $level = getenv('mangboard.manager.level.max') < $level ? getenv('mangboard.manager.level.max') : $level; + } + // echo "point:" . $entity->getPoint() . ",level:" . $level . "\n"; + + //사용자 Level 1~5; + if (getenv('mangboard.user.level.min') <= $level && $level <= getenv('mangboard.user.level.max')) { + $level = $level < getenv('mangboard.user.level.min') ? getenv('mangboard.user.level.min') : $level; + $level = getenv('mangboard.user.level.max') < $level ? getenv('mangboard.user.level.max') : $level; + } + // echo "point:" . $entity->getPoint() . ",level:" . $level . "\n"; + + //기존정보와 Level값이 다르면 저장 + if ($entity->getLevel() != $level) { + $old_level = $entity->getLevel(); + $entity->setLevel($level); + $entity = $this->modify($entity); + log_message("notice", __FUNCTION__ . "=>{$entity}의 Level이 {$old_level}에서 {$entity->getLevel()}로 변경되었습니다."); + } + return $entity; + } + + public function setPoint($id, int $point, $sign = '+'): UserEntity + { + $entity = is_numeric($id) ? $this->getEntityByPK(intval($id)) : $this->getEntityByID($id); + if (!$entity) { + throw new \Exception("해당 회원[{$id}]이 없습니다."); + } + + switch ($sign) { + case '-': + if ($point < $point) { + throw new \Exception("기존포인트:{$point}가 감소 포인트:-{$point} 작습니다.\n"); + } + $point = $point - $point; + break; + case '+': + $point = $point + $point; + break; + default: + throw new \Exception(__FUNCTION__ . "에서는 {$sign}은 사용할수 없습니다.\n"); + // break; + } + + //기존정보와 Point값이 다르면 저장 + if ($entity->getPoint() != $point) { + $old_point = $entity->getPoint(); + $entity->setPoint($point); + $entity = $this->modify($entity); + log_message("notice", __FUNCTION__ . "=>{$entity}의 Point가 {$old_point}에서 {$entity->getPoint()}로 변경되었습니다."); + } + return $this->checkLevel($entity); + } + public function setLevel(): void + { + foreach ($this->getEntitys() as $entity) { + $entity = $this->checkLevel($entity); + log_message("debug", __FUNCTION__ . "=>[{$entity}] 회원님의 Level은 {$entity->getLevel()} 입니다."); + } + } + //create용 public function create(UserEntity $entity): UserEntity {