Web/DB プログラミング徹底解説

ホーム > Yahoo! Web サービス > Yahoo! ニュース Web サービスを用いたニュースカテゴリの取り込み方法

Yahoo! ニュース Web サービスを用いたニュースカテゴリの取り込み方法

ここでは Yahoo! ニュース Web サービス を利用して、 Yahoo! ニュースカテゴリ一覧の取り込み方法を説明します。 それぞれのトピック名をクリックすると、Yahoo! ジャパンのニュースヘッドラインページへジャンプします。

まずは実行例を見てください。

Yahoo! Japan ニュース

上記ニュースカテゴリは、Yahoo! ニュース Web サービスを用いて取得しています。

アプリケーションの構築方法

ここでは上記のように、コンピュータカテゴリのニュースカテゴリを取得する方法を説明します。

全体的な構成

いろいろな方法があるのだと思いますが、私は下記のような構成にしています。

次のような順番になります。

  1. Web クライアントの JavaScript から Ajax リクエストを自サーバーに対して行う。
    この時、prototype.js の Ajax.Request を利用しています。
  2. サーバー側ではクライアントからのリクエストから、Yahoo! Web サービス向けの HTTP リクエストを作ります。
  3. Yahoo! Web サービスを呼び出し、結果を XML で受け取ります。
  4. Yahoo! Web サービスから返された XML メッセージは simplexml_load_string 関数で XML オブジェクトに変換されます。
  5. json_encode 関数を使って上記オブジェクトをクライアントに送信する。
  6. クライアントでは eval を使って JSON 文字列を解析します。
  7. HTML 要素を作成し、div 要素の innerHTML に差し込みます。

それでは、もう少し具体的に見ていきます。

アプリケーション ID の取得

最初にあなたのアプリケーション ID を取得します。これはYahoo! ニュース Web サービスのサイト から無料で取得できます。

REST リクエストの送信

次の形式で Yahoo! Web サービスに対して、 HTTP の GET リクエストを送信します。

http://news.yahooapis.jp/NewsWebService/V1/Topics?appid=[あなたのアプリケーションID]&パラメータ1=値1&パラメータ2&値2...

コンピュータカテゴリに絞る場合は、パラメータとして category を渡し、その値を computer とします。

試しにブラウザからリクエストすると、次のように XML メッセージとして応答が返って来ることがわかります。

要はこれをアプリケーションに取り込めばよいのです。

ちなみに、このように HTTP リクエストに対して XML のメッセージを応答として返す形式の API を一般に REST 形式の API といいます。

AJAX によるリクエスト送信

prototype.js の Ajax.Request を利用してリクエストを送信しています。ここで気をつけていただきたいのは、 クライアントからリクエストを行っているのでは Yahoo! 宛てではなく、当サイトのウェブサーバ (http://keicode.com) であるということです。 セキュリティの関係から、クロスサイトの Ajax 呼び出しは出来ないようになってます。同一生成元ポリシー (Same Origin Policy) というやつです。

Same Origin Policy って日本語で何て言うのかググってみたのですが、あまり訳語があてられてないようですね。 MDC で 「同一生成元ポリシー」 と訳されていたので、それを拝借しました。

そういう縛りがあるため、わざわざ一旦当サーバーを介しています。また、PHP を介することによって、 XML のパースが非常に簡単になることも利点といえるでしょう。JavaScript 上で XML のパースをするより全然楽です。

function set_news() {

     if(!$('news_ph')){
          return;
     }

     $('news_ph').innerHTML 
          = '<img src="image1.gif" alt=""> ニューストピックを読み込んでいます...';

     new Ajax.Request( 
          'get_yws01.php',
          { 
               method: 'POST', 
               onComplete: function(trans){
                    set_news_table(trans.responseText);
               } 
          }
     );
}

尚、「読み込んでいます...」 のときに表示するアイコンは ajaxload.info で生成した GIF アニメーションを利用しています。

REST リクエストの送信と XML の受け取りと解析

PHP から Yahoo! の API サーバに対して、REST リクエストを送信し、その結果を XML で受け取り、さらにその結果をクライアントに JSON 形式で返します。 PHP ではこの処理を非常に簡単に行えます。全部いっぺんに見てみましょう。全コードは次の通りです。

<?php

$c = file_get_contents('http://news.yahooap...(省略)');
$xml = simplexml_load_string ( $c );
echo json_encode($xml);

?>

file_get_contents 関数で REST リクエストの送信及び、結果を受け取ります。$c には XML メッセージが文字列として入ります。 次に simplexml_load_string で XML メッセージを XML オブジェクトに変換します。それが $xml です。 最後にそのオブジェクトを json_encode で JSON にフォーマットして、クライアントに echo します。

結果の受け取りと表示

この結果、上述の JavaScript の Ajax.Request の onComplete に指定したファンクションにて、 JSON 形式のレスポンスを受け取ります。

JSON を eval で評価することにより元のオブジェクトにデシリアライズ (deserialize) できます。

function set_news_table(t) {

     var div = $('news_ph');
     
     if(!div){
          return;
     }
     
     var news = eval('(' + t + ')');
     
     if( !news || !news.Result || !news.Result.length ){
          div.innerHTML = '<b>ニュースカテゴリが読み込めませんでした。</b>';
          return;
     }
     
     var sb = new TKStringBuffer();
          
     for(var i=0; i<news.Result.length; i++){
          
          var r = news.Result[i];
          
          sb.a('<a href="');
          sb.a( r.url );
          sb.a('" target="_blank">');
          sb.a( r.topicname );
          sb.a('</a>');
          
          if ( i < news.Result.length - 1 ) {
               sb.a(' | ');
          }
     
     }
     
     sb.a('</table>');
     
     div.innerHTML = sb.toString();
   &nbs
}

HTML の生成については好きなように行えばよいでしょう。コードで使っている TKStringBuffer については当サイト内 JavaScript の文字列の結合を最適化する にて説明しています。