酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Facebookへ投稿をしよう!〜基本データの取得とステータスの投稿〜

Windows Phone Advent Calendar "ひとり" 2011」第9日目です。

9日目ギリギリや……(23:30)

昨日は、Facebook C# SDKの導入と認証を行いました。今日は基本データの取得とステータスの投稿を行います。

基本データの取得

基本データ……つまりログインした自分自身のアカウント情報を取得します。取得出来るデータはアカウントIDや名前、性別です。

    // 基本データの取得
    FacebookClient client = new FacebookClient(accessToken);
    client.GetCompleted += client_GetCompleted;
    client.GetAsync("me");

非同期で基本データの取得完了イベントを受信します。e.GetResultDataメソッドで取得したオブジェクトをIDictionary型にキャストします。それぞれのパラメータでデータが取得できます。

void client_GetCompleted(object sender, FacebookApiEventArgs e) {
    var data = e.GetResultData() as IDictionary<string, object>;

    // ログインしたアカウントのIDを取得
    var id = (string)data["id"];

    // ログインしたアカウントの名前を取得
    var name = (string)data["name"];

    // 性別を取得
    var gender = (string)data["gender"];

    // タイムゾーンを取得(日本は+9なので9が返ってくる)
    var timezone = (long)data["timezone"];

    // 言語を取得(日本はja_JPが返ってくる)
    var locale = (string)data["locale"];

    // ログインしたアカウントのprofileページを取得
    var link = (string)data["locale"];

    Dispatcher.BeginInvoke(() => {
        textName.Text = name;
    });
}

アカウント名にモザイクを入れており、分かりにくいですが基本データの取得が出来ました。

ステータスの投稿

ウォールにステータスを投稿します。FacebookClient型のインスタンスを生成して、AccessTokenプロパティに取得したアクセストークンを設定します。

Dictionary型のディクショナリーに、messageのキーにstring型でステータスを設定して、FacebookClient.PostAsyncメソッドで送信します。

// ステータスを共有する
private void btnIconShare_Click(object sender, EventArgs e) {
    var client = new FacebookClient() { AccessToken = accessToken };
    var param = new Dictionary<string, object>();

    // ステータス
    param["message"] = "テスト投稿です。";
    
    // Facebookでリンクを共有する
    client.PostCompleted += client_PostCompleted;
    client.PostAsync("me/feed", param);
}

void client_PostCompleted(object sender, FacebookApiEventArgs e) {

    if (e.Error != null) {
        // なんらかのエラー発生時
        Dispatcher.BeginInvoke(() => {
            MessageBox.Show(e.Error.Message);
        });
        return;
    }

    var data = e.GetResultData() as IDictionary<string, object>;
    Dispatcher.BeginInvoke(() => {
        MessageBox.Show("success post status.");
    });
}

エラーが発生しなければe.Errorがnullで返ってきますので、成功のメッセージボックスを表示させています。

エラー(The user hasn't authorized the application to perform this action.)発生時

ステータスの投稿時に以下のエラーが発生してしまいました。

(OAuthException) (#200) The user hasn't authorized the application to perform this action.

どうやら指定したアクション(自分のフィードへの投稿)を行うための権限が足りないようです。前回のログイン時に権限が足りていなかったようでしたので、status_updateを追加して再ログインします。

    //prams["scope"] = "user_about_me,user_photos,offline_access";
    prams["scope"] = "user_about_me,user_photos,offline_access,status_update";

これでステータスの投稿が出来ると思います。