【Magpie RSS】RSS内に入り込む広告をスキップする
自分のサイトに、ブログ記事へのリンクを表示させるのに使えるPHPパーサー”Magpie RSS”
■MagpieRSSで出来ること
ブログ記事を追加するたびに、勝手に記事へのリンクを取得してきてくれるので、
かなりメンテナンスが楽になります。
Magpieは、ブログのRSS(ブログの要約をまとめたファイル)を読み込んで、
そこから記事のタイトルや、記事へのリンク、投稿日時などを取得しています。
■RSSについて
RSSには、いくつかの書式があります。
ATOM
RSS 0.92
RSS 2.0
それぞれ元はXMLファイルなのですが、書式が全て違います。
例えば、Wordpressが自動発行してくれるRSSの場合、
それぞれの”日付”は、以下のように書き方が異なっています。
各RSSの日付の書式
ATOM = published
RSS 0.92 = 該当なし
RSS 2.0 = pubDate
他のRSSでは、dc:date という書き方で投稿日時を表していたりします。
また、一つの記事のくくり方も違います。
RSSによって違う記事ごとの単位・括り方
ATOM = entry
RSS系統 = item
RSSを読み込んでパース(展開)して、さて何を読み込んで表示させよう、となった段階で、
この書式の違いに結構ハマりました。
■もしRSS内に広告が入ってきたら
さて、前置きが長くなりましたが、ここからが今日の本題です。
例えば、無料ブログで、エキサイトブログを使っていて、
RSSを読み込んでサイトトップページに新着情報的にブログ記事へのリンクを表示させていた時に、
ナニヤラ広告的なリンクが勝手に入り込んでいる、という状況に遭遇したとします。(というか、した)
この広告的なやつ、勝手に入り込んでいるから困ったもんです。
RSSを改めて読んでみると、あらまぁしっかりと入れ込まれている。
エキサイトブログは方針を変えたのかな?だとしたら、仕方ないな、と思うわけですが、
この状況は頂けない。
■欲しいものだけ貰う
よくよくRSSを見返すと、本来の記事と、広告とでは執筆者が違うのに気づきました。
本来の記事では、常に同一の執筆者になっているのですが、
広告は、広告ごとに違うのです。
つまり、本来の執筆者だけのブログ記事を取得して表示させれば、問題は解決するのではないか、と。
■いらないものはスキップしちゃえ
やり方はいくつかあると思うのですが、
私並みの考えられる方法としては、「執筆者の情報かどうかを判別して、それ以外はスキップさせる」
というのが一番簡単で分かりやすかったので、そうしました。
以下にソース。
error_reporting(E_ERROR); //エラーレポートを表示しない
require_once 'magpie/rss_fetch.inc';
require_once 'magpie/jcode.php';
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
$url = 'http://rss.exblog.jp/rss/exblog/テスト/index.xml'; //RSSFeedのURL
$rss = fetch_rss($url);
$rss->items = array_slice($rss->items, 0, 5); //Feedの表示数(左の場合だと5件表示)
echo "
\n";
foreach ($rss->items as $item ) {
if($item['dc']['creator'] == 'hogehoge'){ //もし執筆者がhogehogeだったら
$title = $item[title]; // 件名を取得
$url = $item[link]; // リンク先を取得
}else{
continue; //hogehoge以外だったら、処理をスキップ
}
if($item['dc']['date']){ // 日付を取得
$date = strtotime($item['dc']['date']);
}
if($date){
$s_date = date("Y.m.d ", $date);
}
$title = JcodeConvert($title, 4, 4);
$date = JcodeConvert($date, 4, 4);
echo "
\n";
};
echo "
<table id="\"blog_table\"" cellspacing="\"0\"">
<tbody>
<tr class="\"odd\"">
<td class="\"date\"">$s_date</td>
<td class="\"text\""><a href="\" target="\"_blank\"">$title</a></td>
</tr>
</tbody>
</table>
\n";
13~18行目で、執筆者がhogehogeだったらそれ以降の日付やタイトルの取得・代入を処理して、
それ以外だった(hogehogeじゃなかった)ら、処理をスキップして、foreachの頭からやり直す、
というような感じになっています。
広告が度々入ってくると、処理がスキップしまくるので、表示件数(この場合は5件表示を設定している)が
スキップ分だけ減る形になり、全然表示されない~!みたいな状態になったら他の方法を考えるしかないですね。
BLOG