facebookIdを元に、ユーザの「好きな音楽」「自己紹介」をJavaScript上で取得したいです。
前提として、「アプリの許可」時に「'user_about_me,publish_stream,email,offline_access'」の4つのパーミッションで許可を頂いてます。
その上で、次のtemp.jsのgetProfileメソッドを呼び出したところnameは取得できるのですが、music、about_meが取得できません。
■temp.js
function getProfile(facebookId)
{
var query = FB.Data.query('SELECT name, music, about_me, uid FROM user WHERE uid =' + facebookId);
query.wait(
function(rows) {
var user = rows[0];
//nameには山田太郎が入っている。
var name = user.name;
//musicにはnullが入っている。
var music = user.music;
//about_meにはnullが入っている。
var about_me = user.about_me;
}
);
}
music、about_meが何故取得できないのか、また、どうすれば取得できるのか教えていただきたいです。
よろしくお願いします。
パーミッションに問題があるようです。
'user_about_me,user_about_me,user_likes,friends_likes,publish_stream,email,offline_access'
でうまくいきます。
// ここで実際に確認してみました
// https://developers.facebook.com/docs/reference/rest/fql.query/
友達の about_me を取りたい場合は、friends_about_meが必要です。ユーザ自身の music を取るなら user_likes を、友達の music を取るならfriends_likes が必要です。
user_likes, friends_likesという字面を見ると、なんとなく「『いいね!』ボタンを押した対象を取るためのパーミッション」っぽいので、「どうしてこれでmusicとかgamesとかが取れるんだよ!?」とツッコみたくなるんですが、実は、プロフィールに並んでいる好きなモノ (音楽とかゲームとか本とか) は、実はアーティストやゲームなどのFacebookページへの参照になっているので、こんなパーミッション名になってるようです(ちなみに、Graph APIでユーザプロフィールを取ってみると、アーティストやゲームの FacebookページのIDが一緒に取れます)。ちょっとわかりづらいですよね:-(
// 「Facebookアプリケーション開発ガイド」という本の著者です。このあたりはちょっと詳しいです。
パーミッションに問題があるようです。
'user_about_me,user_about_me,user_likes,friends_likes,publish_stream,email,offline_access'
でうまくいきます。
// ここで実際に確認してみました
// https://developers.facebook.com/docs/reference/rest/fql.query/
友達の about_me を取りたい場合は、friends_about_meが必要です。ユーザ自身の music を取るなら user_likes を、友達の music を取るならfriends_likes が必要です。
user_likes, friends_likesという字面を見ると、なんとなく「『いいね!』ボタンを押した対象を取るためのパーミッション」っぽいので、「どうしてこれでmusicとかgamesとかが取れるんだよ!?」とツッコみたくなるんですが、実は、プロフィールに並んでいる好きなモノ (音楽とかゲームとか本とか) は、実はアーティストやゲームなどのFacebookページへの参照になっているので、こんなパーミッション名になってるようです(ちなみに、Graph APIでユーザプロフィールを取ってみると、アーティストやゲームの FacebookページのIDが一緒に取れます)。ちょっとわかりづらいですよね:-(
// 「Facebookアプリケーション開発ガイド」という本の著者です。このあたりはちょっと詳しいです。
本の作者さんなのですね。
ご回答ありがとうございます。
「アプリの許可時」のパーミッションを変更したところ、
PHP-SDKにて、以下のようにしたところ、「好きな音楽」「自己紹介」ともに取得することができました。
$this->facebook->api(array('method' => 'fql.query', 'query' => 'SELECT name, email, music, about_me FROM user where uid = me()'));
しかし、JavaScript-SDKにて以下のようにしても「好きな音楽」「自己紹介」ともに取得できませんでした。
FB.Data.query('SELECT name, music, about_me, uid FROM user WHERE uid =' + facebookId);
JavaScriptの方では取得は不可能なのでしょうか?
ソースを全部拝見しないとなんともいえないのですが、「PHPでは取れるのにJavaScriptで取れない」となると、パーミッションの部分はクリアできているようですね。ご質問の本文にある getProfile 関数の内容には、特に問題はありません。FB.Data.queryの使い方も、FQLの内容も、問題はなさそうです。
……となると、getProfile 関数を呼び出す前の段階に原因がありそうです。「FB.getLoginStatus でセッション情報が返ってきてからFQLを叩く」という流れのどこかで失敗している可能性が大です。
JavaScript Test Console
http://developers.facebook.com/tools/console/
で、テキストボックスの下の "Examples" をクリック → Examples → account-info をクリックすると、ユーザ認証からFQLの利用までの一連の流れを含んだサンプルコードが見られますので、参考にしてみてください。
本の作者さんなのですね。
2011/11/19 18:10:03ご回答ありがとうございます。
「アプリの許可時」のパーミッションを変更したところ、
PHP-SDKにて、以下のようにしたところ、「好きな音楽」「自己紹介」ともに取得することができました。
$this->facebook->api(array('method' => 'fql.query', 'query' => 'SELECT name, email, music, about_me FROM user where uid = me()'));
しかし、JavaScript-SDKにて以下のようにしても「好きな音楽」「自己紹介」ともに取得できませんでした。
FB.Data.query('SELECT name, music, about_me, uid FROM user WHERE uid =' + facebookId);
JavaScriptの方では取得は不可能なのでしょうか?
ソースを全部拝見しないとなんともいえないのですが、「PHPでは取れるのにJavaScriptで取れない」となると、パーミッションの部分はクリアできているようですね。ご質問の本文にある getProfile 関数の内容には、特に問題はありません。FB.Data.queryの使い方も、FQLの内容も、問題はなさそうです。
2011/11/20 19:50:33……となると、getProfile 関数を呼び出す前の段階に原因がありそうです。「FB.getLoginStatus でセッション情報が返ってきてからFQLを叩く」という流れのどこかで失敗している可能性が大です。
JavaScript Test Console
http://developers.facebook.com/tools/console/
で、テキストボックスの下の "Examples" をクリック → Examples → account-info をクリックすると、ユーザ認証からFQLの利用までの一連の流れを含んだサンプルコードが見られますので、参考にしてみてください。