はじめに
前回は,Facebookの開発者サイトへのアプリケーション登録,アカウント認証,アクセストークンの取得を実装しました。
今回はアクセストークンを使って,友達リストの取得やステータスとリンクの共通を実装してみましょう。前回のおさらいを兼ねて,アクセストークンを分離ストレージに保存して,いつでも使いまわせるようにしましょう。
アクセストークン要求を行うExchangeCodeForAccessTokenAsyncメソッドを非同期にて実行し,サーバーからのレスポンスをoauthClient_ExchangeCodeForAccessTokenCompletedメソッドで受け取りました。このメソッドの中ではアクセストークンをTextBlockに表示させる処理を実装していました。
// アクセストークンを取得
void oauthClient_ExchangeCodeForAccessTokenCompleted(object sender, FacebookApiEventArgs e) {
var result = e.GetResultData() as IDictionary<string, object>;
if (result == null) return;
// アクセストークンを取り出す
accessToken = (string)result["access_token"];
Dispatcher.BeginInvoke(() => {
// TextBlockにアクセストークンの値を表示
textAccessToken.Text = accessToken;
});
}
分離ストレージにアクセストークンを保存します。IsolatedStorageSettingsクラスを利用しますので,ファイルの先頭にSystem.IO.IsolatedStorageのusingディレクティブを定義します。
using System.IO.IsolatedStorage;
TextBlockへの表示と同時に保存処理を行いたいので,以下のコードの通り実装を行います。分離ストレージについては連載第29回をご覧ください。
Dispatcher.BeginInvoke(() => {
// TextBlockにアクセストークンの値を表示
textAccessToken.Text = accessToken;
// アクセストークンを分離ストレージへ保存
var settings = IsolatedStorageSettings.ApplicationSettings;
settings["access_token"] = accessToken;
settings.Save();
});
これでアカウント認証後にアクセストークンが保存できました。分離ストレージからアクセストークンを取り出す場合には下記のメソッドを使用するようにしましょう。
string GetAccessToken() {
string token = null; // アクセストークンを格納する
// 分離ストレージからアクセストークンを取得する
var settings = IsolatedStorageSettings.ApplicationSettings;
if (settings.Contains("access_token")) {
token = (string)settings["access_token"];
}
return token;
}
友達リストを取得する
友達リストの取得タイミングですが,ここではテスト的に友達リストを表示するページを作りましょう。ページの名前は「FriendsPage.xaml」として,ListBoxコントロールを配置します。
まずは,MainPageからアプリケーションボタンをクリックするとページ遷移するようにします。
private void btnFriends_Click(object sender, System.EventArgs e) {
NavigationService.Navigate(new Uri("/FriendsPage.xaml", UriKind.Relative));
}
ページ遷移後に呼ばれるOnNavigatedToメソッドにて,FacebookClientインスタンスを生成して,友達リストの取得要求を非同期で実行します。
protected override void OnNavigatedTo(NavigationEventArgs e) {
// アクセストークンを取得する
var accessToken = GetAccessToken();
// FacebookClientインスタンスを生成
var client = new FacebookClient(accessToken);
client.GetCompleted += new EventHandler<FacebookApiEventArgs>(client_GetCompleted);
// ユーザーの友達リストを取得する
client.GetAsync("me/friends");
}
サーバーからレスポンスが返ってくるとclient_GetCompletedメソッドが呼び出されます。GetResultDataメソッドで取得できるレスポンスデータがobject型なので,データを扱いやすいようにDictionary型にキャストします。
友達リストは下記のようにJSON形式で返ってきます。配列の形で友達の名前と(Facebookの)ユーザーIDを取得することができます。
{
"data": [
{
"name": "Taro Osaka",
"id": "529XXXXXXX"
},
{
"name": "Jiro Tokyo",
"id": "545XXXXXXXX"
},
{
"name": "Hanako Hakata",
"id": "5847XXXXXX"
},
~省略~
レスポンスからFacebook.JsonArray型で友達リストを取得します。友達リストから友達の名前を取り出してリストへ表示しています。
void client_GetCompleted(object sender, FacebookApiEventArgs e) {
// エラーが発生した場合はメッセージボックスを表示する
if (e.Error != null) {
MessageBox.Show(e.Error.Message);
return;
}
// データを扱いやすいようにDictionary型にキャストする
var result = e.GetResultData() as IDictionary<string, object>;
if (result == null) return;
// レスポンスから友達リストを取得する
var friends = result["data"] as Facebook.JsonArray;
// 友達リストから友達の名前を取得
var friendNames = friends.Select(item => {
var user = item as Facebook.JsonObject;
return user["name"];
});
Dispatcher.BeginInvoke(() => {
// 友達の名前をリストに表示する
listBox.ItemsSource = friendNames;
});
}
上記のコードを実行してみました。友達リストがListBoxに表示されています。

