You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Meta Business SDK v18.0.2 PHP获取广告活动近30天花费?

解决方案:获取Meta广告活动过去30天的名称及花费

核心问题分析

  1. 日期筛选不生效:你在getCampaigns方法中使用了AdReportRunFields::DATE_PRESET,但这个参数属于Insights报表接口,不适用于获取广告活动列表的getCampaigns方法。列表查询需要通过时间字段的范围条件筛选。
  2. 无法获取时段花费:CampaignFields::AMOUNT_SPENT是广告活动的生命周期总花费,而非指定时段的花费。要获取过去30天的花费,必须使用Ads Insights API(报表接口)来查询时段统计数据。

修正后的代码

方式一:直接通过Insights API批量获取(推荐,更高效)

<?php
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
use FacebookAds\Object\AdAccount;

// 初始化API
Api::init($app_id, $app_secret, $access_token);
$api = Api::instance();
$api->setLogger(new CurlLogger());

$account = new AdAccount($account_id);

// 1. 定义Insights报表需要的字段:活动名称、ID、过去30天花费、目标等
$insightsFields = [
    'campaign_name',
    'campaign_id',
    'spend',
    'objective',
    'daily_budget',
    'lifetime_budget'
];

// 2. 报表参数:按活动级别聚合、过去30天、仅活跃活动
$insightsParams = [
    'level' => 'campaign', // 按广告活动级别聚合数据
    'date_preset' => 'last_30d', // 筛选过去30天的数据
    'effective_status' => ['ACTIVE'], // 仅包含活跃状态的活动
    'time_increment' => 'all_days' // 聚合整个时段的总花费
];

// 3. 获取报表数据
$insightsResponse = $account->getInsights($insightsFields, $insightsParams);
$campaignData = $insightsResponse->getResponse()->getContent();

// 输出结果
echo "<br /><br />——————————————————<br />";
echo json_encode($campaignData, JSON_PRETTY_PRINT);

// 遍历处理每条数据(注意spend单位是分,需要除以100转换为货币单位)
foreach ($campaignData['data'] as $campaign) {
    $spent = $campaign['spend'] / 100;
    echo "<br />活动ID:{$campaign['campaign_id']} - 活动名称:{$campaign['campaign_name']} - 过去30天花费:{$spent} 欧元<br /><br />";
}
?>

方式二:先筛选活动列表,再单独查询每个活动的花费

如果你需要先获取活动基础信息,再补充时段花费,可以用这种方式:

<?php
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
use FacebookAds\Object\AdAccount;
use FacebookAds\Object\Campaign;
use FacebookAds\Object\Fields\CampaignFields;
use FacebookAds\Object\Values\CampaignEffectiveStatusValues;

Api::init($app_id, $app_secret, $access_token);
$api = Api::instance();
$api->setLogger(new CurlLogger());

$account = new AdAccount($account_id);

// 1. 筛选过去30天内启动的活跃活动
$campaignFields = [
    CampaignFields::NAME,
    CampaignFields::LIFETIME_BUDGET,
    CampaignFields::OBJECTIVE,
    CampaignFields::START_TIME,
    CampaignFields::DAILY_BUDGET,
    CampaignFields::STATUS
];

// 注意:这里用start_time的范围筛选,而非DATE_PRESET
$campaignParams = [
    CampaignFields::EFFECTIVE_STATUS => [CampaignEffectiveStatusValues::ACTIVE],
    'start_time' => [
        '>=', 
        (new DateTime('-30 days'))->format(\DateTimeInterface::RFC3339) // Meta API要求的时间格式
    ]
];

$campaignResponse = $account->getCampaigns($campaignFields, $campaignParams);
$campaigns = $campaignResponse->getResponse()->getContent();

// 2. 遍历每个活动,查询过去30天的花费
foreach ($campaigns['data'] as $campaign) {
    $dailyBudget = $campaign['daily_budget'] / 100;
    echo "<br />活动ID:{$campaign['id']} - 活动名称:{$campaign['name']} - 日预算:{$dailyBudget} 欧元<br />";
    
    // 查询当前活动的过去30天花费
    $campaignObj = new Campaign($campaign['id']);
    $insights = $campaignObj->getInsights(
        ['spend'],
        [
            'date_preset' => 'last_30d',
            'time_increment' => 'all_days'
        ]
    );
    $spendData = $insights->getResponse()->getContent();
    $totalSpent = $spendData['data'][0]['spend'] / 100;
    
    echo "过去30天总花费:{$totalSpent} 欧元<br /><br />";
}
?>

关键说明

  • 时间格式:Meta API要求时间参数使用RFC3339格式(如2024-01-01T00:00:00+00:00),用DateTime类的format(\DateTimeInterface::RFC3339)可以直接生成。
  • 花费单位:所有金额字段(spend、daily_budget等)的单位都是分,需要除以100转换为实际货币单位。
  • Insights API参数:level指定数据聚合级别(campaign/adset/ad),date_preset支持last_30d、this_month等预设值,time_increment设为all_days会返回整个时段的总花费。

内容的提问来源于stack exchange,提问作者Matthieu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:44:55