森理 麟(moririring)のプログラマブログ

ゲームプログラマ森理 麟がのプログラムの話題を中心に書くブログです。

C#の自作クライアントアプリケーションでユーザーのPINコードを自動で取得してしまう方法

OAuth認証を利用しクライアントアプリケーションから Twitterにつぶやきを投稿するなどで、認証は済んでいることが前提です。

ここまで出来るようになったらユーザーにクライアントアプリケーションを登録させたくなります。

ただTwitterクライアントと分かってダウンロードしているユーザーなら、PINコードの認証はもう自動でやって欲しいと思います。

その部分のソースコードはググっても見つからなかったので、作りました。


TwitterのノウハウというよりはHTMLの自動化のノウハウです。自動化にはWebBrowserを使います。

WebBrowserはユーザーに見せる必要はないので、製作が終わったらVisible=falseにしてしまいます。これで自動的に取得しているように見えます。

先ず認証画面にユーザー名とパスワードを入れて認証するところの自動化です。

ユーザー名とパスワードはもちろん打ってもらいましょう。

webBrowser1.Navigate(new Uri(url));
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }
HtmlElementCollection all = webBrowser1.Document.All;
HtmlElementCollection userforms = all.GetElementsByName("session[username_or_email]");
userforms[0].InnerText = UserTextBox.Text;

HtmlElementCollection passForms = all.GetElementsByName("session[password]");
passForms[0].InnerText = PassTextBox.Text;

HtmlElement allowforms = webBrowser1.Document.GetElementById("allow");
allowforms.InvokeMember("click"); // ボタンのクリック


これで、アプリ認証まで勝手に押せます。

この後クリックして画面が変わる所を待つ方法に苦労しましたが、実はイベントでありました。

ページが変わったらDocumentCompletedが来ます。

後は正規表現でPINコードだけを取得します。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
	System.Text.RegularExpressions.MatchCollection mc =
	    System.Text.RegularExpressions.Regex.Matches(
	    html.ToString(), @"<CODE>(.*?)</CODE>");
	foreach (System.Text.RegularExpressions.Match m in mc)
	{
	    PINtextBox.Text = m.Groups[1].Value;
	}
}