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してるとこで、認証用のユーザとパスワードを渡せば取得できるようになる。LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。