fetch_rss.php

<?php
// データベース接続設定
$serverName = $_SERVER['SERVER_NAME'];
if ($serverName === 'localhost' || $serverName === '127.0.0.1') {
    // ローカル環境
    $dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
    $username = 'your_username';
    $password = 'your_password';
} else {
    // サーバ環境
    $dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
    $username = 'your_username';
    $password = 'your_password';
}

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    error_log("Database connection error: " . $e->getMessage());
    exit;
}

// 指定期間(例:7日間)のデータと比較して類似チェック
function isSimilar($pdo, $title, $description, $days = 7, $threshold = 80)
{
    $stmt = $pdo->prepare("
        SELECT title, description 
        FROM rss_articles 
        WHERE pub_date >= NOW() - INTERVAL :days DAY
    ");
    $stmt->execute([':days' => $days]);
    $articles = $stmt->fetchAll();

    foreach ($articles as $article) {
        similar_text($title, $article['title'], $percentTitle);
        similar_text(strip_tags($description), strip_tags($article['description']), $percentDescription);

        if ($percentTitle > $threshold || $percentDescription > $threshold) {
            return true; // 類似データあり
        }
    }
    return false;
}

// 有効なRSSフィードURLをカテゴリごとに取得
$stmt = $pdo->query("SELECT feed_url, category FROM rss_feeds WHERE active = 1");
$rssFeeds = $stmt->fetchAll();

foreach ($rssFeeds as $feedData) {
    $feedUrl = $feedData['feed_url'];
    $category = $feedData['category'];

    $rss = @simplexml_load_file($feedUrl);
    if (!$rss) {
        error_log("Failed to fetch RSS feed: $feedUrl");
        continue;
    }

    foreach ($rss->channel->item as $item) {
        $title = (string)$item->title;
        $link = (string)$item->link;
        $description = (string)$item->description;
        $pubDate = date('Y-m-d H:i:s', strtotime((string)$item->pubDate));

        // 類似チェック&保存
        if (!isSimilar($pdo, $title, $description)) {
            $stmt = $pdo->prepare("
                INSERT IGNORE INTO rss_articles (title, link, description, pub_date, category)
                VALUES (:title, :link, :description, :pub_date, :category)
            ");
            $stmt->execute([
                ':title' => $title,
                ':link' => $link,
                ':description' => $description,
                ':pub_date' => $pubDate,
                ':category' => $category
            ]);
        }
    }
}

echo "RSS fetch completed.\n";

Today : 1 / Yesterday : 2 / Total : 19

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2025-02-22 (土) 12:11:15