海の響きを懐かしむ

観たもの聴いたもの読んだものの記録と、日記など

Facebookを使った家族関係の調査[その2]

前回の続きで、今度はFQLを使って家族関係と恋愛ステータスを取得する。

<reference>
JavaScriptでお手軽にFacebookのアプリを作る - TechTalkManiacs

<index.html>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
	<head> 
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
		<title>ししゃも</title> 
	</head> 
 
	<body> 
		<div id="fb-root"></div> 
		<ul id="myFriends"></ul> 
		<h3>ぼんじゅーる</h3> 
		<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script> 
		<script language = "Javascript"> 
			var fName = new String();
			window.fbAsyncInit = function(){
				FB.init({
					appId: 'アプリID',
					status: true,
					cookie: true,
					xfbml: true
				});
 
				FB.getLoginStatus(function(response){
					if(response.perms != null){
						var perms_a = eval("(" + response.perms + ")"); // evalでjs文実行
						var perms = {};
						for (var i = 0, j = perms_a.extended.length; i < j; i++) {
							perms[perms_a.extended[i]] = true;
						}
						showFamilyInfo();
						showPartnerInfo();
					}else{
						login();
					}
				});
			}
 
			function login(){
				FB.login(function(response){
					//ログイン処理
					if(response.session){
							showFamilyInfo();
							showPartnerInfo();
					}else{
						console.log("login failed");
					}
				},
				// パーミッションの指定
				{perms:'user_groups, user_relationships, user_relationship_details, user_status, friends_status, friends_relationships, friends_relationship_details, read_friendlists'}
				);
			}
 
			// 家族に関する情報の取得(family query)
			function showFamilyInfo(){
				var query = FB.Data.query(
				'SELECT uid, name, profile_id, relationship FROM family WHERE profile_id IN (SELECT uid2 FROM friend WHERE uid1 = me())');
				query.wait(function(response) {
					for (var i = 0; i < response.length; i++){
					 console.log(response[i].uid,
					  		  response[i].name,
							  response[i].profile_id,
							  response[i].relationship);
					}
				});
			}
 
			// 恋愛ステータスに関する情報の取得(relationship_status query)
			function showPartnerInfo(){
				var query = FB.Data.query(
				'SELECT sex, significant_other_id,uid,  name, relationship_status, family  FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())');
				query.wait(function(response) {
					for (var i = 0; i < response.length; i++){
						console.log(response[i].uid,
								 response[i].name,
								 response[i].sex,
								 response[i].relationship_status,
								 response[i].significant_other_id);
					}
				});
			}
 		</script> 
	</body> 
</html> 

<実行結果>
まず最初に、ログインした後、パーミッションを付与する。この点については前回書いた通り。次にshowFamilyInfo()では自分のfriends一覧を読み込み、その中で家族を登録しているユーザと、その家族のID、関係(親、娘、息子、兄弟、姉妹、従姉妹、など)を表示する。showPartnerInfo()では、自分のfriendsのIDと名前、恋愛ステータスが更新されている場合はその状態(Single, married, in a relationship)、結婚相手や付き合っている人がいる場合はその人のIDが表示される。

どのクエリがどのパーミッションに対応しているかというがどこにも載っていなくて、片っ端からパーミッションを入れて試したりした(だいたいドキュメント読めばわかるんだけども)今のところ、

userテーブルのfamilyクエリ or familyテーブルの各クエリ
→user_relationships, friends_relationships

userテーブルのrelationship_status、significant_other_idクエリ
→user_relationship_details, friends_relationship_details

でそれぞれ取得できる。家族については、userテーブルでも取得できるけど、独立してfamilyテーブルというのも存在する。こちらのほうが、それぞれのパラメタ(IDや名前、関係)を直接指定できるので使いやすい。


<はまったところ>
上記のように、Facebookでは「家族」と「夫婦」は別物として扱っている。すなわち、夫婦でFacebookをやっていてお互い登録している場合は、familyではなくrelationship_statusでクエリを取得する。このため、いくら奥さんを登録している人を対象にfamilyクエリを投げたとしてもobjectは未定義になってしまう。

また、FQLをJavascriptで扱うには、FB.api関数を使う方法と、FB.Data.query関数を使う方法の2種類がある。このうちクエリ内に変数を埋め込む、変数バインディングを使うには後者を用いる。

<これからやること>
とりあえず、自分のfriendsのステータスを取得するという最低限のところは達成できた。今後は、まずデータをJSONか何かで保存したい。次に、何らかの方法でビジュアライズしたい。そしてそれがうまくいったら、自分が属するFacebookグループの人々にも試してみて、より大規模なデータを取ってみたい。