2011-03-29 156 views
8

我正在使用Facebook圖形API,並且我想知道是否有一次在一次調用中獲取所有用戶及其當前狀態的列表?Facebook圖形API獲取所有用戶及其狀態

我基本上想要得到與https://graph.facebook.com/me/friends相同的結果,但每個對象都包含當前狀態。

感謝您的幫助!

編輯:

這是一些澄清。如果https://graph.facebook.com/me/friends?access_token=...讓我這樣的:(AKA我所有的朋友列表)

{ 
    "data": [ 
    { 
     "name": "Foo", 
     "id": "1" 
    }, 
    { 
     "name": "Bar", 
     "id": "2" 
    }, 
    { 
     "name": "Foo Bar", 
     "id": "3" 
    }, 
    { 
     "name": "Bar Foo", 
     "id": "4" 
    } 
    ] 
} 

什麼網址或FQL會讓我這樣的:(AKA的我所有的朋友列表和它們的狀態)

{ 
    "data": [ 
    { 
     "name": "Foo", 
     "id": "1" 
     "status": "This is my current status!" 
    }, 
    { 
     "name": "Bar", 
     "id": "2" 
     "status": "This is my current status!" 
    }, 
    { 
     "name": "Foo Bar", 
     "id": "3" 
     "status": "This is my current status!" 
    }, 
    { 
     "name": "Bar Foo", 
     "id": "4" 
     "status": "This is my current status!" 
    } 
    ] 
} 

我只想打一個電話,因爲與我不同,大多數人都有100多個朋友,我不想爲了獲得狀態而撥打100多個電話。

+0

2500+的意見,並沒有+ 1的?愛在哪裏!? :) – 2012-01-05 03:13:47

回答

8

雖然新Batch API應該做你所要求的,我無法設法使其正常工作。看來它仍然是越野車。

我們與fql.multiquery實現這一點,這裏有一個簡單的例子:

<?php 
$app_id = "APP_ID"; 
$app_secret = "APP_SECRET"; 
$my_url = "REDIRECT_URL"; 

$code = $_REQUEST["code"]; 

if(empty($code)) { 
$dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
    . $app_id . "&redirect_uri=" . urlencode($my_url); 

echo("<script> top.location.href='" . $dialog_url 
    . "'</script>"); 
} 

$token_url = "https://graph.facebook.com/oauth/access_token?client_id=" 
. $app_id . "&redirect_uri=" . urlencode($my_url) 
. "&client_secret=" . $app_secret 
. "&code=" . $code; 

$access_token = file_get_contents($token_url); 

$queries = '{"query1":"SELECT uid,name FROM user WHERE uid IN(SELECT uid2 FROM friend WHERE uid1=me())","query2":"SELECT uid,message FROM status WHERE uid IN (SELECT uid FROM #query1)"}'; 
$multiquery = "https://api.facebook.com/method/fql.multiquery?queries=" . urlencode($queries) . "&format=json&" . $access_token; 
$res = json_decode(file_get_contents($multiquery), TRUE); 

$final = array(); 
foreach($res[1]['fql_result_set'] as $i=>$message_arr) { 
    foreach($res[0]['fql_result_set'] as $j=>$friend) { 
     if($message_arr['uid'] == $friend['uid']) { 
      $friend['message'] = $message_arr['message']; 
      $final[] = $friend; 
      break; 
     } 
    } 
} 
print_r($final); 
?> 

在這裏我們得到了第一個查詢的用戶標識和名稱,並從第二個獲得狀態信息。
現在這會在第一個查詢或第二個查詢中返回更少的結果!這是因爲:

  • 有朋友可能還沒有發佈針對last 30 days狀態消息,這樣就不會出現在第二個查詢(第二較少結果集)。
  • 一位朋友可能在過去30天內發佈了多條狀態消息(它應該應該全部返回 - 最多50?!!)我不確定,但如果是這種情況,那麼第二個會/應該返回比第一個更多的結果。所以我只得到一個消息(請注意break)。
+0

給你的先生的帽子尖。非常好的回答:) – 2011-04-04 12:51:43

+0

@ifaour - 我正在拼湊一些與您的答案非常相似的東西。但請考慮這種情況。假設我有100個朋友,每個朋友昨天都發布了狀態消息。但是你的query2仍然會返回最多50個最新的帖子吧?所以它不能在一個fql調用中完成,因爲joe想要或者我會走錯路。 – Gublooo 2011-04-04 13:14:58

+0

@Gublooo:這就是我最後兩點所指的意思。結果可能不如預期!但我不確定,因爲我的100多個朋友結果只返回29狀態消息!我認爲如果批處理API按預期工作,它應該可以解決這個問題。 – ifaour 2011-04-04 15:28:19

3

試試下面的FQL:

Select uid, message from status where uid in (select uid2 from friends where uid1 = [active user id]) 

只要確保限制在一個特定的日期,因爲這將在默認情況下返回最後50個更新/或活動的最後30天。

+0

從Facebook有關狀態表的文檔:http://developers.facebook.com/docs/reference/fql/status/供您參考。 – 2011-04-04 05:03:28

+0

非常感謝,但這只是狀態。有沒有辦法獲得ID和名字呢?問題是使用FQL的多表事物,我不確定如何繞過它。 – 2011-04-04 06:35:37

+0

你可以得到身份證。查看編輯過的帖子。至於名稱,沒有辦法在FQL中連接表,但是您可以使用多個查詢並自己構建正確的json對象。這就是Facebook的工作方式。 – 2011-04-04 06:40:50

0

嗨,你只需要採取的user_status or friend_status擴展權限,這和對我的任何調用對象將抓住用戶的當前狀態...

 
json_decode(file_get_contents('https://graph.facebook.com/me/friends?access_token='.$cookie['access_token'])); 
+1

不是我正在尋找的東西。我通過一些澄清更新了我的帖子 – 2011-04-04 06:20:58

+0

好吧,現在查看我編輯的答案。但是,如上所述,採取權威的許可 – 2011-04-04 08:12:33

0

感謝@mgilson他的回答,此時可合併到一個FQL聲明是這樣的:

SELECT STATUS_ID,UID,寄語狀態其中uid IN(SELECT UID從用戶其中uid IN (SELECT UID2從相知WHERE UID1 =我()))

我發現被請求friends_status許可將從公共職位,以朋友和其他人,幫助複製牆的感覺,打開神奇。

相關問題