1000本突破
1000本突破

PHPでRSSを取得

づや

PHPでRSSを取得したくていろいろ調べていました。

たくさんのサイトで取得方法は載っていたのでmagpierss-0.71.1というパーサーで取得してみました。

//RSSの情報を取得
$rss = @fetch_rss($url);
$title = $rss->channel['title'];
foreach ($rss->items as $item ) {
// itemの中の情報を取得
$title = htmlspecialchars($item['title']);
$description = htmlspecialchars($item['description']);
$url   = htmlspecialchars($item['link']);
$date = htmlspecialchars($item['dc']['date']);
}

って感じに情報を取得して、適当にechoで表示させたりしてたのですが、

更新時間がとれたりとれなかったりする。

それで調べたら、

$date = htmlspecialchars($item['dc']['date']);

これはRSS1.0の形式らしい。

$date = htmlspecialchars($item['pubdate'])

RSS2.0はこんな感じでとれるみたい。 なのでとりあえず両方に対応するために、日付取得部分は下のような感じにしました。 ついでにフォーマットもyyyy/mm/dd hh:ii:ssの形に直して取得してみました。

// 取り合えずRSS1.0の形で取得
$date = htmlspecialchars($item['dc']['date']);
if ($date == null || strcasecmp($date,"") == 0) {
    // とれてなかったらRSS2.0の形で取得。ついでにフォーマット
    $date = htmlspecialchars(Date("Y/m/d H:i:s", strtotime($item['pubdate'])));
} else {
    // とれてたら、フォーマット
    $date = Date('Y/n/j H:i:s',strtotime(substr($date,0,19)));
}

こんなんでとりあえず更新日時が無事取得できました。

もうちょっとスマートにできそうな気がするけど、とりあえず良しとしようかな。

2010年追記
昔のブログ記事を読み返す機会に恵まれたので追記を。
上記のコードはバージョン判定がひどいね。

今なら日付の所は下記のような感じだろうか。

$rss = @fetch_rss($url);
foreach ($rss->items as $item ) {
// $rss->feed_typeにAtomかRSSかの値が入るので判定
if($rss->feed_type == 'Atom' ){
    // Atomの場合の処理
} else if($rss->feed_type == 'RSS'){
    //  $rss->feed_versionでバージョンがとれるので判定
    if($rss->feed_version == '2.0'){
        // RSS2.0の場合の処理
    } else if($rss->feed_version == '1.0'){
        // RSS1.0の場合の処理
    }
}
}

これだけじゃなんなので、magpierssで良く使う設定も書こう。
fetch_rssを呼ぶ前に定数でいろいろ指定すると、設定を変更できる
よく使うのだけメモ

// 出力時の文字コードの指定
define('MAGPIE_OUTPUT_ENCODING', '希望の文字コー');
// キャッシュ機能をつかうか。デフォルトは使う。迷惑にならないよう使うほうがいいからあんま変えない
define("MAGPIE_CACHE_ON",false);
// キャッシュの場所の指定。パーミッションが適切ならフォルダから作ってくれる
define("MAGPIE_CACHE_DIR",'キャッシュを保存するフォルダのパス');
// キャッシュ有効期間 適切に デフォルトは1時間
define('MAGPIE_CACHE_AGE',60*60);

あと、テスト環境でbasic認証をかけてる場合とかは、そのまま使うと取得がエラーになる。
取得につかってるSnoopy.classをnewしてるとこで、認証用のユーザとパスワードを渡せば取得できるようになる。