Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Facebook批量API洞察请求_Php_Javascript_Ajax_Facebook_Facebook Graph Api - Fatal编程技术网

Php Facebook批量API洞察请求

Php Facebook批量API洞察请求,php,javascript,ajax,facebook,facebook-graph-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),但也没有像我希望的那样工作 我

对于一个项目,我必须在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_ID/insights/page_impressions/day?since=xxx&until=xxx
这实际上是可行的,但不适用于ajax。有时它似乎会删除一些请求(特别是如果我在google chrome中更改了浏览器选项卡),我需要确保所有请求都会返回一个答案。synchronus解决方案需要花费太多的时间,因为一个请求至少需要2秒,并且日期范围为2年,我可能有大约300个单个请求,这需要太长的时间才能完成

最后,我无意中发现facebook能够批量请求,这正是我所需要的。它可以在一次呼叫中打包多达50个请求,从而显著降低带宽。这就是我被困的地方。FacebookAPI提供了一些关于如何使用它的示例,但当我在Graph Explorer中通过php FacebookAPI sdk对它们进行测试时,这些示例都不起作用。我试图打包这个请求

PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600
?batch=[{"method":"GET","relative_url":"/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"}}]
这个告诉我这是一个“不受支持的post请求”:

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

有人能帮忙吗?

我终于找到了解决问题的办法。facebook文档中没有提到这一点,但针对这一请求

PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600
?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]

此示例用于使用ID的
数组
发出带有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();

实际上,您只需要使用urlencode处理相对_url值,原始答案是正确的,@madc的解决方案不足以处理大批量。干杯,凯文!这一直让我感到困惑,所以我想我应该补充现有的答案。