会社の方のブログでWindowsでもGoogleReaderでスターを付けたエントリをまとめてEvernoteへ自動クリッピング出来そうですというのを書いたのですが、そのエントリのコメントでGoogleReader→Evernote連携が出来ないというコメントがあったので、そちらのソースを読んでいる流れで
「あー、そういえば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に処理を移すっていう感じでコード書けばいいんだろうけど、もう会社行かないといけないので今日はここまで。