如何通过Meta Business SDK v18.0.2 PHP获取广告活动近30天花费?
解决方案:获取Meta广告活动过去30天的名称及花费
核心问题分析
- 日期筛选不生效:你在
getCampaigns方法中使用了AdReportRunFields::DATE_PRESET,但这个参数属于Insights报表接口,不适用于获取广告活动列表的getCampaigns方法。列表查询需要通过时间字段的范围条件筛选。 - 无法获取时段花费:
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
相关产品推荐
相关产品推荐

