Facebook の Graph API (JS SDK) から取得する自分の名前を日本語にする
FB.api('/me')
を叩いて取れるデータで名前があるのだけど(name, first_name, last_name)、デフォルト表記になっていて、デフォルトを英語で入れているユーザーのデータは常に英語になってしまう。せめて名前だけでも日本語にしたい。。
どうやらこういうことらしい
ところが最近の挙動を調べてみると、
- 「原語表記」が登録されている場合、Graph APIは「原語表記」を優先して返す
- Graph APIは、API利用者のロケールに関係なく、問答無用で原語表記を返す
- FQLを使ってuserテーブルを叩くと、デフォルト表記が返ってくる
- FQLを使ってprofileテーブルを叩くと、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 使ってます