【问题标题】:Retrieve Facebook Insights for all active ads within an account?检索帐户中所有活动广告的 Facebook 洞察力?
【发布时间】:2025-11-22 18:30:01
【问题描述】:

我的代码允许我检索特定日期之间的所有广告,但这包括不再有效的广告。

我只想显示 ACTIVE 广告的见解。 如何检索帐户中所有活动广告的 Facebook 洞察?

public function getInsights($levelType, $id, $aggLevel, $start, $end) {
    if ($levelType) {
        if ($id == null) {
            abort(400, 'You must provide the ID for the object you want to retrieve.');
        }
    } else {
        $levelType = \AdAccount::class;
        $id = ACT_PREPEND . $this->fbConfig['account_id'];
        $aggLevel = AdsInsightsLevelValues::CAMPAIGN;
    }
    $variableClassWithNamespace = '\FacebookAds\Object\\' . $levelType; //TODO: avoid hard-coding class paths as strings
    $level = new $variableClassWithNamespace($id);
    $fields = [
        InsightsFields::SPEND,
        InsightsFields::CAMPAIGN_ID,
        InsightsFields::CAMPAIGN_NAME,
        InsightsFields::ADSET_ID,
        InsightsFields::ADSET_NAME,
        InsightsFields::AD_ID,
        InsightsFields::AD_NAME,
        InsightsFields::UNIQUE_IMPRESSIONS,
        InsightsFields::INLINE_LINK_CLICKS,
        InsightsFields::INLINE_LINK_CLICK_CTR,
        InsightsFields::COST_PER_INLINE_LINK_CLICK,
        InsightsFields::ACTIONS,
        InsightsFields::COST_PER_ACTION_TYPE,
        InsightsFields::CPM,
    ];
    $params = [
        AdReportRunFields::LEVEL => $aggLevel,
    ];
    if ($start) {
        $params[AdReportRunFields::TIME_RANGE]['since'] = $start;
        if (!$end) {
            $params[AdReportRunFields::TIME_RANGE]['until'] = (new \DateTime("+2 year"))->format('Y-m-d');
        }
    }
    if ($end) {
        $params[AdReportRunFields::TIME_RANGE]['until'] = $end;
        if (!$start) {
            $params[AdReportRunFields::TIME_RANGE]['since'] = (new \DateTime("-1 year"))->format('Y-m-d');
        }
    }
    if (!$start && !$end) {
        $params[AdReportRunFields::DATE_PRESET] = InsightsPresets::LIFETIME;
    }
    $insights = $level->getInsights($fields, $params);
    return $insights->getResponse()->getBody();
}

我使用的是 Facebook PHP 广告 SDK 2.8(composer.json 中的"facebook/php-ads-sdk": "2.8.*")。 documentation is here

【问题讨论】:

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


    【解决方案1】:

    您应该对 Delivery_info 使用过滤以激活。在您的 http 请求中应该如下所示

    filtering:[{"field":"campaign.delivery_info","operator":"IN","value":["active"]}]
    

    请参考文档中的过滤部分。

    https://developers.facebook.com/docs/marketing-api/insights/parameters/v2.8

    filtering
    list<Filter Object>
    Default value: Array
    Filters on the report data. This parameter is an array of filter objects.
    field
    string
    Required
    operator
    enum {EQUAL, NOT_EQUAL, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, IN_RANGE, NOT_IN_RANGE, CONTAIN, NOT_CONTAIN, IN, NOT_IN, STARTS_WITH, ANY, ALL, AFTER, BEFORE, NONE}
    Required
    value
    string
    

    如果您想查看代码,请检查 PHP SDK 中的此过滤字段。它只是反映实际的 API 字段

    https://github.com/facebook/facebook-php-ads-sdk/blob/53bee21251a9d898591708b96d1afa9e13516e3d/src/FacebookAds/Object/Campaign.php#L220

    此外,我们最近推出了基于场景的代码生成向导工具。您可以浏览“创建广告报告”向导,它会为您生成代码。 (虽然目前只支持Java)

    工具的网址是:(替换你自己的app ID) https://developers.facebook.com/apps/your_app_id/marketing-api/quickstart/

    【讨论】:

    • 我很乐意接受您的正确回答,但我无法找到有关 filteringdelivery_info 的文档。例如。 google.com/…* 的任何结果都没有说明它是如何工作的。您能否发送一个链接或更具体的使用过滤器的-&gt;getInsights() 调用示例?
    • @Ryan,我编辑了我的答案,希望能给你一些背景信息。
    • 该页面顶部显示“本文档指的是在 Marketing API v2.7 之后删除的功能。”也许不再支持此功能。无论如何我都会接受你的回答,因为我感谢你的努力。
    • @Ryan,Facebook 刚刚发布了一个名为 Facebook Ads Manager for Excel 的工具。它允许您将报告直接下载到 Excel 2016。您可能想要使用它:facebook.com/business/m/facebook-ads-manager-for-excel 此外,您可以尝试在developers.facebook.com/apps/[app_id]/marketing-api 中使用入门工具。它允许您通过向导运行并生成 Java 代码以获取见解。
    • 这对我来说没有任何回报:-(
    【解决方案2】:

    这可行,您实际上是在请求所有处于活动状态的广告,然后提供 insights 作为“嵌套”字段列表。

    将 123456 替换为您的广告帐户(但留下需要的 'act_'

    act_123456/ads?fields=effective_status,name,insights{total_action_value,total_actions,actions},adset_id,campaign_id&filtering=[{'field':'effective_status','operator':'IN','value':['活动']}]

    这也适用于/campaigns/adsets

    这是我想出的唯一方法。我无法在根级别对/act_123456/insights 进行任何过滤。

    【讨论】:

      【解决方案3】:

      对于无法让过滤为 /act_123456/insights 工作的任何人,当您使用 'level' = 'ad' 时,您需要进行以下过滤:

      {'field':'ad.effective_status','operator':'IN','value':['ACTIVE', 'PAUSED', 'DELETED', 'ARCHIVED']}
      

      现在它确实为我应用了过滤器!

      【讨论】:

        最近更新 更多