Windows Phoneアプリケーション開発入門

第41回Facebook C# SDKを使ってみよう!(2)

はじめに

前回は、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に表示されています。

画像

ステータスを投稿する、リンクを共有する

次にFacebook C# SDKを使用して、Facebookのウォールにステータスを投稿、またはリンクの共有をおこなってみましょう。

まず、ウォールにステータスを投稿するには、OAuthの認証処理で使用したパーミッションに「status_update」を追加する必要があります。

    var oauthClient = new FacebookOAuthClient { AppId = ApplicationID };
    var prams = new Dictionary<string, object>();
    prams["response_type"] = "code";
    prams["scope"] = "user_about_me,user_photos,offline_access";

prams["scope"]で設定しているパーミッションに「status_update」を追加します。

    var oauthClient = new FacebookOAuthClient { AppId = ApplicationID };
    var prams = new Dictionary<string, object>();
    prams["response_type"] = "code";
    prams["scope"] = "user_about_me,user_photos,offline_access,status_update";

ステータスを投稿する

FacebookClientインスタンスを生成して、アクセストークンを設定します。友達リストの取得と異なり、今回は投稿ですのでGetAsyncメソッドではなくPostAsyncメソッドを使用します。PostAsyncメソッドのパラメータに投稿したい情報を格納します。

具体的にはDictionary<string, object>型のディクショナリーを作成し、キーと値を設定します。ステータスだけ投稿できればよいので、以下のように「message」のキーに「テスト投稿です。」と値を設定します。

            // パラメータを設定
            var param = new Dictionary<string, object>();
            param["message"] = "テスト投稿です。";

パラメータの設定が終われば、FacebookClient.PostAsyncメソッドで送信します。

        // ステータスを共有する
        private void btnShare_Click(object sender, EventArgs e) {

            // アクセストークンを取得する
            var accessToken = GetAccessToken();
            // FacebookClientインスタンスを生成
            var client = new FacebookClient(accessToken);

            // パラメータを設定
            var param = new Dictionary<string, object>();
            param["message"] = "テスト投稿です。";

            // Facebookへステータスを投稿する
            client.PostCompleted += client_PostCompleted;
            client.PostAsync("me/feed", param);
        }

サーバーからレスポンスが返ってくるとclient_PostCompletedメソッドが呼び出されます。GetResultDataメソッドで取得できるレスポンスデータがobject型なので、データを扱いやすいようにDictionary型にキャストします。

        void client_PostCompleted(object sender, FacebookApiEventArgs e) {
            // エラーが発生した場合はメッセージボックスを表示する
            if (e.Error != null) {
                Dispatcher.BeginInvoke(() => {
                    MessageBox.Show(e.Error.Message);
                });
                return;
            }

            // データを扱いやすいようにDictionary型にキャストする
            var result = e.GetResultData() as IDictionary<string, object>;
            if (result == null) return;
            // 投稿後のステータスIDを取得する
            var statusId = (string)result["id"];

            Dispatcher.BeginInvoke(() => {
                MessageBox.Show("success post status.");
            });
        }

成功のメッセージボックスが表示された後に、自分のウォールを確認するときちんと投稿できているのが確認できます。

画像

リンクを共有する

ステータスの投稿で使用した「message」以外にも、以下のようなパラメータが存在しています。OS標準の投稿APIのよりも細かな設定を行うことができます。

画像

上のスクリーンショットの通り、ステータス項目をすべて埋めて投稿するのに以下のように指定しました。

        // ステータスを共有する
        private void btnShare_Click(object sender, EventArgs e) {

            // アクセストークンを取得する
            var accessToken = GetAccessToken();
            // FacebookClientインスタンスを生成
            var client = new FacebookClient(accessToken);

            // パラメータを設定
            var param = new Dictionary<string, object>();
            // ステータス
            param["message"] = "testtest";
            // リンクのURL
            param["link"] = "http://ch3cooh.jp/";
            // リンクに関する画像のURL
            param["picture"] = "http://ch3cooh.jp/wp-content/uploads/2010/12/topimage1.png";
            // リンクのタイトル
            param["name"] = "Article Title";
            // リンクの概要
            param["caption"] = "Caption for the link";
            //  リンクの詳細
            param["description"] = "Longer description of the link";

            // Facebookへステータスを投稿する
            client.PostCompleted += client_PostCompleted;
            client.PostAsync("me/feed", param);
        }

投稿が完了すると、先ほどと同様にclient_PostCompletedメソッドが実行されます。

さいごに

今回は、Facebookに登録されている友達リストを取得し、ウォールにステータスの投稿とリンクの共有処理を実装してみました。

単にステータスを投稿するだけであったり、リンクを共有したいだけであれば、連載第33回でご紹介したShareStatusTaskやShareLinkTaskで充分な場合は多々あります。

Facebook C# SDKを利用してステータスの投稿機能を実装したほうがよいケースとしては、例えばアプリケーション内で写真をアルバムにアップロードして、そのままウォールへステータスを投稿したい場合などでしょう。アプリケーションでFacebookへの認証を行っていたとしても、OS側でFacebookの認証が済んでいない場合があります。ShareStatusTaskの実行後、更に認証処理が必要となってしまい、ユーザーに不便な思いをさせてしまいます。使いやすいアプリケーションを目指して、取捨選択して頂ければと思います。

次回も引き続き、Facebook C# SDKを利用したTipsをご紹介したいと思います。今回は以上で終わりです。ありがとうございました。

おすすめ記事

記事・ニュース一覧