DATA/OTHER/news/webbot_news_striker_rss.php
<?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}");
}