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

TitaniumMobile勉強記

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

025-ついつい脱線してGoogleReaderのライブラリ作り始めた

Titanium Mobile

会社の方のブログでWindowsでもGoogleReaderでスターを付けたエントリをまとめてEvernoteへ自動クリッピング出来そうですというのを書いたのですが、そのエントリのコメントでGoogleReaderEvernote連携が出来ないというコメントがあったので、そちらのソースを読んでいる流れで

「あー、そういえばnode.js用にGoogleReader作っていたなぁー」

ということを思い出しました。

node.jsのhttp clientとTitaniumのhttp clientの使い方はもちろん違えど、移植するのはそんなに大変じゃないかなと思ってついつい脱線してGoogleReaderのライブラリ出来ないかなと思ってこんな感じでやってみました

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 = {
  login:function(){
    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];

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

  }
};

でも課題が・・

こんな感じでGoogleAccountログインして、GoogleReaderのスターのアイテムを取得します

var Google = new GoogleAccounts('xxxxx@gmail.com','xxxxx');
Google.login();

これだと、スターアイテム取得するのを決めうちになってしまうため、

//中略
      if(this.status===200){
	self.setAuthParam("GoogleLogin auth=" + auth_token);
      }else{
	//認証通らない場合の処理
      }

という感じでAuthの値を一旦セットしておいてgetStarred()は

  getStarred:function(param){
    this.login();
    var xhr = Titanium.Network.createHTTPClient();
    xhr.open('GET','http://www.google.com/reader/atom/user/-/state/com.google/starred');
    xhr.setRequestHeader(this.auth);
    xhr.onload = function(){
       Titanium.API.info(this.responseText);
    };
    xhr.send();
  }

となっていて、

var Google = new GoogleAccounts('xxxxx@gmail.com','xxxxx');
Google.getStarred();

としたんだけど、何故かgetStarred()のthis.login()が先に実行されてないために、Authの値がnullになってしまう・・・

this.login()を待ってそれがOKだったらxhr.openに処理を移すっていう感じでコード書けばいいんだろうけど、もう会社行かないといけないので今日はここまで。