読者です 読者をやめる 読者になる 読者になる

TitaniumMobile勉強記

Web系エンジニア向けのキャリアアドバイザーやってましたが現在はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連(Node.js、Titanium)あたり

030-Google Readerのスターアイテム一覧を取得する

iOSシミュレータ
しばらくサーバーサイドの開発してて、Titanium MobileをいじりたくなってきたのとGoogle Readerから情報取得するコードをちょっと見直していたので、試しにGoogle Readerのスターアイテム一覧を取得するコード書いてみました。

//google_account.js
var GoogleAccounts = function(email, password){
  this._authToken = null;
  this.auth = null;
  this.httpclient = Titanium.Network.createHTTPClient();
  this.config = {
    email          : email,
    password       : password,
    login_param :{
	accountType: 'HOSTED_OR_GOOGLE',
	Email : email,
	Passwd : password,
	'Content-Type': "application/x-www-form-urlencoded",
	service        : "reader"
    }
  };
};

GoogleAccounts.prototype = {
  get:function(item){
    var self = this;
    self.httpclient.open('POST','https://www.google.com/accounts/ClientLogin');
    // レスポンスを受け取るイベント
    self.httpclient.onload = function(){
      //AuthKey取得した後にその値をHeaderにセットして認証処理を行う
      var body = this.responseText;
      var matches = body.match(/Auth=(.*)/);
      var results = matches[0].split('Auth=');
      var auth_token = results[1];

      /*
       認証用のパラメータ設定した後メソッドの引数に基づいて
       GoogleReaderのどのリストにアクセスするか決定する

       */

      if(this.status===200){
	self.setAuthParam("GoogleLogin auth=" + auth_token);
	if(item === 'Starred'){
	  self.Starred();
	}else{
	  self.SubscriptionList();
	}
      }else{
	//認証通らない場合の処理
      }
    };
    self.httpclient.send(this.config.login_param);
  },
  setAuthParam:function(param){
    this.auth = param;
    return this.auth;
  },
  Starred:function(){
    var self = this;
    var data = [];
    var xhr = Titanium.Network.createHTTPClient();
    xhr.open('GET','http://www.google.com/reader/atom/user/-/state/com.google/starred');
    xhr.setRequestHeader("Authorization",self.auth);
    xhr.onload = function(){


      var index = 0;
      var xml = this.responseXML;

      var entry = xml.documentElement.getElementsByTagName("entry");

      for(var i=0;i<entry.length;i++){
	var item = entry.item(i);
	var contents='';
	/*
	 contentタグに実際のエントリ情報が格納されているはずだけど
	 要素がnullの場合もあるため、念のためチェック
	 要素が取得できた部分についてはHTMLタグを除去

	 */
	if(item.getElementsByTagName("content")!==null){
	  contents = item.getElementsByTagName("content").item(0).text.replace(/<\/?[^>]+>/gi, "");
	}else{
	  contents = null;
	}

	var row = Ti.UI.createTableViewRow({
	  hasChild:true,
	  height:80
	});

        var title = Ti.UI.createLabel({
	     font:{fontSize:14},
	     color:'#576996',
             text:item.getElementsByTagName("title").item(0).text,
             left:20,
	     top:5,
	     width:250,
             height:20
        });
	row.add(title);
	var content = Ti.UI.createLabel({
	     font:{fontSize:10},
             text:contents,
             left:30,
	     top:22,
	     width:250,
             height:55
        });
	row.add(content);

	data[index++] = row;
      }
      var tableview = Titanium.UI.createTableView({data:data});
      Titanium.UI.currentWindow.add(tableview);

      Titanium.API.info(xml.documentElement.getElementsByTagName("entry"));
    };
    xhr.send();
  },
  SubscriptionList:function(){
    //まだ実装してない
};

上記を使う側は、こんな感じにすればOK

Titanium.include('google_account.js');
var GoogleReader = new GoogleAccounts('xxxx@gmail.com','PASSWORD');
GoogleReader.get('Starred');

ここまで書いて、気づいたのは、GoogleReaderのスターアイテムを取得する非公式APIhttp://www.google.com/reader/atom/user/-/state/com.google/starred)はデフォルトで20件取得できるけど、ページという概念がおそらくないと思うので、続きを取得するロジックは自分で考えないとたぶんダメなんだろうなぁ。