【问题标题】:How to retrieve all my active Facebook ads?如何检索我所有活跃的 Facebook 广告?
【发布时间】:2017-08-31 10:26:03
【问题描述】:

我正在为自己创建一个仪表板,帮助我跟踪正在投放的 Facebook 广告。

我一直想不通的是:

我如何检索所有活动广告的广告 ID 数组在我不采取进一步行动后很快就会活动?

换句话说,我希望所有已设置为有效且存在于有效的广告集和广告系列中的广告(因此这些广告现在处于活动状态)...加上全部从 我的 角度来看的广告是活跃的,但 Facebook 已设置为其他状态,例如待审核(并且很快将设置回活跃)。

我在下面有一些代码,但问题是它不小心包含待处理的广告——一旦被 Facebook 审查和批准——将处于非活动状态而不是活动状态(因为我已经设置他们那样)。而且我不希望这种类型的广告包含在我的报告中。

我的报告应该只向我显示我正在积极花钱或在 FB 批准后有可能花钱的地方。

我想我理解AbstractArchivableCrudObjectFieldsconfigured_statuseffective_status 之间的区别,但我不知道这是否足以帮助我,因为我有很多设置为Active 的广告位于非活动的广告集中,并且我不想看到我的报告中列出的那些。

有什么建议吗?

public function getActiveAdIds() {
    $key = 'activeAdIds';
    $adIdsJson = Cache::get($key);
    if ($adIdsJson) {
        $adIds = json_decode($adIdsJson);
    } else {
        $adsResponse = $this->getAdsByStatus([ArchivableCrudObjectEffectiveStatuses::ACTIVE, ArchivableCrudObjectEffectiveStatuses::PENDING_REVIEW]);
        $ads = $adsResponse->data;
        $adIds = [];
        foreach ($ads as $ad) {
            $adIds[] = $ad->id;
        }
        $adIdsJson = json_encode($adIds);
        Cache::put($key, $adIdsJson, 1);
    }
    return $adIds;
}

public function getAdsByStatus($statuses) {
    $params = [\FacebookAds\Object\Fields\AbstractArchivableCrudObjectFields::EFFECTIVE_STATUS => $statuses];
    $adAccount = new AdAccount(self::ACT_PREPEND . $this->fbConfig['account_id']);
    $cursor = $adAccount->getAds([], $params);
    $response = $cursor->getResponse();
    $jsonString = $response->getBody();
    return json_decode($jsonString);
}

【问题讨论】:

  • 有机会分享一下,你是怎么解决这个问题的?
  • @Sigismund 仍未解决。如果你发现了,我很乐意你在这里发布答案。

标签: php facebook-php-sdk facebook-ads-api facebook-insights facebook-marketing-api


【解决方案1】:

如果您在广告查询中包含adset{end_time} 字段,则可以假设如果 end_time 是过去的时间,则广告实际上并未投放。这就是我们获取要查询的基本广告列表的方式。

我们采取的下一步(很遗憾,这可能对您没有帮助,但可能对其他人有帮助)是构建一组简单的请求(每个广告一个),以查看当天是否有任何洞察数据。如果响应是一个空的“数据”数组,我们可以从广告列表中删除该 ID。

在我们通过这两个步骤减小了广告列表的大小之后,我们就可以请求运行我们所有的细分报告。这种方法几乎将我们的 API 请求减少了一半。

我还没有找到一种方法来一步完成“给我所有肯定会在今天投放的广告”查询。

编辑: 我刚刚找到了一个更好的方法来做到这一点......:

curl -G \
-d 'access_token=<ACCESS_TOKEN>' \
-d 'level=campaign' \
-d 'filtering=[{field:"ad.impressions",operator:"GREATER_THAN",value:0}]' \
'https://graph.facebook.com/v2.7/act_<ACCOUNT_ID>/insights'

【讨论】:

    【解决方案2】:

    我会根据我的有效广告系列的资产获取统计信息。我有 119 个广告帐户。这是我为此目的使用的 php 代码(任何改进它的建议将不胜感激):

        $fields = array(AdsInsightsFields::ACCOUNT_NAME,AdsInsightsFields::CAMPAIGN_ID,
                        AdsInsightsFields::CAMPAIGN_NAME, AdsInsightsFields::ADSET_ID,
                        AdsInsightsFields::ADSET_NAME,AdsInsightsFields::DATE_START,
                        AdsInsightsFields::DATE_STOP,AdsInsightsFields::REACH,
                        AdsInsightsFields::SPEND, AdsInsightsFields::IMPRESSIONS,
                        AdsInsightsFields::CLICKS, AdsInsightsFields::WEBSITE_CLICKS,
                        AdsInsightsFields::CALL_TO_ACTION_CLICKS,AdsInsightsFields::ACTIONS,
                        AdsInsightsFields::TOTAL_ACTIONS,AdsInsightsFields::CPC,
                        AdsInsightsFields::CPM,AdsInsightsFields::CPP,
                        AdsInsightsFields::CTR,AdsInsightsFields::OBJECTIVE,);
        $params_c['date_preset'] = AdDatePresetValues::YESTERDAY;
        $params_c['time_increment'] = 1;
        $params_c['action_attribution_windows'] = array('1d_view', '28d_click');
        $params_c['effective_status'] = AdStatusValues::ACTIVE;
        $params_c['level'] = AdsInsightsLevelValues::ADSET;
        $params_c['filtering'] = [array("field"=>"campaign.delivery_info", 
                                       "operator"=>"IN",
                                        "value"=>array("active"))];
        $params_c['fields']= $fields;     
        try{
             // Initialize a new Session and instanciate an Api object
            Api::init(self::api_key, self::secret_token, self::extended_token)->getHttpClient()->setCaBundlePath( $this->path_cert);
    
            // The Api object is now available trough singleton
            $api = Api::instance();
            $user = new \FacebookAds\Object\Business($business_id);
            $user->read(array(BusinessFields::ID));
    
            //get all ad_account from Business
            $accounts = $user->getAssignedAdAccounts(
                          array(
                        AdAccountFields::ID,
                     ),
                      array('limit'=>1000,)
                    );                                    
    
        } catch (FacebookAds\Exception\Exception $ex) {
            return $ex->getMessage();
        }   
    
        if(isset($accounts) && ($accounts->count() > 0)):           
            do{
    
                $ad_account = $accounts->current();            
                $adset_insights = $ad_account->getInsights($fields,$params_c); 
    
                do {
                    $adset_insights->fetchAfter();
                } while ($adset_insights->getNext());
    
                $adsets = $adset_insights->getArrayCopy(true); 
        }
        while ($accounts->current());    
        endif;
    

    【讨论】:

    • 感谢分享。尽管您的代码看起来可能会对某人有所帮助,但我想知道您是否不理解我的问题的主要部分(关于 configured_statuseffective_status 之间的区别以及如何检索所有积极花钱的广告或者可以被 Facebook 批准在我不采取任何进一步行动的情况下花钱)。
    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多