2012-04-07 149 views
4

對於一個項目,我必須長時間(例如1 - 2年)的Facebook抓取頁面的見解。Facebook批處理API洞察請求

我第一次嘗試做一個請求,但事實證明,只要求

/PAGE_ID/insights?since=xxx&until=xxx 

不會返回所有我想要的數據(它在某種程度上supresses數據,就好像有一些限制的大小回答)。

然後,我試圖拆分日期範圍(例如01.04.2011-01.04.2011 - > 01.04.2011-01.08.2011-01.12.2011-01.04.2011),這並不像我想要它。

我的下一個方法是隻請求我需要的洞察值,比如'page_stories,page_impressions ...'。請求看起來像這樣

/PAGE_ID/insights/page_impressions/day?since=xxx&until=xxx 

這實際上工作,但不是與ajax。它有時似乎放棄了一些請求(特別是如果我改變了谷歌瀏覽器中的瀏覽器標籤),我需要確保所有請求都返回一個答案。考慮到一個請求需要至少2秒鐘和2年的日期範圍,同步解決方案可能會花費太多時間,我可能需要大約300個單個請求,這需要太長的時間才能完成。

最後我偶然發現了Facebook的能力來做批量請求,這正是我所需要的。它可以在一次通話中打包多達50個請求,從而顯着降低帶寬。這就是我卡住的地方。 facebook api給出了一些關於如何使用它的例子,但是當我在Graph Explorer中通過php facebook api sdk測試它們時,它們都沒有工作。我試圖將這個請求打包成

PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600 

進入批處理請求但失敗。

看來api被竊聽了。當我使用問號'?'時,總會給我這個錯誤。在'relative_url'字段中。

{ 
    "error": { 
    "message": "batch parameter must be a JSON array", 
    "type": "GraphBatchException" 
    } 
} 

這裏是我的嘗試:

這些給了「必須是一個JSON數組」錯誤:

?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600"}] 

這兩個實際返回的數據,但他們忽略的參數:

?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":"since=1332486000 until=1333695600"}] 
?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":"since=1332486000,until=1333695600"}] 
?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":{"since":"1332486000","until":"1333695600"}}] 

而這個告訴我,這是'不支持的發佈請求':

?batch=[{"method":"POST","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":"since=1332486000 until=1333695600"}] 

有人可以幫忙嗎?

回答

25

我終於找到了解決我的問題。這不是Facebook的文件中,但此請求

?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600"}] 

正常工作中提到,我們必須使用一個函數像

urlencode() 

到JSON部編碼。這樣querys就像一個魅力。一個PHP例如:

$insights = $facebook->api('?batch=['.urlencode('{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332572400&until=1333782000"}').']' 
    ,'post',array('access_token' => $this->facebook->getAccessToken())); 

這導致這樣的:

?batch=[%7B%22method%22%3A%22GET%22%2C%22relative_url%22%3A%22%2FPAGE_ID%2Finsights%2Fpage_fan_adds%2Fday%3Fsince%3D1300086000%26until%3D1307862000%22%7D] 
+0

哇,有趣的解決方法。不要忘記將自己的答案標記爲已接受的答案。 – DMCS 2012-04-10 18:43:47

+0

謝謝!!!!!!!!! – emersonthis 2012-06-12 15:52:08

+3

你實際上只需要用urlencode處理relative_url值, – madc 2014-06-30 10:15:25

0

該實施例是用於使用ID的array以與URL編碼批處理請求。

$postIds = [ 
    'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX', 
    'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX', 
    'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX', 
    'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX', 
    'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX', 
]; 

$queries = []; 
foreach($postIds as $postId) { 
    $queries[] = [ 
     'method'  => 'GET', 
     'relative_url' => '/' . $postId . '/comments?summary=1&filter=stream&order=reverse_chronological', 
    ]; 
} 

$requests = $facebook->post('?batch=' . urlencode(json_encode($queries)))->getGraphNode(); 
+0

這一直讓我絆倒,所以我想我會添加到現有的答案。 – 2016-11-14 09:31:15