40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

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

会社の方のブログで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に処理を移すっていう感じでコード書けばいいんだろうけど、もう会社行かないといけないので今日はここまで。