2011年12月11日日曜日

続・Titanium と BirdHouse で TwitterOAuth

というわけで、BirdHouseを使ってOAuth認証させるにあたり、相当直した。
直したっていうか、直して、エミュレータでは、動いたけど、実機で動くかは、まだ確かめていない。

まず、PINコードがそのままでは取得できないぽい(?)
function get_request_verifier() を色々と直してやった。
まず function checkStatus() は削除。いらね。
if (loads==2) { ~ }

if(loads==1){var t = setInterval(function(loads){if(loads==2){clearInterval(t);return;}},100);}
こうした。
ログを見ていると、loads がインクリメントされるのが、2回なので、こうしないと動かないぽい。
これにともない、 checkStatus() はいらなくなった気がする。
あと、 loading というフラグもいらなくなった気がする。

で、
else if (loads==3) { ~ }
がこうなった。
else if (loads==2) {
    var pincode = webView.evalJS('window.document.body.innerHTML');
    pincode     = pincode.replace(/\s|\r\n|\r|\n|\t/gi,"").replace(/.*.<code>|<\/code>.*./gi,"").replace(/\s|\r\n|\r|\n|\t/gi,"");
    cfg.request_verifier = pincode;
    if (cfg.request_verifier!="") {
        // my attempt at making sure the stupid webview dies
        webView.stopLoading();
        win.remove(webView);
        get_access_token(callback);
        setTimeout(function(){ //* TODO: check for ios vs android
            win.close(); //* we close it after 3 seconds, which is more than enough time
        }, 3000);
        return true; // we are done here
    }
}

PINを取得する部分は、どうしてもTwitterなどサービス側の仕様変更などに、
粒さに対応し、手を加えなくてはいけない気もする。
めんどくせーから正規表現でボリボリとむしってみた。
最後のreplace()は完全に蛇足だけど、心配性なの私。

赤字の部分は、
https://github.com/jpurcell/birdhouse/issues/16
ココを元に。
古い端末向けに、Windowが閉じるのを数秒待たないと、

W/MessageQueue( 337): Handler{4059ce70} sending message to a Handler on a dead thread
こう言われて、AccessToken が取得できなくなってしまうぽい。

他は、requestToken 発行用のURLと authorizeURL 、 AccessToken 発行用の URL を init() のパラメタにして、
AccessToken 、AccessTokenSecret の保存先をあれやこれやしてみた。
まぁ、PINコード取得画面がサービス毎に違うだろうから、単純にはいかないだろうけど、
Tumblr と Flickr でも OAuth で認証させたいので、そこらへんもカリカリして、
ホゲホゲしたら、後は動かせるかなぁ~という感じ。
OAuth対応だけで一日かかったよ~。めんどくせ。

0 件のコメント:

コメントを投稿