<?php
// ============================================================
// RSS 타격기 : webbot_news_striker_rss.php
// RSS 긁고 필터링하고 저장하고 퇴근
// ============================================================
// RSS 긁기
echo "RSS 시작: {$url}\n";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTPHEADER => ['Accept: application/rss+xml, application/xml, text/xml'],
]);
$raw = curl_exec($ch);
curl_close($ch);
echo "RSS 응답 길이: " . strlen($raw) . "\n";
if (!$raw) return;
// XML 파싱
libxml_use_internal_errors(true);
$xml = simplexml_load_string($raw);
if (!$xml) return;
$items = $xml->channel->item ?? [];
foreach ($items as $item) {
$title = trim((string)$item->title);
$content = trim((string)$item->description);
$link = trim((string)$item->link);
$pubdate = trim((string)$item->pubDate);
if (empty($title)) continue;
// 검색어 필터링 (제목 또는 내용에 검색어 하나라도 포함)
if (!empty($keywords)) {
$matched = false;
foreach ($keywords as $kw) {
if ($kw && (mb_strpos($title, $kw) !== false || mb_strpos($content, $kw) !== false)) {
$matched = true;
break;
}
}
if (!$matched) continue;
}
// 필터링어 제외 (제목 또는 내용에 필터링어 포함 시 제외)
if (!empty($filters)) {
$blocked = false;
foreach ($filters as $ft) {
if ($ft && (mb_strpos($title, $ft) !== false || mb_strpos($content, $ft) !== false)) {
$blocked = true;
break;
}
}
if ($blocked) continue;
}
// 중복 체크 (같은 링크 이미 있으면 패스)
$esc_link = $pdo_gnu->quote($link);
$check = $pdo_gnu->query("SELECT wr_id FROM {$target_table} WHERE wr_link1 = {$esc_link} LIMIT 1");
if ($check && $check->fetchColumn()) continue;
// INSERT
$esc_title = $pdo_gnu->quote($title);
$esc_content = $pdo_gnu->quote($content);
$esc_link = $pdo_gnu->quote($link);
$esc_name = $pdo_gnu->quote($korean_name);
$esc_ca = $pdo_gnu->quote($ca_name);
$esc_kw = $pdo_gnu->quote($keywords_raw);
$esc_ft = $pdo_gnu->quote($filters_raw);
$esc_date = $pdo_gnu->quote($pubdate ? date('Y-m-d H:i:s', strtotime($pubdate)) : date('Y-m-d H:i:s'));
$pdo_gnu->query("
INSERT INTO {$target_table}
(wr_subject, wr_content, wr_link1, wr_datetime, wr_last,
x2_korean_name, ca_name, x2_ca2, x2_ca3,
wr_num, wr_parent, wr_is_comment, wr_comment, wr_hit, wr_good, wr_nogood,
mb_id, wr_password, wr_name, wr_email, wr_homepage, wr_ip)
VALUES
({$esc_title}, {$esc_content}, {$esc_link}, {$esc_date}, NOW(),
{$esc_name}, {$esc_ca}, {$esc_kw}, {$esc_ft},
0, 0, 0, 0, 0, 0, 0,
'', '', '', '', '', 'daemon')
");
// wr_num, wr_parent 업데이트
$new_id = $pdo_gnu->lastInsertId();
$pdo_gnu->query("UPDATE {$target_table} SET wr_num = -{$new_id}, wr_parent = {$new_id} WHERE wr_id = {$new_id}");
}