seno.ccWebデザイナーと2匹のハリネズミ

seno.cc > 日記 > 【アメブロ対応】phpで外部ブログRSSを自サイトに組み込む

【アメブロ対応】phpで外部ブログRSSを自サイトに組み込む

2012
02/11
Share Button

この記事は【転載】アメブロ対応::phpで外部ブログRSSを自サイトに組み込んじゃおうに転載しています。今後、技術系のブログはリンク先ブログで更新していく予定なので、そちらもよろしくお願いいたします!

最近新規でホームページを制作したときに、「更新機能」をつけるかつけないかで少々悩むことがありました。というのも、依頼者さんはかなり前からアメブロを更新してきていたため、今更新しい環境で更新はちょっと…となったワケです。

しかしホームページを作る以上、SEO的な面でもなんとか更新性を出したいなーと模索していた時に以下の記事を見つけました。
ウェブデザイナーの日記:php :: MagpieRSS :: 他サイトのRSSを表示するクラスライブラリ

今回は上記の内容をもとに、PHPを使ってアメブロのRSSを別ドメインのホームページに表示する方法をご紹介します。

MagpieRSS: RSS for PHPをダウンロード

まずはMagpieRSS: RSS for PHPをダウンロードします。
ダウンロード&解凍が完了したら、フォルダごとサーバにアップロード。

PHPをソースに挿入

次に、以下をホームページ上の表示させたい部分に挿入します。

<?php

// モジュールを読み込む
require_once("magpierss/rss_fetch.inc");

// キャッシュ期間を秒数にて設定
// 例では30分
define("MAGPIE_CACHE_AGE", 60*30);

// キャッシュディレクトリへのパスを設定
// キャッシュディレクトリをchmod 777 (or 707 or 700)
define("MAGPIE_CACHE_DIR", "/path/2/cache/");

// 日本語バケないためにOUTPUT_ENCODINGをUTF-8にする
define("MAGPIE_OUTPUT_ENCODING","UTF-8");

// 取得したいRSSのurl
$url = "http://www.cybergal.jp/?feed=atom";

// ブログのタイトルは$rss->channel['title']という変数、
// RSSは$rss->itemという変数に入る。
// key値、link/title/descriptionで取得できる。
$rss = fetch_rss( $url );
echo "Title:". mb_convert_encoding($rss->channel['title'],"EUC-JP","auto");
echo '<p>';
foreach ($rss->items as $item) {
    $link = mb_convert_encoding($item['link'],"EUC-JP","auto");
    $title = mb_convert_encoding($item['title'],"EUC-JP","auto");
    $description = mb_convert_encoding($item['description'],"EUC-JP","auto");
    echo "<a href=$link>$title</a><br />$description"<br />;
}
echo '</p>';

?>

PHPモジュールを呼び出すために、上記ソース3-4行目、

// モジュールを読み込む
require_once("magpierss/rss_fetch.inc");

の /rss_fetch.inc 部分を自分のサーバ上に置いたMagpieRSSへのパスに書き換えます。
// ブログのタイトルは〜以下は文字コードの変換に関する部分です。
僕の場合はUTF-8に統一しているので、EUC-JPをUTF-8に置き換えて使用しました。

余談ですが、

echo '<p>';
echo '</p>';

のpをliなど、使いたいタグに置き換えることで表示を制御する事ができます。

その他の部分については、ウェブデザイナーの日記さんが丁寧にコメントを入れてくれているので分かりやすいですね。簡単な表示であれば、このまま挿入するだけでも十分オーケーです。

アメブロ用にカスタマイズ

上記のソースでアメブロのRSSを表示しようとしたものの、記事と一緒にアメブロのPR広告が入り込んできたり、投稿時間表時が出来なかったりしたので、このブログにたまに出演するsukobuto.comさんにカスタマイズをお願いしました。

出来上がったソースはこれ。

<ul>
        <?php

// モジュールを読み込む
require_once("magpierss/rss_fetch.inc");

// キャッシュ期間を秒数にて設定
// 例では30分
define("MAGPIE_CACHE_AGE", 60*30);

// キャッシュディレクトリへのパスを設定
// キャッシュディレクトリをchmod 777 (or 707 or 700)
define("MAGPIE_CACHE_DIR", "/path/2/cache/");

// 日本語バケないためにOUTPUT_ENCODINGをUTF-8にする
define("MAGPIE_OUTPUT_ENCODING","UTF-8");

// 取得したいRSSのurl
$url = "http://feedblog.ameba.jp/rss/ameblo/akira-shiotsuka/rss20.xml";

// ブログのタイトルは$rss->channel['title']という変数、
// RSSは$rss->itemという変数に入る。
// key値、link/title/descriptionで取得できる。
$rss = fetch_rss( $url );
//var_dump ($rss);
$max_lines = 3;
$line = 0;
//echo "". mb_convert_encoding($rss->channel['title'],"UTF-8","auto");
foreach ($rss->items as $item) {
    $link = mb_convert_encoding($item['link'],"UTF-8","auto");
    $title = mb_convert_encoding($item['title'],"UTF-8","auto");
    $description = mb_convert_encoding($item['description'],"UTF-8","auto");
	$date = date("Y/m/d", intval($item['date_timestamp']));
	if (preg_match("/^PR:.+$/", $title) != 0) continue;
	if ($line++ == $max_lines) break;
    //echo "<a href=$link>$title</a><br />$description";
	echo "<li> $date <a href=\"$link\" target=\"_blank\">$title</a>" . '<img src="http://senoweb.jp/img/common/new.gif"></li>';
}

?>
      </ul>

主に変更したのは33行目以下です。

    if (preg_match("/^PR:.+$/", $title) != 0) continue;
    if ($line++ == $max_lines) break;

が、PR広告をはじいて表示してくれる部分で、[PR]から始まる文章をカットする仕組み。

$date = date("Y/m/d", intval($item['date_timestamp']));

が、記事の投稿時間を取得・表示してくれる部分だそうです。
記事のdescriptionもコメントアウトしてます。

僕の場合はlistで表示したかったのでulで囲んでいますが、

echo '<p>';
echo '</p>';

を変更するだけだと、記事3件が一つのli扱いになってしまうので、
37行目にliタグを挿入することで代用しました。

これを実際にサイトに組み込むとこんな感じとなり完成です。

このPHPではアメブロ以外のRSSでも取得出来るので、ホームページの新着情報として外部ブログのRSSを利用したい時などに試してみてはいかがでしょうか。

  • 匿名

    Twitterのように簡単に組み込めるかと思っていたところ
    アメブロにはそのようなシステムがないと分かり、
    てこずるかと思いきや
    この記事のおかげですんなり出来ました。
    デザインを変えられそうで助かりました。
    ありがとうございます!

  • seno

    なんでツールが用意されていないのか謎ですね。
    このソースでは、メジャーどころの無料ブログは動作確認取れてるのでご自由にお使いくださいー。

  • YS

    ありがとうございます。
    アメブロのPR広告まで外すことができるのは素晴らしいですね。

    素人質問で恐縮なのですが、サイトに貼り付けてみたところ、21行目の途中から(channel[‘title’]以降)文字列扱いになってしまい、作動できませんでした。
    この場合、どうすればいいでしょうか?
    宜しくお願いします。

    • seno

      コメントありがとうございます。
      > 21行目の途中から(ch~ 
      の件ですが、21行目はもともとコメントアウトしてるだけなので表示はされないと思います。

      使用したコードを貼っていただければ見てみますー

  • YS

    すいません、表示できました。
    ありがとうございます。

    それと、「New」表示についてお聞きしたいのですが、一定期間たったら(たとえば2日)表示させないようにすることは可能でしょうか?

    宜しくお願いします。

    • seno

      お よかったですねー。
      ちなみに「NEW」は僕が個人的に使ってるただのgif画像なので、リンクの直バリは無しでお願いしますー^^;

      時間制限については設定していないので、今のままでは制限できません。
      僕も友人に聞いて今回のソースを作ってるので、その点に関しては分からないですねー
      調べてみるのでYSさんもやり方分かったら共有していただけると嬉しいです!

  • piggy

    はじめまして。htmlファイルに組み込むとYSさんのように途中から文字列扱いになってしまいます。
    phpファイルだと大丈夫なのですが、htmlファイルだと文字列扱いになります。何が原因なのか分からずに困っています。
    YSさんは解決されたようですがどうやって解決したのかをぜひ知りたいと思って書き込ませていただきました。
    もし原因がお分かりでしたらぜひ教えてください。よろしくお願いいたします。

    • seno

      コメントありがとうございます!
      なるほどもしかしたらYSさんもhtmlファイルに組み込んでいたんですかね。

      この記事で紹介しているのはphpを使う方法なのでhtmlファイルでは実装できません。
      書いていただいたように拡張子をphpにすれば実装出来るはずですが、既に運営が開始されてるサイトだとURL変更とかが面倒ですかね..
      解決にならずすいません。^^;

  • piggy

    いえいえ。コメントを書き込んでから、「もしかして・・・」と思いました。ありがとうございました。