2012-04-07 151 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