ショウジンブログ on Hatena

“お芝居をしないと、この社会では異邦人として扱われるほかない”

外部サイトのfeedを読み込む@MagpieRSS

お客さんのサイトで、外部ですでに運用しているブログの内容を自社サイトに読み込んで表示したいということで準備。

PHPのsimplexmlとかを使おうとしてたけど、xmlのdescriptionではなく、記事本文全文(content:encoded部分)を取得して表示させたかったのでこれは断念して、MagpieRSSを使ってみることにしました。

まず、MagpieRSSの準備。

MagpieRSS: RSS for PHP

http://magpierss.sourceforge.net/

上記URLにアクセスし、DOWNLOADからmagpierss-0.72.tar.gzをダウンロード。

解凍して出現するmagpierss-0.72というディレクトリ内の

extlib/(このフォルダごと)
rss_cache.inc
rss_fetch.inc
rss_parse.inc
rss_utils.inc

をサーバ上の任意のディレクトリにアップロード。(今回は例としてmagpie_test/に設置する)

アップロードしたディレクトリ内(magpie_test/)にcacheを保存するためのディレクトリcache/を作成。

あとは、このディレクトリの中に、外部のfeedを取得して表示するためのソースを記述したファイルを以下の内容でアップロードする。

注意:2011/09/28追記 日付等、扱うfeedによって(RSS1.0、RSS2.0、Atom等)書式が違うので、そこは適宜書き換えること。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-language" content="ja" />
<title>外部のfeedを読み込んで表示</title>
</head>
<body>

<?php

// 必要モジュールの読み込み
require_once("./rss_fetch.inc");

// キャッシュは五分に設定
define("MAGPIE_CACHE_AGE", 60*5);

// キャッシュ保存ディレクトリ指定(事前にcache/ディレクトリを作成しておく)
define("MAGPIE_CACHE_DIR", "cache/");

// エンコーディングの設定
define("MAGPIE_OUTPUT_ENCODING", "UTF-8");

// 読み込むfeedのURL
$url = "http://blog.showzine.co/feed";
$rss = fetch_rss($url);

// 表示する件数の上限
$max = 5;

$i=1;

// ブログ自体のタイトルを出力
echo "タイトル:". mb_convert_encoding($rss->channel['title'], "UTF-8", "auto") . "<hr />\n";

foreach ($rss->items as $item) {

    // 記事本文へのリンクURLを取得
    $href = $item['link'];

    // 記事タイトルの文字コードをUTF-8に
    $title = mb_convert_encoding($item['title'], "UTF-8", "auto");

    // 記事本文を全文取得(xmlのcontent:encoded部分)
    // 一部抜粋なら["description"]でいい
    $content = mb_convert_encoding($item['content']['encoded'], "UTF-8", "auto");

    // 記事の投稿日時を取得(xmlのpubDate部分)
    $date = $item["pubdate"];

    // xmlで取得した投稿日時をdate関数を使って年月日形式に整形
    $date = date("Y年m月d日",strtotime($date));

    // 取得した各要素をhtmlで出力
    echo "<dl>";
    echo "<dt><a href=\"$href\">$title</a><span style=\"display:block;\">$date</span></dt>";
    echo "<dd>$content</dd>";
    echo "</dl>";

    // ループ処理ごとに$iの値に1を足す
    $i++;

    // $iの値が$maxの値を超えたらループ終了
    if($i > $max){break;}
}

?>

</body>
</html>

取得して表示するブログの記事件数は変数$maxの値で変更可能。 (現状では5件表示)

異なる複数の外部feedを読み込んで表示する場合は以下。 ただし、記事ごとの投稿日時でソートはされない。(読み込むfeedを設定したその順番で、feedごとでのソートになる)

<?php

// 必要モジュールの読み込み
require_once("./rss_fetch.inc");
// キャッシュは五分に設定
define("MAGPIE_CACHE_AGE", 60*5);
// キャッシュ保存ディレクトリ指定
define("MAGPIE_CACHE_DIR", "cache/");
// エンコーディングの設定
define("MAGPIE_OUTPUT_ENCODING", "UTF-8");
// 取得するRSSのURLリスト
$urls = array(
    "feed1のURL",
    "feed2のURL"
);

// 表示する件数の上限
$max = 5;

$i = 1;

// RSSのアイテムリストを取得
$items = getRssList($urls);

// 複数サイトのRSSのアイテムを取得
function getRssList($urls){
    $rssitems = array();
    foreach ($urls as $url) {
        $obj = fetch_rss($url);
        $rssitems = array_merge($rssitems, $obj->items);
    }
    return $rssitems;
}
 

foreach ($items as $item) {

    // 記事本文へのURLを取得
    $href = mb_convert_encoding($item['link'], "UTF-8", "auto");
    // 記事タイトルの文字コードをUTF-8に
    $title = mb_convert_encoding($item['title'], "UTF-8", "auto");
    // 記事の投稿日時を取得
    $date = $item['dc']['date'];
    // 投稿日時をdate関数で整形
    $date = date("Y-m-d", strtotime($date));
    // 取得した各要素をhtmlで出力
    echo "<dl>";
    echo "<dt><a href=\"$href\">$title</a></dt>";
    echo "<dd>$date</dd>";
    echo "</dl>";

    // ループごとに#iをインクリメント
    $i++;

    // $iの値が$maxの値を超えたらループ終了
    if($i > $max){
        break;
    }
}

?>

2011/09/28追記: コードの冒頭で文字コードを指定していても(例えばこの場合はUTF-8)扱うfeedによって文字化けが起こる場合がある。

この場合は

rss_fetch.inc内の358行目付近

if ( !defined('MAGPIE_OUTPUT_ENCODING') ) {
    define('MAGPIE_OUTPUT_ENCODING', 'ISO-8859-1');
}

の「ISO-8859-1」を「utf-8」に変更すること。

意味への意志

意味への意志