Skip to content

Commit 94dfd49

Browse files
authored
Merge pull request #36 from bufferapp/support-breakdown-page-insights
Fetch and parse audience broke down metrics
2 parents e5d1547 + be593f5 commit 94dfd49

File tree

2 files changed

+108
-2
lines changed

2 files changed

+108
-2
lines changed

Diff for: Facebook/Facebook.php

+32-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public function __construct()
1313
$this->client = new FacebookClient([
1414
'app_id' => getenv('FACEBOOK_APP_ID'),
1515
'app_secret' => getenv('FACEBOOK_APP_SECRET'),
16-
'default_graph_version' => 'v14.0',
16+
'default_graph_version' => 'v16.0',
1717
]);
1818
}
1919

@@ -108,6 +108,36 @@ public function getPageInsightsMetricsData($pageId, $insightsMetrics, $since, $u
108108
return $data;
109109
}
110110

111+
/*
112+
* Get the lifetime page insights audience data for the given page.
113+
* https://developers.facebook.com/docs/instagram-api/reference/ig-user/insights#metrics
114+
*/
115+
public function getPageInsightsAudienceData($pageId, $metric, $breakdown)
116+
{
117+
$params = [
118+
"metric" => $metric,
119+
"breakdown" => $breakdown,
120+
"metric_type" => "total_value",
121+
"period" => "lifetime",
122+
];
123+
124+
$data = [];
125+
$response = $this->sendRequest("GET", "/{$pageId}/insights", $params);
126+
127+
if (!empty($response)) {
128+
$decodedBody = $response->getDecodedBody();
129+
130+
if (!empty($decodedBody) && is_array($decodedBody)) {
131+
$responseData = $decodedBody["data"];
132+
if(!empty($responseData) && isset($responseData[0]["total_value"])) {
133+
$data = $responseData[0]["total_value"]["breakdowns"][0];
134+
}
135+
}
136+
}
137+
138+
return $data;
139+
}
140+
111141
/*
112142
* Get Instagram Graph node metadata
113143
*/
@@ -390,7 +420,7 @@ private function extractPageInsightsMetricsFromResponse($response)
390420
}
391421
}
392422
return $result;
393-
}
423+
}
394424

395425
/*
396426
* Make Graph API /insights response to a human readable associative array.

Diff for: tests/FacebookTest.php

+76
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,82 @@ public function testGetPageInsightsMetricsDataShouldBatchLongPeriodRequests()
370370
$this->assertEquals($insightsData["page_fans"]["2017-05-29T07:00:00+0000"], 111);
371371
}
372372

373+
public function testGetPageInsightsAudienceData()
374+
{
375+
$decodedAudienceData = [
376+
'data' => [
377+
0 => [
378+
'name' => 'follower_demographics',
379+
'period' => 'lifetime',
380+
'total_value' => [
381+
'breakdowns' => [
382+
0 => [
383+
'dimension_keys' => ['city'],
384+
'results' => [
385+
0 => [
386+
'dimension_values' => ['Sydney, New South Wales'],
387+
'value' => 631
388+
],
389+
1 => [
390+
'dimension_values' => ['London, England'],
391+
'value' => 1142
392+
],
393+
2 => [
394+
'dimension_values' => ['Casablanca, Grand Casablanca'],
395+
'value' => 321
396+
],
397+
]
398+
]
399+
],
400+
],
401+
],
402+
]
403+
];
404+
405+
$facebook = new Facebook();
406+
$responseMock = m::mock('\Facebook\FacebookResponse')
407+
->shouldReceive('getDecodedBody')
408+
->once()
409+
->andReturn($decodedAudienceData)
410+
->getMock();
411+
$facebookMock = m::mock('\Facebook\Facebook');
412+
$facebookMock->shouldReceive('sendRequest')->once()->andReturn($responseMock);
413+
$facebook->setFacebookLibrary($facebookMock);
414+
415+
$audienceData = $facebook->getPageInsightsAudienceData(
416+
self::FB_PAGE_ID,
417+
'follower_demographics',
418+
'city'
419+
);
420+
421+
$this->assertEquals(['city'], $audienceData['dimension_keys']);
422+
}
423+
424+
public function testGetPageInsightsAudienceDataEmptyResponse()
425+
{
426+
$decodedAudienceData = [
427+
'data' => []
428+
];
429+
430+
$facebook = new Facebook();
431+
$responseMock = m::mock('\Facebook\FacebookResponse')
432+
->shouldReceive('getDecodedBody')
433+
->once()
434+
->andReturn($decodedAudienceData)
435+
->getMock();
436+
$facebookMock = m::mock('\Facebook\Facebook');
437+
$facebookMock->shouldReceive('sendRequest')->once()->andReturn($responseMock);
438+
$facebook->setFacebookLibrary($facebookMock);
439+
440+
$audienceData = $facebook->getPageInsightsAudienceData(
441+
self::FB_PAGE_ID,
442+
'follower_demographics',
443+
'city'
444+
);
445+
446+
$this->assertEquals([], $audienceData);
447+
}
448+
373449
public function testGetPagePostGraphMetricsData()
374450
{
375451
$decodedGraphResponseData = [

0 commit comments

Comments
 (0)