slowjet

is a part of a carburetor

Facebook の Graph API (JS SDK) から取得する自分の名前を日本語にする

FB.api('/me')を叩いて取れるデータで名前があるのだけど(name, first_name, last_name)、デフォルト表記になっていて、デフォルトを英語で入れているユーザーのデータは常に英語になってしまう。せめて名前だけでも日本語にしたい。。

どうやらこういうことらしい

ところが最近の挙動を調べてみると、

  • 「原語表記」が登録されている場合、Graph APIは「原語表記」を優先して返す
  • Graph APIは、API利用者のロケールに関係なく、問答無用で原語表記を返す
  • FQLを使ってuserテーブルを叩くと、デフォルト表記が返ってくる
  • FQLを使ってprofileテーブルを叩くと、API利用者のロケールに応じて、デフォルト表記または原語表記が返ってくる

という具合になっているようです。

via - FacebookのAPIの仕様変更 – ユーザ名は、どの言語で取得できるのか -

FQL使うか、直接

https://graph.facebook.com/[user_id]

を叩くか、まあそういうことらしい。Graph API は XHR2 だとそのまま取得できるので、限られた環境でよければ↓みたいなコードでOK。

※ OSの言語が英語になっているとGraph APIを直接叩いても、結局英語になるので注意

(function() { 
    var dfd = new Deferred();
    FB.api('/me', function(res) {
        get('https://graph.facebook.com/' + id)
        .error(function() {
            // ここでエラーでたらあきらめる
            dfd.call(res);
        })
        .next(function(user_data) {
            // '/me' の res を user_data で extend する
            dfd.call(_.extend(res, JSON.parse(user_data)));
        });
    });
    return dfd;
}())
.next(function(res) {
    console.log(res);
    // user_data で extend された res を受け取る
});

// GET func
function get(url) {
    var xhr = false,
        dfd = new Deferred();
    if ( typeof window.ActiveXObject != 'undefined' ) {
        try {
            xhr = new window.ActiveXObject('Microsoft.XMLHTTP');
        } catch (e) {
            xhr = false;
        }
    }
    if ( !xhr && typeof window.XMLHttpRequest !== 'undefined' ) {
        xhr = new window.XMLHttpRequest();
    }

    xhr.open('GET', url, 'True');
    xhr.onreadystatechange = function() {
        if ( xhr.status !== 200 ) {
            dfd.fail();
            return;
        }
        if ( xhr.readyState !== 4 ) {
            return;
        }
        dfd.call(xhr.responseText);
    }
    xhr.send(null);

    return dfd;
}

Underscore.js と JSDeferred 使ってます