네이버 블로그 글 가져오기 채택완료
토루크막토
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 포인트
미니님a
Expert
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개월 전
네 블로그는 글은 크로싱할수잇지만 이미지를 허용되지않습니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
제 사이트에서는 안되더니 새로 깔끔히 설치한 그누보드 원본에서는 잘 되네요. ㅠ_ㅠ
또다른 문제는 이 파일을 실행할 때 마다 중복적으로 계속 글을 반복해서 가져오는 오류가 있네요.
원본 파일 제작자님이 설명하는 크론잡으로 실행하면 큰일 날 듯.
블로그 글을 이미지까지 전부 가져오는 줄 알았더니 제가 착각한 것 같습니다.
결론은 사용은 못할 거 같네요.
아 노가다로 글 가져오기 힘들어서 잔머리 좀 굴려볼까 했는데 ㅠ_ㅠ