2010年12月28日

計算 Facebook 互動次數的方式

最近看到幾個跟Facebook結合的活動,發現似乎抓到的朋友,都是在塗鴉牆上跟自己互動較多的朋友,就找了一下是不是有相關的API可以使用;不過最後發現並沒有這樣的API,其實這個數字是計算出來的,相關的規範可以參考一下;由前面提供的 相關規範  ,我們會了解到我們所計算出來的數據,並不會完全正確,因為是抓取一段範圍內的資料來進行統計,所以會有些許失真的情況,並不會達到百分之百的正確。那麼接下來就介紹一下如何計算。


這邊我的做法是去計算在我的塗鴉牆上,有回應的人,以及有哪些人按讚;其中一則stream訊息只能點一次贊,所以計算一次;而回應stream可能會有一次以上的情況,所以我是記算有幾次回應就計幾次。

前置的作業,也就是初始化FB的部分,就不額外講解了,如有需要請參考 使用 Javascript Facebook SDK with Graphic API

這邊要記得要求相關的 Permission:read_stream 這樣才有辦法獲得 User 塗鴉牆上的資料,再登入完成之後,我們就要開始讀取塗鴉牆上的文章:
在這邊我使用fql的方式來取得相關的資料
//宣告相關的變數
var fuids_data = {}; // 記錄uid出現的次數
var tmp_ary = []; // 用來排序 uid 的array
var params; 
var comments_point;
var tmp_id;
var tmp_name;
var fuids = ""; // 將朋友的uid串成字串 在最後取得相關資料
// 取得塗鴉牆上來源/目標為user的訊息comments(回覆)/likes(讚)建議限定筆數不然會抓不到資料 目前還沒抓到上限
var query = FB.Data.query('SELECT comments,likes FROM stream WHERE target_id="{0}" or source_id="{0}" limit 0,50', [uid );
query.wait(function(rows) {  
 for(params in rows )
 {
  //取得有回復的 朋友ID
  for(comments_point = 0 ; comments_point < rows[params].comments.comment_list.length ; comments_point++ )
  {
   tmp_id = rows[params].comments.comment_list[comments_point].fromid;
   if(uid == tmp_id) continue;
   if(fuids_data[tmp_id] == undefined)
   {
    fuids_data[tmp_id] = {
     uid:tmp_id,
     name:null,
     pic:null,
     counts:1
    };
    tmp_ary.push( fuids_data[tmp_id] );
   }else fuids_data[tmp_id].counts++;
  }
  for(comments_point = 0 ; comments_point < rows[params].likes.friends.length ; comments_point++ )
  {
   //取得朋友中按讚的ID
   tmp_id = rows[params].likes.friends[comments_point];
   if(uid == tmp_id) continue;
   if(fuids_data[tmp_id] == undefined)
   {
    fuids_data[tmp_id] = {
     uid:tmp_id,
     name:null,
     pic:null,
     counts:1
    };
    tmp_ary.push( fuids_data[tmp_id] );
   }else fuids_data[tmp_id].counts++;
  }
  }
  for(params in fuids_data ) html_code += "["+params+"] counts: "+fuids_data[params].counts+"
";
  var tmp_obj;
  // 因為我找不到直接排序的方式 所以用程式排序
  for(var i = 0 ; i < tmp_ary.length-1 ; i++ )
  {
   for(var j=i+1 ; j < tmp_ary.length ; j++)
   {
    if(tmp_ary[i].counts > tmp_ary[j].counts)
    {
     tmp_obj = tmp_ary[i];
     tmp_ary[i] = tmp_ary[j];
     tmp_ary[j] = tmp_obj;
    }
   }
  }
  tmp_ary = tmp_ary.reverse();
到這邊,已將將最新的一百則stream資訊取出,並且完成了解析的動作,接下來只要再將朋友的資料抓取出來就好。
//將所有的UID串成字串 再取得朋友們的資料
for(i=0 ; i < tmp_ary.length ; i++)
{
 fuids = i != tmp_ary.length-1 ? fuids+tmp_ary[i].uid+",":fuids+tmp_ary[i].uid;
}
getUserInfo(fuids);
function getUserInfo(uids)
{
 //取得user的相關資料
 var query = FB.Data.query('select uid,name,pic  from user where uid in ({0})', uids);
    query.wait(function(rows) {
  for(var i=0 ; i < rows.length ; i++)
  {
   fuids_data[rows[i].uid].name = rows[i].name;
   fuids_data[rows[i].uid].pic  = rows[i].pic;
  }
 });
}
這樣就大功告成了。希望這篇也可以帶給大家一些幫助囉~
相關連結:Demo , Source
參考網址:FQL-stream , FQL-comments , FB.Data.query , 相關的規範

沒有留言:

張貼留言