トップ » 技術記事 » OpenSocialを始めよう(5) - 友達のデータを取得する

OpenSocialを始めよう(5) - 友達のデータを取得する はてなブックマーク数 このエントリーをブックマークに追加

前回から、OpenSocial APIの利用法についての解説が始まりました。前回は、OpenSocial APIは二種類のユーザ(ビューアとオーナ)を想定していること、そしてそのプロフィールデータを取得するための方法を説明しました。
今回はOpenSocial APIを用いて、ユーザの友達情報を取得するためのAPIを紹介しようと思います。

フレンド情報を取得するにはnewFetchPeopleRequest()

ユーザの友達情報を取得するには、やはりopensocial.DataRequestクラスを用いてリクエストを行います。前回と異なるのは、DataRequestに追加するリクエストの実体をDataRequest.newFetchPeopleRequest()メソッドを用いて作成すること。これをコードで示すと、次のようになります。

// DataRequestの作成
var req = opensocial.newDataRequest();
// オーナの友達情報を取得するためのリクエストを追加
req.add(req.newFetchPeopleRequest(opensocial.DataRequest.Group.OWNER_FRIENDS), "ownerFriends");
// 結果を取得したときのコールバックを指定して、リクエスト送信
req.send(onLoadComplete);

上のコードは、オーナの友達情報を取得するためのリクエストを送信しています。ビューアの友達情報を取得するには、newFetchPeopleRequest()の第一引数にopensocial.DataRequest.Group.VIEWER_FRIENDSを指定してください。

そして、コールバックの実装方法ですが、引数として受け取ったDataResponseのインスタンスから結果を取得する方法(dataResponse.get(”リクエストのキー”).getData())は同じです。異なるのは、getData()の戻り値がopensocial.Collectionクラスのインスタンスだと言うことです。

function onLoadComplete(dataResponse) {
    // オーナの友達情報を取得。Collectionsクラスのインスタンス
    var ownerFriends = dataResponse.get("ownerFriends").getData();
    // 友達情報をループ処理
    ownerFriends.each(function(friend) {
      …(略)…
    });
}
結果はopensocial.Collectionクラスのインスタンス

opensocial.Collectionクラスは、OpenSocial API上で「複数の値」を取り扱う際に使用されているクラスで、以下のようなメソッドを持っています。

  • Array. asArray()
    要素をすべてコピーしたJavaScript配列を返します。
  • each(fn)
    要素をループし、各要素を引数としてコールバック関数を呼び出します。
  • Object? getById(id)
    要素が持つID(ユーザIDなど)を用いて、要素を特定します。
  • Number getTotalSize()
    このコレクションは、さらに巨大な結果セットの一部を表している場合があります。このメソッドは、結果セット全体のサイズを返します。
  • Number size()
    コレクションの要素数を返します。
  • Number getOffset()
    結果セット内でのオフセット値(何番目を始点としているか)を返します。

さらに詳しい情報を得たければ、リファレンスを参照してください。

検索条件の制御

上に紹介した方法だと、オーナ/ビューアの友達情報をすべて、しかも順不同で取得することになります。検索結果を絞り込みたい、もしくは結果の順序を制御したい、と言う場合には、newFetchPeopleRequest()メソッドの第二引数に検索条件を指定します。

第二引数は、「条件:値」と言う形式で条件指定されたJavaScriptオブジェクトを使用します。例えば、友達情報を名前順で取得したい場合は以下のようにします。

var searchOpt = {};
// ソート順序の指定
searchOpt[opensocial.DataRequest.PeopleRequestFields.SORT_ORDER] =
  opensocial.DataRequest.SortOrder.NAME;
// オーナの友達情報を取得するためのリクエストを追加
req.add(
  req.newFetchPeopleRequest(
    opensocial.DataRequest.Group.OWNER_FRIENDS, searchOpt),
    "ownerFriends");

opensocial.DataRequest.PeopleRequestFieldsに宣言された定数をキーとし、条件指定を行います。条件値となるのは、DataRequest.FilterTypeDataRequest.SortOrderと言ったクラスに宣言された定数です。現在のOpenSocial APIでは、今挙げた二つのクラスを用いて検索条件を制御することしかできません(将来的には、もう少し柔軟な指定ができるようになると良いのですが・・)。

それにしても、「opensocial.DataRequest」が必ず頭につくので、識別子が長くて困りますね。さすがにタイピングが面倒なので、これからお見せするサンプルではwith句を用いています。

サンプル1:友達情報一覧

では、今回の知識を生かしたサンプルを二つご紹介して、今回の記事を終わりにしたいと思います。まず一つ目は、単純に友達情報を取得してきて表示すると言うものです。コピペで動作させられるはずですので、ぜひお試しください。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
  <ModulePrefs title="友達情報取得アプリ">
    <Require feature="opensocial-0.7" />
  </ModulePrefs>
  <Content type="html">
    <![CDATA[
    <script type="text/javascript">
      function init() {
        with (opensocial.DataRequest) {
            var req = opensocial.newDataRequest();
            req.add(req.newFetchPersonRequest(PersonId.OWNER), "owner");
            var searchOpt = {};
            searchOpt[PeopleRequestFields.FILTER] = FilterType.ALL;
            searchOpt[PeopleRequestFields.SORT_ORDER] = SortOrder.NAME;
            req.add(req.newFetchPeopleRequest(Group.OWNER_FRIENDS, searchOpt), "ownerFriends");
            req.send(onLoadComplete);
        }
      }
      function onLoadComplete(dataResponse) {
        var owner = dataResponse.get("owner").getData();
        var ownerFriends = dataResponse.get("ownerFriends").getData();
        var resultHtml = owner.getDisplayName() + "さんのお友達:"
        resultHtml += "<ul>";
        ownerFriends.each(function(friend) {
          resultHtml += ("<li>" + gadgets.util.escapeString(friend.getDisplayName()) + "</li>");
        });
        resultHtml += "</ul>";
        document.body.innerHTML += resultHtml;
      }
      gadgets.util.registerOnLoadHandler(init);
    </script>
    ]]>
  </Content>
</Module>

サンプル2:共通の友人を表示する

こちらのサンプルは、オーナとビューアの間の共通の友人を表示するのアプリケーションです。見知らぬ人だと思っていたら、実は「友人の友人」と言う近い間柄だった、と言うのはよくあること。このアプリを使えば、自分(ビューア)と相手(オーナ)の間に共通の友人がいる場合は一覧表示されます。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
  <ModulePrefs title="友達情報取得アプリ">
    <Require feature="opensocial-0.7" />
  </ModulePrefs>
  <Content type="html">
    <![CDATA[
    <script type="text/javascript">
      function init() {
        var req = opensocial.newDataRequest();
            req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER), "owner");
        req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), "viewer");
        req.add(req.newFetchPeopleRequest(opensocial.DataRequest.Group.OWNER_FRIENDS), "ownerFriends");
            req.add(req.newFetchPeopleRequest(opensocial.DataRequest.Group.VIEWER_FRIENDS), "viewerFriends");
        req.send(onLoadComplete);
      }
      function onLoadComplete(dataResponse) {
        var owner = dataResponse.get("owner").getData();
        var viewer = dataResponse.get("viewer").getData();
        var ownerFriends = dataResponse.get("ownerFriends").getData();
        var viewerFriends = dataResponse.get("viewerFriends").getData();
        if (!ownerFriends || !viewerFriends) {
          alert("ownerFriends:" + ownerFriends + " viewerFriends:" + viewerFriends);
          return;
        }
        // ビューアとオーナの共通の友人を検索する
        var sharedFriends = [];
        viewerFriends.each(function(viewerFriend) {
          var sharedFriend = ownerFriends.getById(viewerFriend.getId());
          if (sharedFriend)
            sharedFriends.push(sharedFriend);
        });
        var resultHtml =
          owner.getDisplayName() + "さんと" +
          viewer.getDisplayName() + "さんの間の共通のお友達:";
        if (sharedFriends.length == 0) {
          resultHtml += "<strong>なし</strong>";
        } else {
          resultHtml += "<ul>";
          for (var i = 0, n = sharedFriends.length; i < n; i++) {
            resultHtml += ("<li>" + sharedFriends[i].getDisplayName() + "</li>");
          }
          resultHtml += "</ul>";
        }
        document.body.innerHTML += resultHtml;
      }
      gadgets.util.registerOnLoadHandler(init);
    </script>
    ]]>
  </Content>
</Module>

最後に重要なことをいくつか

今回は、友人の情報を取得するためのAPIを紹介しました。最後に、今回紹介したAPIを利用するにあたって、現時点で注意しなければならないことをいくつか挙げておきます。

  1. Orkutでは、今回のAPIを用いても、サンドボックスにアカウントを持っている友人の情報しか取得できない
    これはなかなか厳しい制限で、友人情報を取得するAPIを試すには、サンドボックスにアカウントを持つ友人が「必ず必要」と言うことです。そうした友人がいない状態では、今回のサンプルを動かしても情報を取得できません。そうした友人を探す目的で、Orkut上にはOpenSocial Japanと言うコミュニティが作成されています。Google公認のコミュニティですので、参加して損はありません。
  2. Orkutでは、アプリケーションがビューアの情報(プロフィール、友人)にアクセスするためには、ビューアもアプリをインストールしている必要がある
    これは現在のOrkutが持つバグのようです。修正されるのを待ちましょう。

次回は、「アクティビティ」について取り上げる予定です。乞うご期待!

Series Navigation«プロフィールデータを取得するアクティビティの作成»

このサイトについて

八角研究所
株式会社八角研究所のWEBサイトですよー。 いろんなものを創り出すことのできる環境をコツコツ構築中。 いったい、いつになったらできるのか。 この技術情報サイトもそのための活動の一環のつもり。

執筆者紹介

shiraishi

shiraishi

最近書いてばっかりいます。 眠いとおんなじことばかり書きます。 そして、大概眠いです。

TrackBack URL :