Windows Phone 7でTwitterのoAuthに対応しようとしたときに便利なのがneueccさん作成のReactiveOAuthです。
ReactiveOAuthはその名の通りReactive Extentions for .NETの機能を使って作られたライブラリで、Windows Phone 7用も提供されています。
しかし、このライブラリを使うためには当然Rxの使い方が分からないとダメで、サンプルコードがC#でつくられていることもあってVisual Basicで使おうと思うと少々手こずることになります。
まずはサンプルとして付属しているOAuthの認証ページを表示するC#のコードをみてみましょう。
var authorizer = new OAuthAuthorizer(ConsumerKey, ConsumerSecret);
authorizer.GetRequestToken("http://twitter.com/oauth/request_token")
.Select(res => res.Token)
.ObserveOnDispatcher()
.Subscribe(token =>
{
requestToken = token;
var url = authorizer.BuildAuthorizeUrl("http://twitter.com/oauth/authorize", token);
webBrowser1.Navigate(new Uri(url)); // navigate browser
});
Windows Phone 7のネットワーク関連は基本的に非同期のためhttp://twitter.com/oauth/authorizeにアクセスするときには、httpリクエストに対するレスポンスをイベントで処理するような作りになるのですが、ReactiveOAuthのGetRequestTokenを使う事で1行で非同期待ち合わせが記述できています。
では、これをVisual Basic 10 (Visual Basic 2010)で書き直してみましょう。多少相違点はありますが次のようになります。
Dim authorizer As New OAuthAuthorizer(ConsumerKey, ConsumerSecret)
authorizer.GetRequestToken("http://twitter.com/oauth/request_token") _
.Select(Function(res) res.Token) _
.ObserveOnDispatcher() _
.Subscribe(Sub(token)
Dim url As String = String.Empty
RequestToken = token
url = authorizer.BuildAuthorizeUrl("http://twitter.com/oauth/authorize", token)
Me.Auth_webBrowser.Navigate(New Uri(url))
Me.Auth_webBrowser.Visibility = Windows.Visibility.Visible
End Sub, _
Sub(ex) MessageBox.Show(ReadWebException(ex)))
Windows Phone Emulatorで実行してみましょう。
[GetRequestToken/OpenAuthorizeUri]ボタンをクリックするとGetRequestTokenが実行されてTwitterのOAuth画面が表示されます。
TwitterのOAuth画面の中でTwitterIDとパスワードを入力して[Allow]ボタンをクリックします。
PINコードがブラウザに表示されるので、そのPINコードを使って次のサンプルソースコードを実行します。
var authorizer = new OAuthAuthorizer(ConsumerKey, ConsumerSecret);
authorizer.GetAccessToken("http://twitter.com/oauth/access_token", requestToken, pincode)
.ObserveOnDispatcher()
.Subscribe(res =>
{
// response has Token and extra data(twitter is user_id and screen_name)
UserIdTextBlock.Text = res.ExtraData["user_id"].First();
ScreenNameTextBlock.Text = res.ExtraData["screen_name"].First();
accessToken = res.Token; // AccessToken
});
このC#のサンプルコードをVisual Basicに書き換えてみましょう。
Dim authorizer As New OAuthAuthorizer(ConsumerKey, ConsumerSecret)
authorizer.GetAccessToken("http://twitter.com/oauth/access_token", RequestToken, pinCode) _
.ObserveOnDispatcher() _
.Subscribe(Sub(res)
Me.AuthorizedTextBlock.Text = "Authorized"
Me.UserIdTextBlock.Text = res.ExtraData("user_id").First
Me.ScreenNameTextBlock.Text = res.ExtraData("screen_name").First
Me.AccessToken = res.Token
End Sub, _
Sub(ex) MessageBox.Show(ReadWebException(ex)))
このコードを実行すれば次のように「Connection Allowed」と表示されてOAuthが完了したことがわかると思います。
RxをVisual Basicで利用する場合、C#の「=>」であらわされる部分をFunctionとSubのうちから適切なものを選択するという点が注意点となります。