Facebook Batch API洞察请求

Ke *_*Vin 6 javascript php ajax facebook facebook-graph-api

对于一个项目,我必须在Facebook的很长一段时间(例如1 - 2年)内获取页面的见解.

我首先尝试做一个单一的请求但事实证明只是请求

/PAGE_ID/insights?since=xxx&until=xxx
Run Code Online (Sandbox Code Playgroud)

不返回我想要的所有数据(它以某种方式压缩数据,就好像答案的大小有一些限制).

然后我试图拆分日期范围(例如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
Run Code Online (Sandbox Code Playgroud)

这实际上有效但不是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
Run Code Online (Sandbox Code Playgroud)

进入批处理请求但失败了.

似乎api被窃听了.当我使用问号'时,它总是给我这个错误?' 在'relative_url'字段中.

{
  "error": {
    "message": "batch parameter must be a JSON array", 
    "type": "GraphBatchException"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

这些给出'必须是一个JSON数组'错误:

?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600"}]
Run Code Online (Sandbox Code Playgroud)

这两个实际上返回数据,但它们忽略了参数:

?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"}}]
Run Code Online (Sandbox Code Playgroud)

这个告诉我这是一个'不支持的帖子请求':

?batch=[{"method":"POST","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":"since=1332486000 until=1333695600"}]
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Ke *_*Vin 28

我终于找到了解决问题的方法.在facebook文档中没有提到它,但是这个请求

?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600"}]
Run Code Online (Sandbox Code Playgroud)

为了正常工作,我们必须使用像这样的功能

urlencode()
Run Code Online (Sandbox Code Playgroud)

编码json部分.这样查询的工作就像一个魅力.一个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()));
Run Code Online (Sandbox Code Playgroud)

结果如下:

?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]
Run Code Online (Sandbox Code Playgroud)

  • 实际上你只需要用urlencode处理relative_url值, (3认同)