테스트 사이트 - 개발 중인 베타 버전입니다

네이버 블로그 글 가져오기 채택완료

토루크막토 2개월 전 조회 543

안녕하세요. 

그누보드 플러그인을 다운받아서 적용하는데 잘 되지 않아서 질문을 드립니다.

 

https://sir.kr/g5_plugin/12204">rss를 가져와 게시글 자동 게시 > 그누보드5 플러그인
위 링크의 파일을 사용중입니다.

게시글 등록이 되지 않아서 어디가 문제인지 살펴보고 있는데

혼자서 해결이 않되네요 ㅠ_ㅠ

고수님의 도움을 요청드립니다.

 

 </p>

<p><?php

// common.php 파일을 포함시켜 기본 환경 구성을 로드합니다.

include_once('./_common.php');</p>

<p>$password = get_encrypt_string('password');</p>

<p>// 게시글 작성 함수

function write_board($bo_table, $subject, $content, $link, $media, $pub_date, $mb_id, $nickname, $password) {

    global $g5;</p>

<p>    // 게시판 테이블

    $write_table = $g5['write_prefix'] . $bo_table;</p>

<p>    // SQL 인젝션 방지를 위해 escape 처리를 합니다.

    $subject = sql_real_escape_string($subject);

    $content = sql_real_escape_string($content);

    $link = sql_real_escape_string($link);

    $media = sql_real_escape_string($media);

    $pub_date = sql_real_escape_string($pub_date);

    $mb_id = sql_real_escape_string($mb_id);

    $nickname = sql_real_escape_string($nickname);</p>

<p>    // wr_num 최대값 조회

    $sql = " SELECT MAX(wr_num) as max_wr_num FROM `$write_table` ";

    $row = sql_fetch($sql);

    $wr_num = ($row && $row['max_wr_num']) ? $row['max_wr_num'] -1 : 0;</p>

<p>    //시글 DB에 추가

    $sql = " INSERT INTO `$write_table`

                SET wr_num = '{$wr_num}',

                    wr_reply = '',

                    wr_comment = 0,

                    ca_name = '',

                    wr_option = '2', //html2 옵션으로 저장해야 이미지 등록 가능, 오류 발생 시 이 주석 삭제

                    wr_subject = '{$subject}',

                    wr_content = '{$content}',

                    wr_link1 = '{$link}',

                    wr_link2 = '{$media}',

                    wr_hit = 0,

                    wr_good = 0,

                    wr_nogood = 0,

                    mb_id = '{$mb_id}',

                    wr_password = '{$password}',

                    wr_name = '{$nickname}',

                    wr_email = '',

                    wr_datetime = '".G5_TIME_YMDHIS."',

                    wr_last = '".G5_TIME_YMDHIS."',

                    wr_ip = '".$_SERVER['REMOTE_ADDR']."',

                    wr_1 = '',

                    wr_2 = '',

                    wr_3 = '',

                    wr_4 = '',

                    wr_5 = '';

            ";

    sql_query($sql);

    $wr_id = sql_insert_id();</p>

<p>    $sql = " UPDATE `$write_table` SET wr_parent = '{$wr_id}' WHERE wr_id = '{$wr_id}' ";

    sql_query($sql);</p>

<p>    $sql = " INSERT INTO `{$g5['board_new_table']}`

                SET bo_table = '{$bo_table}',

                    wr_id = '{$wr_id}',

                    wr_parent = '{$wr_id}',

                    bn_datetime = '".G5_TIME_YMDHIS."',

                    mb_id = '{$mb_id}' ";

    sql_query($sql);

    

    $sql = " UPDATE `{$g5['board_table']}`

                SET bo_count_write = bo_count_write + 1

                WHERE bo_table = '{$bo_table}' ";

    sql_query($sql);</p>

<p>    return $wr_id;

}</p>

<p>// HTML 태그와 CSS 스타일 요소 제거하는 함수

function strip_html_css($content) {

    // HTML 태그와 CSS 스타일 요소 제거

    $content = preg_replace('/<[^>]+>/', '', $content);

    return $content;

}</p>

<p>// 게시글 작성 실행

$bo_table = 'eagle'; // 게시판 테이블명

$mb_id = 'eagle'; // 게시글 작성자 ID

$nickname = '이글이글'; // 게시글 작성자 닉네임</p>

<p>// RSS 주소에서 데이터 가져오기

$url = '<a href="https://rss.blog.naver.com/kim-eagle.xml';" target="_blank" rel="noopener noreferrer">https://rss.blog.naver.com/kim-eagle.xml';</a></p>

<p>// 1. 원본 XML 문자열 가져오기

$data = @file_get_contents($url);

if ($data === false) {

    error_log("RSS 파일 불러오기 실패: {$url}", 3, '/tmp/php_error.log');

    echo "RSS 파일 불러오기 실패
";

    exit;

}</p>

<p>// 2. XML 문자열을 SimpleXML 객체로 파싱

$rss = @simplexml_load_string($data);

if ($rss === false) {

    error_log("RSS XML 파싱 실패: " . print_r($data, true), 3, '/tmp/php_error.log');

    echo "RSS XML 파싱 에러
";

    exit;

}</p>

<p>// 게시글 작성

foreach ($rss->channel->item as $item) {

    $subject = $item->title;

    $content = $item->description;

    $link = $item->link;

    $media = ''; // 미디어 URL 초기화

    $pub_date = $item->pubDate; // pubDate 가져오기</p>

<p>    // 미디어 콘텐츠 가져오기

    if ($item->children('media', true)->content) {

        $media = (string)$item->children('media', true)->content->attributes()['url'];

    }</p>

<p>    // HTML 태그와 CSS 스타일 요소 제거

    $subject = strip_html_css($subject);

    $content = strip_html_css($content);</p>

<p>    // 미디어 요소를 img 태그로 변환

    $media_html = '';

    if ($media) {

        $media_html = "<img src=\"{$media}\" title=\"{$subject}\">";

    }</p>

<p>    // 콘텐츠 안의 텍스트 가져오기 (10줄로 제한)

    $content_text = strip_tags($content);

    $content_lines = explode("\n", $content_text);

    $content_lines = array_slice($content_lines, 0, 10);

    $content_text = implode("\n", $content_lines);</p>

<p>    // pubDate를 최상단에 위치하도록 수정

    $content_with_media = $pub_date . "
" . $media_html . "
" . $content_text . "
" . "<center><a href=\"{$link}\">[출처]</a></center>";

    

    echo $content_with_media;</p>

<p>    $wr_id = write_board($bo_table, $subject, $content_with_media, $link, $media, $pub_date, $mb_id, $nickname, $password);

    if ($wr_id > 0) {

        echo "게시글이 정상적으로 등록되었습니다. ?
";

        echo "제목: {$subject}
";

        echo "링크: <a href=\"{$link}\">{$link}</a>
";

        if ($media) {

            echo "미디어 첨부: {$media_html}
";

        }

        echo "작성일: {$pub_date}
";

    } else {

        echo "게시글 등록에 실패하였습니다. ?
";

    }

}</p>

<p>?></p>

<p>

 

위 처럼 사용하고 있고 실행을 하면

파싱도 잘 되는지 블로그 글의 내용이 잘 나옵니다.

또한 board_new_table 까지는 잘 들어가는지 phpmyadmin에서 보면 내용과 번호가 증가해 있습니다.

 

하지만 실제 eagle이라는 게시판에는 아무런 글이 들어가지 않으며

단순히 페이지 수만 증가되어 있습니다.

 

소스의 어느부분을 수정해야 할까요?


미리 감사드립니다. (^^)(__)

댓글을 작성하려면 로그인이 필요합니다.

답변 1개

채택된 답변
+20 포인트
2개월 전

아래 코드로 해보시겠어요 ? 테스트 해보니깐 잘되네요

 

</p>

<p> </p>

<p><?php</p>

<p>// common.php 파일을 포함시켜 기본 환경 구성을 로드합니다.</p>

<p>include_once('./_common.php');</p>

<p>$password = get_encrypt_string('password');</p>

<p> </p>

<p>// 게시글 작성 함수 (write_table에 wr_id가 실제로 들어가는지 확인 및 wr_parent, wr_num 처리 보완)</p>

<p>function write_board($bo_table, $subject, $content, $link, $media, $pub_date, $mb_id, $nickname, $password) {</p>

<p>    global $g5;</p>

<p>    $write_table = $g5['write_prefix'] . $bo_table;</p>

<p> </p>

<p>    // SQL 인젝션 방지를 위해 escape 처리</p>

<p>    $subject = sql_real_escape_string($subject);</p>

<p>    $content = sql_real_escape_string($content);</p>

<p>    $link = sql_real_escape_string($link);</p>

<p>    $media = sql_real_escape_string($media);</p>

<p>    $pub_date = sql_real_escape_string($pub_date);</p>

<p>    $mb_id = sql_real_escape_string($mb_id);</p>

<p>    $nickname = sql_real_escape_string($nickname);</p>

<p> </p>

<p>    // wr_num 최대값 조회 (최신글 wr_num이 가장 작음)</p>

<p>    $sql = "SELECT MIN(wr_num) as min_wr_num FROM `$write_table`";</p>

<p>    $row = sql_fetch($sql);</p>

<p>    $wr_num = ($row && isset($row['min_wr_num'])) ? $row['min_wr_num'] - 1 : 0;</p>

<p> </p>

<p>    // wr_id 자동 증가, wr_parent는 wr_id로 나중에 업데이트</p>

<p>    $sql = "INSERT INTO `$write_table`</p>

<p>                SET wr_num = '{$wr_num}',</p>

<p>                    wr_reply = '',</p>

<p>                    wr_comment = 0,</p>

<p>                    ca_name = '',</p>

<p>                    wr_option = 'html1',</p>

<p>                    wr_subject = '{$subject}',</p>

<p>                    wr_content = '{$content}',</p>

<p>                    wr_link1 = '{$link}',</p>

<p>                    wr_link2 = '{$media}',</p>

<p>                    wr_hit = 0,</p>

<p>                    wr_good = 0,</p>

<p>                    wr_nogood = 0,</p>

<p>                    mb_id = '{$mb_id}',</p>

<p>                    wr_password = '{$password}',</p>

<p>                    wr_name = '{$nickname}',</p>

<p>                    wr_email = '',</p>

<p>                    wr_datetime = '".G5_TIME_YMDHIS."',</p>

<p>                    wr_last = '".G5_TIME_YMDHIS."',</p>

<p>                    wr_ip = '".$_SERVER['REMOTE_ADDR']."',</p>

<p>                    wr_1 = '',</p>

<p>                    wr_2 = '',</p>

<p>                    wr_3 = '',</p>

<p>                    wr_4 = '',</p>

<p>                    wr_5 = ''";</p>

<p>    sql_query($sql);</p>

<p> </p>

<p>    $wr_id = sql_insert_id();</p>

<p> </p>

<p>    // wr_parent를 wr_id로 업데이트</p>

<p>    $sql = "UPDATE `$write_table` SET wr_parent = '{$wr_id}' WHERE wr_id = '{$wr_id}'";</p>

<p>    sql_query($sql);</p>

<p> </p>

<p>    // board_new 테이블에 등록</p>

<p>    $sql = "INSERT INTO `{$g5['board_new_table']}`</p>

<p>                SET bo_table = '{$bo_table}',</p>

<p>                    wr_id = '{$wr_id}',</p>

<p>                    wr_parent = '{$wr_id}',</p>

<p>                    bn_datetime = '".G5_TIME_YMDHIS."',</p>

<p>                    mb_id = '{$mb_id}'";</p>

<p>    sql_query($sql);</p>

<p> </p>

<p>    // board 테이블의 글 수 증가</p>

<p>    $sql = "UPDATE `{$g5['board_table']}`</p>

<p>                SET bo_count_write = bo_count_write + 1</p>

<p>                WHERE bo_table = '{$bo_table}'";</p>

<p>    sql_query($sql);</p>

<p> </p>

<p>    return $wr_id;</p>

<p>}</p>

<p> </p>

<p>// HTML 태그와 CSS 스타일 요소 제거하는 함수</p>

<p>function strip_html_css($content) {</p>

<p>    $content = preg_replace('/<[^>]+>/', '', $content);</p>

<p>    return $content;</p>

<p>}</p>

<p> </p>

<p>// 게시글 작성 실행</p>

<p>$bo_table = 'eagle'; // 게시판 테이블명</p>

<p>$mb_id = 'eagle'; // 게시글 작성자 ID</p>

<p>$nickname = '이글이글'; // 게시글 작성자 닉네임</p>

<p> </p>

<p>// RSS 주소에서 데이터 가져오기</p>

<p>$url = '<a href="https://rss.blog.naver.com/kim-eagle.xml';" target="_blank" rel="noopener noreferrer">https://rss.blog.naver.com/kim-eagle.xml';</a></p>

<p>$data = @file_get_contents($url);</p>

<p>if ($data === false) {</p>

<p>    error_log("RSS 파일 불러오기 실패: {$url}", 3, '/tmp/php_error.log');</p>

<p>    echo "RSS 파일 불러오기 실패
";</p>

<p>    exit;</p>

<p>}</p>

<p> </p>

<p>$rss = @simplexml_load_string($data);</p>

<p>if ($rss === false) {</p>

<p>    error_log("RSS XML 파싱 실패: " . print_r($data, true), 3, '/tmp/php_error.log');</p>

<p>    echo "RSS XML 파싱 에러
";</p>

<p>    exit;</p>

<p>}</p>

<p> </p>

<p>// 게시글 작성</p>

<p>foreach ($rss->channel->item as $item) {</p>

<p>    $subject = $item->title;</p>

<p>    $content = $item->description;</p>

<p>    $link = $item->link;</p>

<p>    $media = '';</p>

<p>    $pub_date = $item->pubDate;</p>

<p> </p>

<p>    // 미디어 콘텐츠 가져오기</p>

<p>    if ($item->children('media', true)->content) {</p>

<p>        $media = (string)$item->children('media', true)->content->attributes()['url'];</p>

<p>    }</p>

<p> </p>

<p>    // HTML 태그와 CSS 스타일 요소 제거</p>

<p>    $subject = strip_html_css($subject);</p>

<p>    $content = strip_html_css($content);</p>

<p> </p>

<p>    // 미디어 요소를 img 태그로 변환</p>

<p>    $media_html = '';</p>

<p>    if ($media) {</p>

<p>        $media_html = "<img src=\"{$media}\" title=\"{$subject}\">";</p>

<p>    }</p>

<p> </p>

<p>    // 콘텐츠 안의 텍스트 가져오기 (10줄로 제한)</p>

<p>    $content_text = strip_tags($content);</p>

<p>    $content_lines = explode("\n", $content_text);</p>

<p>    $content_lines = array_slice($content_lines, 0, 10);</p>

<p>    $content_text = implode("\n", $content_lines);</p>

<p> </p>

<p>    // pubDate를 최상단에 위치하도록 수정</p>

<p>    $content_with_media = $pub_date . "
" . $media_html . "
" . $content_text . "
" . "<center><a href=\"{$link}\">[출처]</a></center>";</p>

<p> </p>

<p>    echo $content_with_media;</p>

<p>    $wr_id = write_board($bo_table, $subject, $content_with_media, $link, $media, $pub_date, $mb_id, $nickname, $password);</p>

<p>    if ($wr_id > 0) {</p>

<p>        echo "게시글이 정상적으로 등록되었습니다.
";</p>

<p>        echo "제목: {$subject}
";</p>

<p>        echo "링크: <a href=\"{$link}\">{$link}</a>
";</p>

<p>        if ($media) {</p>

<p>            echo "미디어 첨부: {$media_html}
";</p>

<p>        }</p>

<p>        echo "작성일: {$pub_date}
";</p>

<p>    } else {</p>

<p>        echo "게시글 등록에 실패하였습니다.
";</p>

<p>    }</p>

<p>}</p>

<p>?></p>

<p> </p>

<p>

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

토루크막토
2개월 전
감사합니다!!
제 사이트에서는 안되더니 새로 깔끔히 설치한 그누보드 원본에서는 잘 되네요. ㅠ_ㅠ
또다른 문제는 이 파일을 실행할 때 마다 중복적으로 계속 글을 반복해서 가져오는 오류가 있네요.
원본 파일 제작자님이 설명하는 크론잡으로 실행하면 큰일 날 듯.

블로그 글을 이미지까지 전부 가져오는 줄 알았더니 제가 착각한 것 같습니다.
결론은 사용은 못할 거 같네요.
아 노가다로 글 가져오기 힘들어서 잔머리 좀 굴려볼까 했는데 ㅠ_ㅠ
웅푸
2개월 전
네 블로그는 글은 크로싱할수잇지만 이미지를 허용되지않습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인