今回の第五章はOpenSocialのAPIの解説が載っています。 Mixiアプリの大本営のHPと一緒に勉強をしていきます。 実は本に載っていることとmixiのHPの情報は同じ部分が多いです。
OpenSocial入門 ~ソーシャルアプリケーションの実践開発
「OpenSocial JavaScript API 」はOpenSocialアプリを開発する上でもっとも基本且つ重要なAPIです。主にソーシャルデータに特価した機能を提供します。
ユーザー情報を取得
[cc lang="javascript"] var req = opensocial.newDataRequest(); req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer"); //functionの引数のdataはリクエストして帰ってきたデータ。この場合はID,NAME,THUMBNAIL_URLの3つ。 req.send(function(data) { if (data.hadError()) { var msg = data.getErrorMessage(); // エラー発生時の処理 } else { // 取得結果に対する処理 } }); [/cc]
newFetchPersonRequest()関数の第1引数には、取得したいユーザを特定するための値を指定します。
- Viewer(アプリケーションを操作するユーザ) – opensocial.IdSpec.PersonId.VIEWER
- Owner(アプリケーションの持ち主) – opensocial.IdSpec.PersonId.OWNER
- 任意のユーザ – 取得したいユーザのMember ID
newFetchPersonRequest()関数で取得できるデータは
- 「id:getid()」
- 「NAME:getDisplayName()」
- 「プロフィールの写真(THUMBNAIL_URL):getField(opensocial.Parson.Field.THUMBNAIL_URL)」 の3つです。
上記以外のデータを取得する場合は、opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS定数を使って追加取得したい項目を配列でしていします。
[cc lang="javascript"] var params = {}; params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [ opensocial.Person.Field.PROFILE_URL, opensocial.Person.Field.ADDRESSES, opensocial.Person.Field.AGE, opensocial.Person.Field.DATE_OF_BIRTH, opensocial.Person.Field.GENDER, opensocial.Person.Field.HAS_APP, mixi.PersonField.BLOOD_TYPE ]; var req = opensocial.newDataRequest(); //第一引数にカンマをつけてparamsを追加。 req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER, params), "viewer"); req.send(function(data) { // プロフィール情報使った処理 }); [/cc]
add() 第一引数にリクエストをオブジェクトを指定します。第二引数にこのリクエストの結果を取り出すために使用することになるキー文字列を渡しておきます。
send():実際にOpenSocial採用SNSのサーバーにアプリケーションからプロフィール情報の取得要求が送信されます。取得結果がが返送された際には、send()関数の引数に指定した関数が実行されます。今回の場合は「function(data){ });」が実行されます。
ユーザー情報を取り出す
ユーザー情報を取り出す流れ<li>リクエストを「data」から取り出す処理はget()関数を使っています。</li>
<li>もしエラーが発生していなかったら、今度はgetData()関数を使いある特定のユーザープロフィール情報を取り出します。</li>
<li>後は、このオブジェクトからユーザープロフィール情報の項目を利用してコンテンツを作成することができます。</li>
[cc lang="javascript"] req.send(function(data) { if (!data.hadError()) { var item = data.get("viewer"); if (item.hadError()) { var code = item.getErrorCode(); // エラー処理 } else { var viewer = item.getData(); var id = viewer.getId(); var nickname = viewer.getDisplayName(); var thumbnailUrl = viewer.getField(opensocial.Person.Field.THUMBNAIL_URL); var age = viewer.getField(opensocial.Person.Field.AGE); var hasApp = viewer.getField(opensocial.Person.Field.HAS_APP); var birth = viewer.getField(opensocial.Person.Field.DATE_OF_BIRTH);
// プロフィール情報を使った処理
}
}
}); [/cc]
get()関数で取り出した情報は、opensocial.ResponseItemクラスのオブジェクトとなります。get()関数の引数には、add()関数の第二引数に指定したキー文字列を指定します。
プロフィール情報を取り出す時には
- ID: getId()関数
- NAME:getDisplayName()関数
- その他の情報を取り出す:getField()関数
友達情報の取得(マイミク情報の取得)
先ほどまでは、ある一人のユーザー情報を取得する方法を記載しましたが、今度は、mixiでいうと「マイミク」のユーザー情報を取得する方法です。まずはユーザー情報の取得対象となる人達を「USER_ID」「GROUP_ID」「NETWORK_DISTANCE」を指定して絞り込みます。
- 「USER_ID」:OWNERかVIEWERのどちらかを指定。
- 「GROUP_ID」:FRIENDS(友達)、SELF(自分自身)、ALL(すべての会員)のいずれかを指定。
- 「NETWORK_DISTANCE」:「USER_ID」を基準とした距離を表す。友達の友達だと2。
[cc lang="javascript"] var params = {}; //paramsでオブジェクト作成、マイミク一覧条件を指定します。 params[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.PersonId.VIEWER; params[opensocial.IdSpec.Field.GROUP_ID] = "FRIENDS"; // IdSpecオブジェクトは、先ほどの3つの条件を保持するオブジェクトです。 var idSpec = opensocial.newIdSpec(params); var req = opensocial.newDataRequest();
//newFetchPersonRequest()でないので注意。 req.add(req.newFetchPeopleRequest(idSpec), "friends"); req.send(function(data) { if (data.hadError()) { var msg = data.getErrorMessage(); // エラー発生時の処理 } else { // 取得結果に対する処理 } }); [/cc] この場合も、ID,NAME,THUMBANAILの3つの情報しかリクエストできないので、その他プロィールを取得する際には、「opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS」を使って設定をしてあげます。
[cc lang="javascript"] var params= {}; params[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.PersonId.VIEWER; params[opensocial.IdSpec.Field.GROUP_ID] = "FRIENDS"; var paramsSpec = opensocial.newIdSpec(params); //その他のプロフィール var dp = {}; dp[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [ opensocial.Person.Field.AGE, opensocial.Person.Field.GENDER, opensocial.Person.Field.PROFILE_URL, mixi.PersonField.BLOOD_TYPE //mixi独自なので注意 ]; var req = opensocial.newDataRequest(); req.add(req.newFetchPeopleRequest(paramsSpec, dp), "friends"); req.send(function(data) { if (data.hadError()) { var msg = data.getErrorMessage(); // エラー発生時の処理 } else { // 取得結果に対する処理 } }); [/cc]
友達情報の取り出す(マイミク情報の取り出す)
ページング マイミクが多い場合、すべて一回の通信で取得するのは現実的ではありません。そのため、複数にわけて情報を所得します。send()関数でリクエストを送る前に、一回のリクエストで何件の情報を取得するかを設定します。[cc lang="javascript"] //情報のリクエスト内容 var id= {}; id[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.PersonId.VIEWER; id[opensocial.IdSpec.Field.GROUP_ID] = "FRIENDS"; var idSpec = opensocial.newIdSpec(id);
//ページング var params = {}; params[opensocial.DataRequest.PeopleRequestFields.MAX] = 10; //一回のリクエストあたりの取得される最大件数 params[opensocial.DataRequest.PeopleRequestFields.FIRST] = 30;//何件目から取得するかを指定。今回は30件目から。 var req = opensocial.newDataRequest(); req.add(req.newFetchPeopleRequest(idSpec, params), "people");
//情報を取り出す処理 req.send(function(data) { var people = data.get("people").getData(); var offset = people.getOffset(); var total = people.getTotalSize(); var size = people.size(); var msg = total + "件中 " + offset + " - " + (offset + size) + " 件目"; // メッセージの表示と会員情報に対する処理 }); [/cc] 「opensocial.DataRequest.PeopleRequestFields.MAX」で一回の取得件数をしていしています。
OpenSocialアプリの内容によっては、取得したい会員に何かしらのフィルターをかけたい場合には「opensocial.DataRequest.PeopleRequestFields.FILTER」を使います。
マイミクの中ですでにそのmixiアプリを使っている人(opensocial.DataRequest.FilterType.HAS_APP;)をフィルタリングする。 [cc lang="javascript"] var params = {}; params[opensocial.DataRequest.PeopleRequestFields.FILTER] = opensocial.DataRequest.FilterType.HAS_APP; req.add(req.newFetchPeopleRequest(idSpec, params), "friends"); req.send(function(data) { var friends = data.get("friends").getData(); friends.each(function(friend) { //会員情報を使っての処理 }); }); [/cc]
「opensocial.DataRequest.PeopleRequestFields」にはMAX,FIRST,FILTER以外にもSORT_ORDER(並び順の指定)などがあります。これらはすべて平行して利用が可能です。これらの処理をうまく利用できれば、OpenSocialアプリの起動時間の短縮に利用できます。