php - Facebook Batch API 洞察力请求

标签 php javascript ajax facebook facebook-graph-api

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

我首先尝试做一个单一的请求,但结果是只请求

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

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

然后我尝试拆分日期范围(例如 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"}]

有人可以帮忙吗?

最佳答案

我终于找到了解决问题的方法。 facebook 文档中没有提及,但针对此请求

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

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

urlencode()

对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()));

结果是:

?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]

关于php - Facebook Batch API 洞察力请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10056097/

相关文章:

php - 什么是更好的做法: storing images in MySQL or storing only image paths in MySQL?

php - 如何修复从 Bootstrap 中删除模式(仅删除第一行)

javascript - 在 JavaScript 中动态加载的绘制到 Canvas 上的图像具有不正确(但接近)的 RGB 值

jquery - 向ajax启动函数发送参数

javascript - 返回一个字符串并从 AJAX POST 传递到单独的 HTML 文件中?

PHP从mysql打印在线用户名

php - 如何在多维数组的所有列中搜索索引

javascript - 通过key进行区分,然后得到key以外字段的结果

javascript - KnockoutJS 更新行总和字段

javascript - 为什么我的ajax不发送在 Controller 端上传的图像?