네이버 블로그 글 가져오기

네이버 블로그 글 가져오기

QA

네이버 블로그 글 가져오기

답변 1

그누보드5(영카트) 버전

5.6.15

사용 PHP 버전

7.4

본문

안녕하세요. 

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

 

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

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

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

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

 


 
<?php
// common.php 파일을 포함시켜 기본 환경 구성을 로드합니다.
include_once('./_common.php');
$password = get_encrypt_string('password');
// 게시글 작성 함수
function write_board($bo_table, $subject, $content, $link, $media, $pub_date, $mb_id, $nickname, $password) {
    global $g5;
    // 게시판 테이블
    $write_table = $g5['write_prefix'] . $bo_table;
    // 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);
    // 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;
    //시글 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();
    $sql = " UPDATE `$write_table` SET wr_parent = '{$wr_id}' WHERE wr_id = '{$wr_id}' ";
    sql_query($sql);
    $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);
    return $wr_id;
}
// HTML 태그와 CSS 스타일 요소 제거하는 함수
function strip_html_css($content) {
    // HTML 태그와 CSS 스타일 요소 제거
    $content = preg_replace('/<[^>]+>/', '', $content);
    return $content;
}
// 게시글 작성 실행
$bo_table = 'eagle'; // 게시판 테이블명
$mb_id = 'eagle'; // 게시글 작성자 ID
$nickname = '이글이글'; // 게시글 작성자 닉네임
// RSS 주소에서 데이터 가져오기
$url = 'https://rss.blog.naver.com/kim-eagle.xml';
// 1. 원본 XML 문자열 가져오기
$data = @file_get_contents($url);
if ($data === false) {
    error_log("RSS 파일 불러오기 실패: {$url}", 3, '/tmp/php_error.log');
    echo "RSS 파일 불러오기 실패<br>";
    exit;
}
// 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 파싱 에러<br>";
    exit;
}
// 게시글 작성
foreach ($rss->channel->item as $item) {
    $subject = $item->title;
    $content = $item->description;
    $link = $item->link;
    $media = ''; // 미디어 URL 초기화
    $pub_date = $item->pubDate; // pubDate 가져오기
    // 미디어 콘텐츠 가져오기
    if ($item->children('media', true)->content) {
        $media = (string)$item->children('media', true)->content->attributes()['url'];
    }
    // HTML 태그와 CSS 스타일 요소 제거
    $subject = strip_html_css($subject);
    $content = strip_html_css($content);
    // 미디어 요소를 img 태그로 변환
    $media_html = '';
    if ($media) {
        $media_html = "<img src=\"{$media}\" title=\"{$subject}\">";
    }
    // 콘텐츠 안의 텍스트 가져오기 (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);
    // pubDate를 최상단에 위치하도록 수정
    $content_with_media = $pub_date . "<br>" . $media_html . "<br>" . $content_text . "<br>" . "<center><a href=\"{$link}\">[출처]</a></center>";
    
    echo $content_with_media;
    $wr_id = write_board($bo_table, $subject, $content_with_media, $link, $media, $pub_date, $mb_id, $nickname, $password);
    if ($wr_id > 0) {
        echo "게시글이 정상적으로 등록되었습니다. ?<br>";
        echo "제목: {$subject}<br>";
        echo "링크: <a href=\"{$link}\">{$link}</a><br>";
        if ($media) {
            echo "미디어 첨부: {$media_html}<br>";
        }
        echo "작성일: {$pub_date}<br>";
    } else {
        echo "게시글 등록에 실패하였습니다. ?<br>";
    }
}
?>

 

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

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

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

 

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

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

 

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


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

이 질문에 댓글 쓰기 :

답변 1

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

 


 
<?php
// common.php 파일을 포함시켜 기본 환경 구성을 로드합니다.
include_once('./_common.php');
$password = get_encrypt_string('password');
 
// 게시글 작성 함수 (write_table에 wr_id가 실제로 들어가는지 확인 및 wr_parent, wr_num 처리 보완)
function write_board($bo_table, $subject, $content, $link, $media, $pub_date, $mb_id, $nickname, $password) {
    global $g5;
    $write_table = $g5['write_prefix'] . $bo_table;
 
    // 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);
 
    // wr_num 최대값 조회 (최신글 wr_num이 가장 작음)
    $sql = "SELECT MIN(wr_num) as min_wr_num FROM `$write_table`";
    $row = sql_fetch($sql);
    $wr_num = ($row && isset($row['min_wr_num'])) ? $row['min_wr_num'] - 1 : 0;
 
    // wr_id 자동 증가, wr_parent는 wr_id로 나중에 업데이트
    $sql = "INSERT INTO `$write_table`
                SET wr_num = '{$wr_num}',
                    wr_reply = '',
                    wr_comment = 0,
                    ca_name = '',
                    wr_option = 'html1',
                    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();
 
    // wr_parent를 wr_id로 업데이트
    $sql = "UPDATE `$write_table` SET wr_parent = '{$wr_id}' WHERE wr_id = '{$wr_id}'";
    sql_query($sql);
 
    // board_new 테이블에 등록
    $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);
 
    // board 테이블의 글 수 증가
    $sql = "UPDATE `{$g5['board_table']}`
                SET bo_count_write = bo_count_write + 1
                WHERE bo_table = '{$bo_table}'";
    sql_query($sql);
 
    return $wr_id;
}
 
// HTML 태그와 CSS 스타일 요소 제거하는 함수
function strip_html_css($content) {
    $content = preg_replace('/<[^>]+>/', '', $content);
    return $content;
}
 
// 게시글 작성 실행
$bo_table = 'eagle'; // 게시판 테이블명
$mb_id = 'eagle'; // 게시글 작성자 ID
$nickname = '이글이글'; // 게시글 작성자 닉네임
 
// RSS 주소에서 데이터 가져오기
$url = 'https://rss.blog.naver.com/kim-eagle.xml';
$data = @file_get_contents($url);
if ($data === false) {
    error_log("RSS 파일 불러오기 실패: {$url}", 3, '/tmp/php_error.log');
    echo "RSS 파일 불러오기 실패<br>";
    exit;
}
 
$rss = @simplexml_load_string($data);
if ($rss === false) {
    error_log("RSS XML 파싱 실패: " . print_r($data, true), 3, '/tmp/php_error.log');
    echo "RSS XML 파싱 에러<br>";
    exit;
}
 
// 게시글 작성
foreach ($rss->channel->item as $item) {
    $subject = $item->title;
    $content = $item->description;
    $link = $item->link;
    $media = '';
    $pub_date = $item->pubDate;
 
    // 미디어 콘텐츠 가져오기
    if ($item->children('media', true)->content) {
        $media = (string)$item->children('media', true)->content->attributes()['url'];
    }
 
    // HTML 태그와 CSS 스타일 요소 제거
    $subject = strip_html_css($subject);
    $content = strip_html_css($content);
 
    // 미디어 요소를 img 태그로 변환
    $media_html = '';
    if ($media) {
        $media_html = "<img src=\"{$media}\" title=\"{$subject}\">";
    }
 
    // 콘텐츠 안의 텍스트 가져오기 (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);
 
    // pubDate를 최상단에 위치하도록 수정
    $content_with_media = $pub_date . "<br>" . $media_html . "<br>" . $content_text . "<br>" . "<center><a href=\"{$link}\">[출처]</a></center>";
 
    echo $content_with_media;
    $wr_id = write_board($bo_table, $subject, $content_with_media, $link, $media, $pub_date, $mb_id, $nickname, $password);
    if ($wr_id > 0) {
        echo "게시글이 정상적으로 등록되었습니다.<br>";
        echo "제목: {$subject}<br>";
        echo "링크: <a href=\"{$link}\">{$link}</a><br>";
        if ($media) {
            echo "미디어 첨부: {$media_html}<br>";
        }
        echo "작성일: {$pub_date}<br>";
    } else {
        echo "게시글 등록에 실패하였습니다.<br>";
    }
}
?>
 

 

978180634_1756285077.0689.png

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

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

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 129,102
© SIRSOFT
현재 페이지 제일 처음으로