読者です 読者をやめる 読者になる 読者になる

YQLでブログのRSSをJSONで取得して、新着として表示する

YQL Consoleで取得したいブログのRSSを、SQLっぽい構文で入力して確認してみます。
このブログのRSSで確認してみました。JSONで欲しいので、JSONにチェックを入れて TESTをクリック。
あ、*ではなく、titleとlinkだけ取ってます。

query.results.itemで一覧を取得できてますね*1
後はそれを使って表示するだけです。

  <script type="text/javascript" src="javascripts/jquery-1.7.2.min.js"></script>
  <script type="text/javascript">

    function makeWhatsNewLiElement(item) {
      return "<li><a href='"+ item.link + "'>" + item.title + "</a></li>";
    }

   jQuery(function () {
      if(!Array.isArray) {
        Array.isArray = function (arg) {
          return Object.prototype.toString.call(arg) === "[object Array]";
        };
      }
      jQuery.getJSON("http://query.yahooapis.com/v1/public/yql?callback=?", {
        q : "select title,link from rss where url='http://d.hatena.ne.jp/yuichi_katahira/rss'",
        format : "json"
      }, function (json) {
        var whatsNew = jQuery(".whatsnew");
        if (Array.isArray(json.query.results.item)){
          for (var i = 0, l = json.query.results.item.length; i < l; i++) {
            whatsNew.append(makeWhatsNewLiElement(json.query.results.item[i]));
          }
        }else {
          //エントリーが1件しかなかった時は配列ではなくObject
          whatsNew.append(makeWhatsNewLiElement(json.query.results.item));
        }
      });
    });
  </script>
</head>
<body>
<ul class="whatsnew">
</ul>

まだエントリーがない別のブログで、試しに1件だけ記事を書いて取得してみたところ、query.results.itemが配列ではなく、Objectで来ていたので、その場合の対応も追加してみました。



YQLの制限はpublicの場合は下記の通りなので、アクセスが多いサイトでなければ十分かと思います。

Per IP limits: /v1/public/*: 2,000 calls per hour; /v1/yql/*: 20,000 calls per hour


以上。

*1:オリジナルサイズで表示しないと見えづらいです