ロゴ
HOME > jQuery・Javascript > 外部サイトのRSSを取得する

外部サイトのRSSを取得する

2015年02月14日

新規のホームページ制作をWordPressでというケースなら、ブログもそこで書けますが、既にアメブロなんかでブログを書いていらっしゃるケースで、その一覧を独自ドメインのホームページへ表示したいといった要望は割と多いです。

ブログはRSSフィードが公開されてますので取得は簡単ですし、そういったライブラリーもたくさんあるので、それを使うって手もあるのですが、私的にあまりごちゃごちゃとファイルを読み込みたくないので、自前で取得しているのですが、その方法をご紹介。

外部ブログという事で、アメブロのスタッフさんのを取得してみます。

サンプル

RSSフィードの情報を取得する

url_proxy.php

https://studio-key.com/Sample/jquery/rss/url_proxy.php

<?php
$url = 'http://rssblog.ameba.jp/staff/rss20.xml';

$string = file_get_contents($url);   //ファイルを得る
$obj    = simplexml_load_string($string); //オブジェクトに変換
$obj    = xml_row($obj); //配列にする

 header("Content-type: application/xml");
 echo '<?xml version="1.0" encoding="UTF-8" ?> ' . "\n";
 
 echo '<xml>'."\n"; 
  foreach($obj["channel"]["item"] AS $row){
    $date = date('Y/m/d H:i:s',strtotime($row['pubDate']));
    echo '  <item>'."\n"; 
    echo "    <title>{$row['title']}</title>\n";
    echo "    <link>{$row['link']}</link>\n";
    echo "    <pubDate>{$date}</pubDate>\n";
    echo '  </item>'."\n"; 
  }
 echo '</xml>'."\n"; 
 
/*
 * RSS解析
 */
  function xml_row($obj) {
     $arr = array();
     if (is_object($obj)) {
        $obj = get_object_vars($obj);
     } else {
        $obj = $obj;
     }
     foreach ($obj as $key => $val) {
        if (is_object($obj[$key])) {
           $arr[$key] = xml_row($val);
        } else if (is_array($val)) {
           foreach($val as $k => $v) {
              if (is_object($v) || is_array($v)) {
                 $arr[$key][$k] = xml_row($v);
              } else {
                 $arr[$key][$k] = $v;
              }
           }
        } else {
           $arr[$key] = $val;
        }
     }
     return $arr;
  }

あとはまぁ、jQueryなんかでこのファイルからデータを取り出してリストにします。

  $(function(){
    $('#rss ul li').remove(); //LIを空に
      $.ajax({
            type: "xml",
            url: "url_proxy.php",
      }).done(function(xml){
        $(xml).find("item").each(function(){
          var html = $(this).find("date").text()+'<a href="'+$(this).find("link").text()+'" target="_blank">'+$(this).find("title").text()+'</a>';
          $("<li></li>").html(html).appendTo("#rss ul");
        });
      }).fail(function(xml){
        //error
      });
    
  });

オブジェクトはそのままでも良いのですが、いったん変数に落とし込んだ方が楽だと思います。特に名前空間があったりすると面倒なので。

PHPで直接表示しても良いのですが、それだと外部サイトにエラーが発生している場合など、こっちのサイトもロード状態になってしまったりするので、非同期通信がベストと思います。