カテゴリー : Opensocial

Opensocial入門を読んで見た(第五章)五回目

長くなりますが、第五章五回目です。

OpenSocial入門 ~ソーシャルアプリケーションの実践開発
OpenSocial入門 ~ソーシャルアプリケーションの実践開発

外部サーバーの呼び出し

すでに海外などで人気を得ている OpenSocialアプリケーションのほとんどが、任意のWebサービスを呼び出してコンテンツを利用しています。その際には「Gadgets Core JavaScript API」を利用します。具体的にはgadgets.io.makeRequest()関数を使います。
gadgets.io.maketRequest()の引数

  1. 取得したいコンテンツの位置を示すURL
  2. 結果が返却された際の実行されるコールバック関数
  3. 外部サーバへのリクエストに関するパラメータ

結果が返却された際の実行されるコールバック関数

コールバック関数に渡される引数は、リクエストした結果を持つオブジェクトです。

  • data:リクエストの際に指定したコンテンツの種別に応じて適切に変換された結果が保持されている。(DOM,TEXT,JSON,FEED)
  • errors:エラーが返されたときに、エラー情報が配列として保持される
  • text:リクエストの結果得られたコンテンツを文字列で保持される
  • rc:HTTPステータスコードが保持される

これらのプロパティは要求の際に指定したコンテンツに種別に従って使い方が異なります。例えば、gadgets.io.ContentType.TEXTが指定されていた場合、dataもtextも同じ結果が保持されます。

例①
要求されたコンテンツ ContentType.TEXT

1
2
3
4
5
6
<html>
  <body>
      <div id="name"> albatrus</div>
      <div id ="country"> JAPAN</div>
  </body>
</heml>

↓↓
コールバック関数の引数がtext or dataの場合

1
2
<html>¥n<body>¥n<div id="name"> albatrus</div>¥n<div id ="country"> JAPAN</div>¥n </body>¥n</heml>
という文字列が得られます。

例②
要求されたコンテンツ ContentType.DOM

1
2
3
4
5
<?xml version ="1.0"?>
<user>
   <name>albatrus</name>
   <age> 27</age>
</user>

↓↓
コールバック関数の引数がtextの場合
¥n¥nalbatrus¥n 27¥n¥n
という文字列になります。

コールバック関数がdataの場合は、このXML形式の文字列がパースされた結果のDOMが保持されます。

1
2
3
var doc = obj.data;
var name = doc.getElementsByTagName("name")[0].firstChild.nodeValue;
var age = doc.getElementsByTagName("age")[0].firstChild.nodeValue;

例③
要求されたコンテンツ ContentType.JSON

1
{ "user" : {"name" : "albatrus" , "age" : 27}}

↓↓
コールバック関数の引数がtextの場合

{ ¥”user”¥ : {¥”name” ¥: ¥”albatrus”¥ , ¥”age”¥ : 27}}  という文字列のなります。

コールバック関数がdataの場合は、このJSON形式の文字列がパースされた結果のjavascriptオブジェクトが保持されます。

1
2
3
var user = obj.data["user"];
var name = user.name;
var age = user.age;

例④
要求されたコンテンツ ContentType.FEED
RSSもしくはATOM形式の文字列がjavascriptのオブジェクトに変換されてdataプロパティに保持されます。javascriptのオブジェクトに変換された後の操作は非常に簡単です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version ="1.0" encoding ="utf-8" ?>
<feed xmlns ="http://www.w3.org/2005/Atom">
   <title> albatrus feed </title>
   <link href ="http://albatrusfeed.com/ " />
   <updata> 2010-3-14T12:20:02Z </upload>
   <author>
        <name> alba </name>
   </author>
   <id> urn:00000000000 </id>
   <entry>
         <title>you can request feeds with nameRequest. </title>
         <link  herf ="http://your .surver.host / 2008/10/04/atom12345" />
         <id> urn 0000000001 </id>
         <updata> 2008-10-20T12:20:02Z </updata>
         <summary> some text. </summary>
    <entry>
</feed>

↓↓
コールバック関数の引数がdataの場合

obj.dataオブジェクトは以下の用になります。

1
2
3
4
5
6
7
8
9
10
11
{
  URL:"http://albatrusfeed.com/",
  Title:"albatrus feed",
  Author : " alba";
  Entry : [
            URL :"http://your .surver.host / 2008/10/04/atom12345",
            Title : "you can request feeds with nameRequest. ",
            Summary : "some text. "

            ]
 }

javascript内では以下のようにFEEDの内容を利用することが可能です。

1
2
3
var feed = obj.data;
var name = name.Author;
var title = feed.Entry[0].Title;

外部サーバへのリクエストに関するパラメータ

gagets.io.makeRequest()で指定可能はパラメータ一覧

gagets.io.makeRequest()で指定可能はパラメータ一覧

フィールド 説明
AUTHORIZATION 要求に使用する認可の種別を指定。
CONTENT_TYPE 要求の結果としてい期待する形式を指定
METHOD 要求する際のHTTP Methodを指定

1、gadgets.io.AUTHORIZATION
makeRequest()関数による外部サーバーへのアクセスについて、署名を付与することができます。

  • gadgets.io.AuthorizationType.NONE – 署名を付与しない
  • gadgets.io.AuthorizationType.SIGNED −要求に署名を施す
  • gadgets.io.AuthorizationType.OAUTH −OAuthのよる認証を行う(※mixiアプリから外部サーバーへのAOuthによる認証認可要求は、現在サポートされていません。

署名付きリクエストにはmixiアプリの場合、以下のパラメータが付与されます。

  • oauth_consumer_key – “mixi.jp”
  • oauth_signature_method – “RSA-SHA1″

2、gadgets.io.CONTENT_TYPE
CONTENT_TYPEパラメータにより、外部サーバから得られるコンテンツの期待する形式を指定することができます。この指定によって、コンテンツはJavaScriptオブジェクトに自動的に変換され、mixiアプリから扱いやすくなります。
DOM(XML形式)、FEED(RSS,ATOM Feed形式)、JSON(JSON文字形式)、TEXT(テキスト形式)のいずれかが指定できます。

3、gadgets.io.MethodType

gadgets.io.MethodType.POSTを指定しPOSTメソッドによるリクエストを外部のサービスに送信する場合、URL
と一緒にパラメータを送信したいときにはgadgets.io.RequestParameters.POST_DATAフィールドを使用します。

1
2
3
4
5
6
7
8
9
10
var params={};
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
var post_data = { name = "albatrus",age = "27"};

params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(past_data);
gadgets.io.makeRequest("http://albatrus.com/user", function(obj) {
                                                                                         //コールバック関数、結果に対しての処理

                                                                                        }
                                           params);

今回の例では、「name = albatrus&age=27」という文字列がリクエストに含まれています。

mixiアプリに関して

mixiでは外部サーバーに通信する際のmakeRequest関数に一定の制限を設けています。

  • 接続ホストへの通信が20回連続でタイムアウトした場合、そのホストへの通信は15秒間行うことができない。

Opensocial入門を読んで見た(第五章)四回目

今日、「1億人のユーザーを抱える『FarmVille』の開発と運用・・・Zynga 」の連載を見ました。

Facebookアプリの『FarmVille』は僅か5週間という開発期間の中で、11名のスタッフによって制作されました。今、インストール数では1億1000万人以上、3100万人が毎日遊ぶというゲームみたいです。

いくつか今後の参考になる部分がありました。
1、開発は以下のプログラミング言語で作られています。

  • サーバー側にPHP
  • クライアント側にFLASHを採用。

2、スケーラビリティに関してはネットワークレイヤーを置く。
スケーラビリティとは、コンピュータシステムの持つ拡張性。システムの利用者や負荷の増大に応じて、柔軟に性能や機能を向上させられることを意味する。

3、その他
ロード時間の短縮には
リモートコールの徹底した排除や、
ソーシャルネットワークラッパーの中の遅いFacebook APIの呼び出しや、
DBラッパーの中のSQLなどをキャッシュすることで対処しています。

ZyngaではNagiosやMuninを使って常にサーバーの負荷を監視しています。ロード時間/トラフィックのグラフ、Memcacheの解放回数などをチェックしているようです。

OpenSocial入門 ~ソーシャルアプリケーションの実践開発
OpenSocial入門 ~ソーシャルアプリケーションの実践開発

mixiアプリ内でFlashを使ってみよう

上記の記事にも書いてあるように、実際に利用者の方に見てもらう画面はFlashで作ればより動的に表現をすることができます。
利用方法は簡単に以下の3点です。
1、Flashに対応するためには、Gadgets XMLファイル内で設定が必要です。その際にはタグのfeatureを使います。

1
2
3
<ModulePrefs>
  <Require feature="flash" />
</ModulePrefs>

2、次にの中にパラメータを記載

1
2
3
4
5
<div id="target">
  <embed width="300" height="150" src="http://your.server.host/flash/content.swf"
      type="application/x-shockwave-flash" wmode="opaque"
      base="http://your.server.host/flash/"/>
</div>

注意点
mixiアプリ内でFlashコンポーネントを使用する際に、他のマイミクにmixiアプリの利用を勧めるための招待機能を利用すると、表示上の問題が発生する場合があります。
これを回避するために、wmode属性値として、”transparent”もしくは”opaque”を記述します。
上記の対応により、招待機能のポップアップ画面がFlashコンポーネントよりも手前に表示されるようになります。

3、実際にmixiアプリにFlashを埋め込む

1
2
3
4
5
6
7
8
9
10
11
12
<script type ="text/javascript">
function init(){
        var params = { width:300; height:150 );
gadgets.flash.embedFlash{
                 "http://albatrus.com/flash/content.swf",
                  document.getElementById("target"),
                  6,
                 params);
gadgets.util.registerOnLoadHandler(init);
</script>

<div is="target"></div>

gadgets.flash.embedFlash()の引数は以下の通りです。

  1. swfファイルのURL
  2. Flashコンテンツを埋め込む先となるDOM要素またはID文字列
  3. 対象Flashコンテンツが必要とする「Flash player」の最小バージョン
  4. Flashコンテンツが埋め込まれる際に指定したいパラメータを持つオブジェクト

第二引数としてDOM要素をしていることになるため、あらかじめタグの[CDATAセクションのなかに「div」を仕込んでおくか、動的要素に生成しておくことが求められます。

情報を共有しよう。

※抜粋
mixiアプリは、Persistence APIを利用することで、情報の永続化および共有を行うことが可能となります。その際、特に共有に関して、扱われる情報の持ち主が誰なのか、という点を考慮した処理を記述することになります。つまり、永続化された情報の取得に関して「誰の情報を取得するか」という指定が必要となるということです。

1、情報の永続化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var exp = "1<x<3";
var result = 2;
var req = opensocial.newDataRequest();
req.add(req.newUpdatePersonAppDataRequest(opensocial.IdSpec.personId.VIEWER,"exp",exp),"response1");
req.add(req.newUpdatePersonAppDataRequest(opensocial.IdSpec.personId.VIEWER,"result",result),"response2");

req.send(function(data){
              if(data.hadError()){
                     var msg =data.getErrorMessage();
                              //要求を失敗した際のエラー
                }else {
                     var response1 = data.get("response1");
                     if(response1.hadError()){
                                 var code = response1.getErrorCode();
                                 var msg = response1.getErrorMessage();
                                          //永続化に失敗したときのエラー処理
        }
                     // response2についても同様の処理
                 }
});

永続化で利用するのは「req.newUpdatePersonAppDataRequest」です。

  • 第一引数には会員を特定するためのID(ほとんどの場合VIEWER)
  • 第二引数には永続化する情報のキー文字列
  • 第三引数は永続化する情報の文字列

これらの引数を呼び出した結果を、「opensocial.DataRequest.add()関数」に渡して、send()でにリクエストを送ります。

2、永続化された情報を取り出す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var req = opensocial.newDataRequest();
req.add[req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
var keys =["exp","result"];
var idSpecPrams = {};
idSpecParams[opencioal.IdSpec.Field.USER_ID] = opensocial.idSpec.PersonId.VIEWER;
var idSpec = opensocial.newIdSpec(idSpecParams);
req = add(req.newFetchPersonAppDataRequest(idSpec,keys),"stored"); //この際、取得対象とする情報のキー名(stored)を指定します。
req.send(function(data){
         var viewer = data.get("viewer"),getData();
         var stored = data.get("stored").getData();
        var obj = stored[viewer.getId()];
        var exp = obj["exp"];
        var result = obj["result"];
            //expおよびresultを画面に表示
});

永続化された情報を取り出す際には「誰の情報を取得する」かを指定する必要があります。今回はVIEWERを対象としています。今回は変数(idSpecParams)で対象となるVIEWERを設定し、それを引数に新しいopensocial.idSpec()オブジェクトを生成します。

Persistence APIにて提供されるnewFetchPersonAppDataRequest()関数を使うことで、永続化された情報を取得することができます。第一引数に対象者を、第二引数に永続されている情報を特定するキー文字列を指定しています。(今回は情報が2つあるので配列で”exp”"result”を入れている)

後はsend()で指定しているコールバック関数を使い、取得した永続化情報を取り出しています。
永続化されている全ての情報を取得したい場合には、全てのキー文字列を配列で渡す方法の他に、「*」を指定することも可能です。

1
req = add(req.newFetchPersonAppDataRequest(idSpec,"*"),"stored");

3、永続化された情報を削除する。

1
2
3
4
5
6
7
8
var req = opensocial.newDataRequest();
req.add(req.newRemovePersonAppDataRequest(
    opensocial.IdSpec.PersonId.VIEWER, keys), "stored");
req.send(function(data) {
  var response = data.get("stored").getData();
              if(response.hadError()){
                      //エラーの出た際の処理
});

【mixiアプリの場合】
newRemovePersonAppDataRequest()関数の第1引数には、 opensocial.IdSpec.PersonId.VIEWERのみ指定することが可能となっています。

第二引数には削除対象のキー文字列の配列、あるいは全てのキーを表す「*」を指定します。

Opensocial入門を読んで見た(第五章)三回目

今日は定時で帰れたのですが、ホワイトデーのお返しを買っているなどしたらいつもと同じ時間帯になってしまった。
お返しといっても、会社の同僚なんですが今回は思考をこらしてためになりそうな本を選んで送ることにします。

そんなこんなで、第5章の3回目です。
OpenSocial入門 ~ソーシャルアプリケーションの実践開発
OpenSocial入門 ~ソーシャルアプリケーションの実践開発

通知メッセージの送信

OpenSocialでは特定の会員に対して通知メッセージを送信するための処理をできます。
その際には、「会員のID」「友達関係やその距離」を指定します。

送信のメッセージは「タイトル」「本文」「メッセージ種別」から成り立っています。
opensocial.newMessage()関数を使いメッセージを作成。それをopensocial.requestSendMessage()関数に渡して送信を依頼します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var params = {};
var bady = "私が持っている品物をあなたに譲りたいと思っています。";

params [opensocial.Message.Field.TITLE] = " お得情報" ;
params [opensocial.Message.Field.TYPE] = opensocial.Message.Type.PRIVATE_MESSAGE;
var msg =opensocial.newMessage(body,parames);

opensocial.requestSendMessage("VIEWER_FRIENDS",
                                                       msg,
                                                       function(status){  //コールバック関数
                                                               if(status.hadError()){
                                                                     var errorVode = status.getErrorCode();
                                                                     var errorMessage = status.getErrorMessage();
                                                                       //エラー発生時の処理
                  } else {
                                                                       //メッセージ送信が完了したときの処理
                  }
                          });

「opensocial.requestSendMessage」の第一引数には宛先を指定する(今回の例ではVIEWER_FRIENDS)。

opensocial.request.Send.Message()の宛先

宛先 説明
会員ID 指定されたIDの会員にメッセージが送信される
会員IDの配列 指定されたIDすべての会員にメッセージが送信される
OWNER OpenSocialアプリの持ち主である会員に送信される
VIEWER OpenSocialアプリを実行している会員自身に送信される
OWNER_FRIENDS OpenSocialアプリの持ち主である会員が登録している友達全員にメッセージが送信される
VIEWER_FRIENDS OpenSocialアプリを実行している会員自身の友達全員に送信される

[mixiアプリ]
mixiアプリの場合は、第一引数には「ユーザーID」第二引数には「opensocial.newMassage()で指定したオブジェクト」第三引数にはメッセージを送信した際のコールバック関数を指定します。

アプリケーションへの招待

先ほどはメッセージを送信する手順を見てみましたが、今度は他のユーザーにアプリを招待するための方法です。
先ほどの「opensocial.request.Send.Message()」と非常に似ています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var params = {};
var body = " 非常に楽しい体験ができます。このアプリを使ってみましょう。";
params[opensocial.Message.Field.TITLE] = "おすすめアプリ";
var msg = opensocial.newMessage(body,params);

opensocial.requestShereApp("VIEWER_FRIENDS",msg,function(status){
                                                                if(status.hadError()){
                                                                     var errorVode = status.getErrorCode();
                                                                     var errorMessage = status.getErrorMessage();
                                                                       //エラー発生時の処理
                  } else {
                                                                       //メッセージ送信が完了したときの処理
                  }
                          });

メッセージの送信で出た「opensocial.requestSendMessage()」が「opensocial.requestShereApp()」に変わっただけです。
第三引数のコールバック関数はおもにエラー処理を記述します。

「opensocial.requestShereApp()」が呼び出された後に、ダイアログが表示されます。
このダイアログはOpensocialアプリによって決められた招待する会員の候補が表示されますので、その中から実際に招待した会員を選びます。
このダイアログが閉じた後でコールバック関数が呼び出され、招待に対する後処理を行うことが可能になります。

[mixiアプリ]

mixiアプリにも招待機能はついています。「opensocial.requestShereApp()」関数の引数がほぼ固定されています。

  • 第一引数は”VIEWER_FRIENDS”を指定
  • 第二引数は、null を指定
  • 第三引数は、招待が行われた後に呼び出されるコールバック関数を指定

「opensocial.requestShereApp()」を呼び出すとポップアップ画面が出てきますので、招待したいユーザーを選びます。そのポップアップ画面がが閉じた後に第三引数が実行されます。

詳しくはこちらに載っていますので参考にしていただければ。

Opensocial入門を読んで見た(第五章)二回目

totoBIGが当然のように外れたのでテンションは低めですが、前回に引き続き「OpneSocial」のAPIの勉強をしたいと思います。
mixiアプリの大本営も参考にしていきます。

OpenSocial入門 ~ソーシャルアプリケーションの実践開発
OpenSocial入門 ~ソーシャルアプリケーションの実践開発

会員情報項目の取得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var = params{};
params = [opensocial.DataRequest.PeopleRequestFields]=[
                            opensocial.Person.Field.AGE,
                            opensocial.Person.Field.GENDER,
                            opensocial.Person.Field.CURRENT_LOCATION];
 var req = opensocial.newDataRequset();
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER,params),"viewer");
req.send(function(data){
             var person = data.get("viewer").getData();
             var age = person.getField(opensocial.Person.Field.AGE);
             var gender = person.getField(opensocial.Person.Field.GENDER);
                     if(gender.getkey() == opensocial.Enum.Gender.FEMALE){
                                          //女性だった際の処理
                     } else if(gender.getkey() == opensocial.Enum.Gender>MALE){
                                         //男性だった際の処理
                     } else{
                                //性別が登録していなかった時の処理
      }
             var address = person.getField(opensocial.Person.Field.CURRENT_LOCATION);
});

opensocialによってあらかじめ選択肢が規定されている項目があります。上記の例で言えば「opensocial.Enum.Genderクラス」によってMALE,FEMALEとがフィールドに定義されています。
また、お気に入りなどで複数項目を設定があった場合、getField()を使った際には配列で情報を得ることができます。

opensocial.Person.Fieldクラスには様々なフィールドが用意されていますが、通常はOpensocial対応SNSによって取得に関して一定のルールが定められています。このルールのことを「パーミッションモデル」と言います。
mixiアプリにおいても対象となる情報があります。くわしくはこちら

アクティビティの作成

アクティビティとは更新情報のことです。
このアクティビティの作成と公開はOpenSocialアプリを実行している会員(VIEWER)に対して行われます。つまり作成されたアクティビティの持ち主はOpensocialアプリを実行したユーザーになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//OpenSocial.Activityオブジェクトを作成する。
var params = {};
params = [opensocial.Activity.Field.TITLE] = "ハイスコア情報" ;
params = [opensocial.Activity.Field.BODY]  = "誰よりも高い点数を獲得しました。";
var activity = opensocial.newActivity(params);
//アクティビティの生成をサーバーに依頼する。
opensocial.requestCreateActivity(activity , opensocial.CreateActivityPriority.LOW,function(response){
                                                                           if(response.hadError()){
                                                                                   var code = response.getErrorcode();
                                                                                   var msg  = response.getErrorMessage();
                                                                                        //エラー発生時の処理
                       } else{
                                                                                        //アクティビティ作成完了の処理
                      }
                                                                      });

opensocial.CreateActivityPriority.LOWでアクティビティの優先順位を決めていますが(HIGHかLOW)、現在のmixiアプリではこの優先度をサポートしていませんので、 opensocial.CreateActivityPriority.HIGHを指定しておけば良いでしょう。

アクティビティは文字列だけではなく、画像や動画なども設定できます。その際にはopensocial.newMediaItem()関数使います。その後にOpenSocial.Activityに追加します。

1
2
3
4
5
6
7
8
9
10
11
var mediaItem = opensocial.newMediaItem("image/gif" , "http://albatrus.com/image.gif/");

var params = {};
params = [opensocial.Activity.Field.TITLE] = "ハイスコア情報" ;
params = [opensocial.Activity.Field.BODY]  = "誰よりも高い点数を獲得しました。";
params = [opensocial.Activity.Field.MEDIA_ITEMS]  = [mediaItem];
var activity = opensocial.newActivity(params);
opensocial.requestCreateActivity(
                      activity,opensocial.CreateActivityPriority.HIGH,function(response){
                                                        //アクティビティが完了した際の処理
});

アクティビティの遷移先の指定

アクティビティをユーザーがクリックした際に飛ぶリンク先を指定できます。その際には「opensocial.Activity.Field.URL」を使って設定します。

1
2
3
4
5
data[opensocial.Activity.Field.URL] = "http://albatrus.com /run_appli.pl?id=" + appId + "&" + escaped;
var activity = opensocial.newActivity(data);
opensocial.requestCreateActivity(
    activity,opensocial.CreateActivityPriority.HIGH,function(response) { }
);

これ以外に、mixiアプリは以下のカスタマイズを行うことが可能です。

  • 遷移先のページ – run_appli.pl(アプリ画面)もしくはview_appli.pl(アプリ紹介画面)
  • mixiアプリ起動時に渡したいパラメータ – appParams

パラメータを指定できることで、特定のアクティビティからのmixiアプリ起動時に動きを変化させる、などの工夫を行うことができます。

Opensocial入門を読んで見た(第五章)

今回の第五章はOpenSocialのAPIの解説が載っています。
Mixiアプリの大本営のHPと一緒に勉強をしていきます。
実は本に載っていることとmixiのHPの情報は同じ部分が多いです。

OpenSocial入門 ~ソーシャルアプリケーションの実践開発
OpenSocial入門 ~ソーシャルアプリケーションの実践開発

OpenSocial JavaScript API

「OpenSocial JavaScript API 」はOpenSocialアプリを開発する上でもっとも基本且つ重要なAPIです。主にソーシャルデータに特価した機能を提供します。

ユーザー情報を取得

1
2
3
4
5
6
7
8
9
10
11
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 {
                 // 取得結果に対する処理
              }
        });

newFetchPersonRequest()関数の第1引数には、取得したいユーザを特定するための値を指定します。

  1. Viewer(アプリケーションを操作するユーザ) – opensocial.IdSpec.PersonId.VIEWER
  2. Owner(アプリケーションの持ち主) – opensocial.IdSpec.PersonId.OWNER
  3. 任意のユーザ – 取得したいユーザのMember ID

newFetchPersonRequest()関数で取得できるデータは

  • 「ID:getid()」
  • 「NAME:getDisplayName()」
  • 「プロフィールの写真(THUMBNAIL_URL):getField(opensocial.Parson.Field.THUMBNAIL_URL)」
  • の3つです。

    上記以外のデータを取得する場合は、opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS定数を使って追加取得したい項目を配列でしていします。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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) {
      // プロフィール情報使った処理
    });

    add() 第一引数にリクエストをオブジェクトを指定します。第二引数にこのリクエストの結果を取り出すために使用することになるキー文字列を渡しておきます。

    send():実際にOpenSocial採用SNSのサーバーにアプリケーションからプロフィール情報の取得要求が送信されます。取得結果がが返送された際には、send()関数の引数に指定した関数が実行されます。今回の場合は「function(data){ });」が実行されます。

    ユーザー情報を取り出す

    ユーザー情報を取り出す流れ

    1. リクエストを「data」から取り出す処理はget()関数を使っています。
    2. もしエラーが発生していなかったら、今度はgetData()関数を使いある特定のユーザープロフィール情報を取り出します。
    3. 後は、このオブジェクトからユーザープロフィール情報の項目を利用してコンテンツを作成することができます。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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);

              // プロフィール情報を使った処理
            }
        }
    });

    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。

    mixiの場合は「GROUP_ID」はFRIENDS(友達)、SELF(自分自身)のいずれか。「NETWORK_DISTANCE」は1で固定なので設定しません。
    IdSpecオブジェクトは、先ほどの3つの条件を保持するオブジェクトです。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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 {
            // 取得結果に対する処理
        }
    });

    この場合も、ID,NAME,THUMBANAILの3つの情報しかリクエストできないので、その他プロィールを取得する際には、「opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS」を使って設定をしてあげます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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 {
            // 取得結果に対する処理
        }
    });

    友達情報の取り出す(マイミク情報の取り出す)

    ページング
    マイミクが多い場合、すべて一回の通信で取得するのは現実的ではありません。そのため、複数にわけて情報を所得します。send()関数でリクエストを送る前に、一回のリクエストで何件の情報を取得するかを設定します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //情報のリクエスト内容
    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) + " 件目";
      // メッセージの表示と会員情報に対する処理
    });

    「opensocial.DataRequest.PeopleRequestFields.MAX」で一回の取得件数をしていしています。

    OpenSocialアプリの内容によっては、取得したい会員に何かしらのフィルターをかけたい場合には「opensocial.DataRequest.PeopleRequestFields.FILTER」を使います。

    マイミクの中ですでにそのmixiアプリを使っている人(opensocial.DataRequest.FilterType.HAS_APP;)をフィルタリングする。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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) {
         //会員情報を使っての処理
      });
    });

    「opensocial.DataRequest.PeopleRequestFields」にはMAX,FIRST,FILTER以外にもSORT_ORDER(並び順の指定)などがあります。これらはすべて平行して利用が可能です。これらの処理をうまく利用できれば、OpenSocialアプリの起動時間の短縮に利用できます。