tetsunosukeのnotebook

tetsunosukeのメモです

mixiアプリでプロフィールを取る実験

下記コードにて。なんか、プロフィールの中にも関数一発で取れたり、独自属性だったりするのがめんどい。unstructuredとか取れるのか?なんか取り方が強烈に汚い気がする。もしいい方法があったら教えてほしいです。

<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
<ModulePrefs title="use Social Data">
  <Require feature="opensocial-0.8" /> 
  </ModulePrefs>
  <Content type="html" view="canvas">
  <![CDATA[ 
   <script type="text/javascript">
      function request() {
    var req = opensocial.newDataRequest();
    req.add(req.newFetchPersonRequest("VIEWER"), "viewer_data");
    req.send(response);
        }

        function response(dataResponse) {
  var viewer = dataResponse.get("viewer_data").getData();
                /** start **/
  var list = document.createElement("ul");
  var thumbnail = document.createElement("li");
  thumbnail.appendChild(document.createTextNode(viewer.getField("thumbnailUrl")));
  list.appendChild(thumbnail);

  var lastLogin = document.createElement("li");
  lastLogin.appendChild(document.createTextNode(viewer.getField("lastLogin")));
  list.appendChild(lastLogin); 
   
  var username = document.createElement("li");
  username.appendChild(document.createTextNode(viewer.getField("name").getField("unstructured")));
  list.appendChild(username);
   
  var dateOfBirth = document.createElement("li");
  dateOfBirth.appendChild(document.createTextNode(viewer.getField("dateOfBirth")));
  list.appendChild(dateOfBirth);

  var age = document.createElement("li");
  age.appendChild(document.createTextNode(viewer.getField("age")));
  list.appendChild(age);
   
  var profileUrl = document.createElement("profileUrl")
  profileUrl.appendChild(document.createTextNode(viewer.getField("profileUrl")));
  list.appendChild(profileUrl);

  var addresses = document.createElement("li");
  addresses.appendChild(document.createTextNode(viewer.getField("addresses").unstructured_address));
  list.appendChild(addresses);
   
  var bloodType = document.createElement("li");
  bloodType.appendChild(document.createTextNode(viewer.getField("bloodType")));
  list.appendChild(bloodType);

  var updated = document.createElement("li");
  updated.appendChild(document.createTextNode(viewer.getField("updated")));
  list.appendChild(updated);

  var gender = document.createElement("li");
  gender.appendChild(document.createTextNode(viewer.getField("gender").displayValue));
  list.appendChild(gender);

  document.getElementById("id").appendChild(document.createTextNode(viewer.getId()));
  document.getElementById("owner").appendChild(document.createTextNode(viewer.isOwner()));
  document.getElementById("viewer").appendChild(document.createTextNode(viewer.isViewer()));

  var nickname = document.getElementById('nickname');
  var text = document.createTextNode(viewer.getDisplayName());
  nickname.appendChild(text);
  var profile = document.getElementById("profile");
  profile.appendChild(list);
 }
        gadgets.util.registerOnLoadHandler(request);
 </script>
 <p>Nickname:<span id="nickname"></span></p>
 <div id="profile"></div>
 <p>Id:<span id="id"></span></p>
 <p>Owner?<span id="owner"></span></p>
 <p>Viewer?<span id="viewer"></span></p>
        ]]> 
    </Content>
</Module>

追記。もっと綺麗な書き方ないのかよと悩んで(?)いたプロフ情報取得関連ですが
mixiのリファレンス:http://developer.mixi.co.jp/appli/javascript-api
を見ると

opensocial.Person.Field.ADDRESSES

とかで書けるらしいです。もっともこの書き方だとリファレンス的にはlastLoginとかが取れないっぽいですが。

もっと一般的なOpenSocialの仕様としては
http://code.google.com/intl/ja/apis/opensocial/docs/0.8/reference/#opensocial.Person
こんな感じに addressなどが取れるようになっているみたいです。
http://code.google.com/intl/ja/apis/opensocial/docs/0.8/reference/#opensocial.Person.Field.ADDRESSES

コンテナが対応するかどうかは謎、という記述になっているので、それはそれですが、少なくとも対応するアプリはしかるべき取り方で取得すればよいようです。