mixiアプリ/日記4
自分のプロフィールを表示させたい
最近、自分のマイミクさんたちの間で「サンシャイン牧場」が流行っています。意外な人までmixiアプリに熱心になっているので、ちょっとびっくりだったりもします。公表されているアプリの一覧を眺めているとFlashを併用したものが多く、また人気もあるように思われます。直観的な操作感が、誰にでも親しめるポイントになるのかもしれませんね。
さて、前回の話に出てきたガジェットの定義ファイルの中に自分のコンテンツを盛り込んでいく段階になりましたが、せっかくmixiのプラットフォームをお借りできるのですから、mixiが持っているデータを拝借して表示してみるのも一興ではないでしょうか。単純な一プレイで完結するようなゲームコンテンツですと、一回遊んですぐに忘れられてしまうかもしれませんが、ゲームのプレーヤー名として自分のmixiニックネームが表示されたら感情移入の度合いも高まるかもしれません。
性別、誕生日、血液型などのプロフィールを使った「占い」コンテンツは、思いつきやすいせいか過当競争にさらされそうですね。今回は取り扱いませんが、マイミクさんのプロフィール情報と組み合わせて「相性診断」のようなコンテンツが発想されやすいと思いますが、アイディア次第では人気アプリになりうると思います。最早、定番なのか「脳内メーカー」アプリも登録されていましたが、見せ方一つでも面白くなるいい例だと思います。なお、mixiのプロフィール編集欄を見るとわかるとおり、「名前」「現住所」「性別」「誕生日」「誕生年」「血液型」「出身地」などのプロフィールは公開対象を限定することが可能になっています。mixiアプリでもこちらのルールは適用され、公開されていない情報にはアクセスすることができなくなっています。・・・できたら困ります。
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
req.send(function(data) {
if (data.hadError()) {
//読み込み不全エラー処理
} else {
var viewer = data.get("viewer").getData();
var name = viewer.getDisplayName();
var thumbnailUrl = viewer.getField(opensocial.Person.Field.THUMBNAIL_URL);
//取得したデータを扱う処理
}
});
実際に自分がmixiのDevelopers Centerを参考に書いた処理は上記のような感じです。少しずつ解説してみましょう。
opensocial
一行目からopensocialなる定義した覚えのない変数が出てきましたが、こちらの定義はmixiサイト側で自動的に定義してくれるような仕組みになっているのでしょう。OpenSocialのコアになるオブジェクトのインスタンスですね、きっと。OpenSocialに関連する処理はこちらの仲介を経て実行されることになります。すなわち今のところ深く考えないでもよさそうです。
newDataRequestメソッド
具体的にmixiのサーバに「プロフィールの情報をください」と要求をするときは、このメソッドで伝言係を作成します。(上のサンプルではreqが伝言係になります。)この伝言係は有能でして、自分のプロフィール以外にも様々な情報をmixiサーバから持って帰ってくれます。逐一、情報が欲しくなった段階で伝言係に頼んでもいいのですが、伝言係の往復が多くなってしまい、mixiサーバに負荷がかかってしまいますので、できる限り一度にまとめて情報を要求するのが作法として正しいようです。
newFetchPersonRequest
newDataRequestで生成した伝言係に伝言を預けるメソッドが「add」です。最初の引数に頼みたい伝言を、2番目の引数に伝言の名前を渡すことになります。積み荷と荷札みたいなものでしょうか。荷札には「viewer」と名前をつけてあります。
そして今回はユーザー自身の「プロフィール」を要求したいので、newFetchPersonRequestメソッドで伝言を生成して、最初の引数に渡しています。Personとついているように「人」に関する情報をリクエストする伝言はこれで作るんでしょうね。ちなみに、これも伝言係のクラスのメソッドです。伝言を届けるだけではなく、積み荷自体の梱包作業までお世話してくれるのだから頼もしいやつです。
このメソッドの引数には「opensocial.IdSpec.PersonId.VIEWER」という定数を渡しています。アプリのページにアクセスしている閲覧者(VIEWER)のことを示す値が入っているんでしょう。
今回は扱いませんが、「VIEWER」の部分を「OWNER」に変えてやるとアプリ登録者のことを指す値が入ります。例えば、AさんがBさんのプロフィール画面を見に行ったとき、その画面中のアプリではAさんがVIEWERで、BさんがOWNERになります。AさんとBさんの情報を取得して、組み合わせることで、新しい情報が生まれ、付加価値がつくというわけですね。
その他にもVIEWERでもOWNERでもない第三者の情報を、メンバーIDを引数に与えることで取得できるそうです。
getDisplayName
最後に伝言係にsendメソッドで実際に伝言を送ってもらいます。第一引数にはmixiサーバに伝言を送って、返事をもらって帰ってきた直後に実行される関数を渡してやります。伝言係さんお疲れさまでした。帰ってきた伝言係に渡された返事のデータが先ほど指定した関数に引数として渡されます(サンプルでは変数名data)ので、この中身をひも解いて確認しましょう。
とりあえず、お使い係がちゃんと伝達できたのかどうかをhadErrorメソッドで確認してやるのが作法のようです。通信の障害や何らかのミスで要求が通らなかった場合、真値が返るので、エラー用の処理を書くことができます。エラー用の処理って言われても、致命的なものじゃなければ、私はあんまり何もしないことが多いのですが、くじけず要求をリトライしたり、「エラーだからリロードしてね」と表示したりと、何かした方が親切なんでしょうね。そういうエラー処理の方針として、革新的なものってあんまり聞かないのですが、mixiアプリの場合どうしてあげるのがベストなんでしょう。
エラーが特にないようでしたら、返事のデータ(data)から要求していたデータを取り出します。最初に荷札(viewer)を張り付けておいたので、data.get("viewer")が頼んでいた代物となります。そこからさらにgetDataメソッドで中身を取り出してやりますとやっと目当てのデータにアクセスできます。梱包された商品を開けていくような作業ですね。サンプルではviewerという変数を用意して、そこにプロフィールのデータを入れておきました。
あとは自由にプロフィールデータを出し入れできます。
getDisplayNameメソッドではmixi内のニックネームを取得できますし、getFieldメソッドでは引数の指定次第でその他のデータにもアクセス可能です。・・・と思っていましたが、この段階で取得できるのは以下の情報だけなんだそうです。
getId() | メンバーID |
getDisplayName() | ニックネーム |
getField(opensocial.Person.Field.THUMBNAIL_URL) | プロフィール写真のURL |
無条件に何でも取得できると思ったら大間違いだぞっ!ってことらしいですね。帯域にかかる負荷を考慮すれば、必要なときに必要な分だけ要求してほしいというのも納得です。血液型や現住所を取得するには、また別の作法が必要とのことでした。自分で作っているアプリはニックネームと写真のURLで事足りたせいで見落としていました。
具体的にはnewFetchPersonRequestの第2引数に、欲しい情報の配列を渡してあげればいいだけだそうです。欲しい情報というのは、定数表現で以下のような感じです。
opensocial.Person.Field.PROFILE_URL | プロフィール画面の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 | 血液型 |
これを配列にして、第2引数の[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS]メンバに指定して・・・結構、話が複雑になってきましたが、最初に登場した伝言係にはいろいろと事前に言いつけられるということがわかりました。
上記の定数は、受け取った返答から、データを抜き出すときにも使えます。getFieldでプロフィール写真のURLを取得した時と同じ要領ですね。
次回はマイミクの情報を取得してみようと思います。