2012年2月28日火曜日

認可コードのスクレイピング(WindowsPhone)

クライアントアプリでGoogleのOAuthを行うと

という風に認可コードが取得できます。 この文字列をアプリ側に送信するのですが、 スマートフォンでこの認可コードを入力するのは至難の業です。いや苦行です。 そこでコピペとなるところですが、 Googleの認可コードのページでWindowsPhoneのコピペが何故か機能しません。 私自身開発中に頑張って入力するという苦行を行なっていました。 ※リフレッシュトークンの実装後にその苦行を忘れる エミュレータはまだキーボード入力が可能なのでいいのですが 実機になるとそれもなくなり本物の苦行を強いる事になります。 しかもコードをミスって入力した場合に開発者(私)は発狂して WindowsPhoneへの恨みが重なっていきます。 んで冷静に考えるとHTMLスクレイピングして認可コードを取得すればOKだと至りました。 まぁ他のTwitterクライアント見て実現していたので「あー可能なんだ」って思ったのが この苦行への終止符だったわけです。 ※Twitterは8桁の数値なので別に苦行レベルでもない気がしますけど。 まぁそんな苦行を強いるアプリが生まれないで済むように一応書いておきます。
        private void webBrowser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
        {
            string uri = webBrowser.Source.AbsoluteUri;

            if (uri.IndexOf("/o/oauth2/approval") != -1)
            {
                string html = webBrowser.SaveToString();

                int tagStart = html.IndexOf("<textarea");
                int tagStartEnd = html.IndexOf(">", tagStart);

                int tagEnd = html.LastIndexOf("</textarea>");

                string pin = html.Substring(tagStartEnd + 1, tagEnd - tagStartEnd-1);
                textBox.Text =pin;
            }

        }
WebBrowserに対してLoadCompletedイベントを作成します。 WebBrowser.SourceのUriからAbsoluteUri(LocalPath、AbsolutePathでも可能)から 認可した場合の画面を判定します。 WebBrowserのSaveToString()から内部のHTMLを取得して、 あとは認可コードを書いてあるtextareaタグを解析です。 まぁ試しのコードではそのままテキストボックスに設定してますけど、 そのままアクセストークンを取得するコードに流してもOKなんでしょうけど少し悩ましいです。 気持ちの問題なのですがOAuthのような認可手順に対して、 ユーザが要求したWebページを表示せず(実際は表示する寸前)に次の画面に遷移するっていうのが 果たして正解なのかどうかっていう事です。 まぁWebアプリの場合このままコールバックになるわけだからいいんでしょうね。 エンドユーザにはOAuthという認可方法はそんなに関係ないですし。

1 件のコメント:

Unknown さんのコメント...

あっLastIndexOf()になってるけどIndexOf()じゃないと辻褄あいませんね><