2017-07-06 122 views
0

現在我正在開發一些特色網站。 使用facebook API,我得到了facebook_access_token並將其存儲在數據庫中供使用。 如果我使用同一個Facebook開發者帳戶的access_token,那麼我就可以成功獲得廣告系列數據。 但是,如果我使用不同的Facebook帳戶的access_token,那麼我無法獲得包含指標的廣告系列數據 - 喜歡,覆蓋等。 並且來自Facebook SDK的錯誤消息如下。如何從Facebook訪問令牌獲取廣告系列數據?

This Ads API call requires the user to be admin of the application. User is not admin or developer of this application. in /ezond/networks/facebook/vendor/facebook/php-ads-sdk/src/FacebookAds/Http/Exception/RequestException.php:140 

如何從Facebook訪問令牌獲取廣告系列數據。

代碼片段如下。

<?php 

require_once __DIR__ . '/vendor/autoload.php'; 

// Add to header of your file 
use FacebookAds\Api; 
use FacebookAds\Object\User; 
use FacebookAds\Object\Campaign; 

use Facebook\Facebook; 
use Facebook\FacebookRequest; 
use Facebook\Exceptions\FacebookResponseException; 
use Facebook\Exceptions\FacebookSDKException; 


$facebookAppID = "456797558007270"; 
$facebookAppSecret = "c69f7f97677d5852875a23045305cc8e"; 
$facebook_access_token = "xxxxxxxxxxxxxxx"; 

$viewID = "xxxxxxxxxx"; 

if(isset($_GET['viewID'])) $viewID = $_GET['viewID']; 
if($viewID == "") exit(); 

if(isset($_GET['refreshToken'])) $facebook_access_token = $_GET['refreshToken']; 
if($facebook_access_token == "") exit(); 

$fb = new Facebook([ 
     'app_id' => $facebookAppID, 
     'app_secret' => $facebookAppSecret, 
     'default_graph_version' => 'v2.9', 
     ]); 


// Initialize a new Session and instantiate an Api object 
Api::init(
    '456797558007270', // App ID 
    'c69f7f97677d5852875a23045305cc8e', 
    $facebook_access_token // Your user access token 
); 

$me = new User('me'); 
$my_ad_accounts = $me->getAdAccounts()->getObjects(); 

$campaign_fields = array(
    'name', 
    'status', 
    'effective_status', 
    'objective' 
    ); 

$insight_fields = array(
    'clicks', 
    'impressions', 
    'cpc', 
    'cpm', 
    'cpp', 
    'ctr', 
    'reach' 
    ); 

$insight_params = array(
    'date_preset' => 'lifetime' 
    ); 

$ret = new stdClass(); 
foreach ($insight_fields as $insight_name) { 
    $ret->$insight_name = 0; 
} 

for ($i=0; $i < sizeof($my_ad_accounts); $i++) { 
    $my_ad_account = $my_ad_accounts[$i]; 
    if($viewID == $my_ad_account->account_id){ 
     try { 
      $account_campaigns = $my_ad_account->getCampaigns(); 
     } catch(Facebook\Exceptions\FacebookResponseException $e) { 
      exit; 
     } catch(Facebook\Exceptions\FacebookSDKException $e) { 
      exit; 
     } 
     $my_campaigns = $account_campaigns->getObjects(); 

     if (sizeof($my_campaigns) >= 1){ 
      $campaign = $my_campaigns[0]; 
      $campaign = $campaign->getSelf($campaign_fields); 
      /*foreach ($campaign_fields as $field_name) { 
       echo $field_name . ': ' . $campaign->$field_name . '<br />'; 
      }*/ 
      $campaign_insights = $campaign->getInsights($insight_fields, $insight_params)->current(); 
      if($campaign_insights){ 
       foreach ($insight_fields as $insight_name) { 
        $ret->$insight_name += $campaign_insights->$insight_name; 
       } 
      } else { 
      // echo "NO"; 
      } 
     } 
    } 
} 

foreach ($insight_fields as $insight_name) { 
    $ret->$insight_name = round($ret->$insight_name, 2); 
} 
echo json_encode($ret); 

?> 

開發者帳戶和的access_token帳戶ID是

"xxxxxxxxxxx" 

"xxxxxxxxxx". 而測試帳戶和的access_token帳戶ID是 "xxxxxxxxxxxx"

"xxxxxxxxxxxxxxx". 

如果我不能得到數據與這種方法,我怎麼能通過訪問令牌獲取數據?

+0

永遠不要公開公開這樣的訪問令牌。既然你現在已經在這裏做了,你現在需要使它們失效(除非你想讓這裏的其他讀者能夠獲取這些標記並執行範圍允許以這兩個用戶的名義進行的任何操作)。 – CBroe

+0

然後,請仔細閱讀營銷API的文檔 - 如果您處於開發級別,則Facebook有意限制您的應用可訪問的帳戶。 – CBroe

+0

嗨,CBroe。謝謝你的評論。如果我完成了應用程序開發,那麼我需要做什麼? –

回答

0
This Ads API call requires the user to be admin of the application. User is not admin or developer of this application. 

要通過API訪問Facebook洞察數據,需要兩兩件事:

  1. 用正確的read_insights權限的dev的令牌
  2. 的帳戶必須是管理員

你必須給你提到的第二個帳戶管理員訪問應用程序或只使用初始帳戶。