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