如何使用PHP客户端库获取Google DFP v201711中LineItem的全部属性?
获取DFP LineItem的额外属性(v201711 PHP客户端)
别担心,我来一步步教你怎么获取这些你需要的属性~其实分为两种情况:LineItem自身携带的属性,和需要关联其他API服务获取的关联属性,下面分别说明:
一、直接从LineItem对象获取的属性
像起止日期、投放状态这些,是LineItem本身就有的字段,直接通过对象的getter方法就能拿到,比如:
foreach ($page->getResults() as $lineItem) { // 原有ID和名称 printf("%d) Line item with ID %d and name '%s' was found.\n", $i++, $lineItem->getId(), $lineItem->getName()); // 获取起止日期 $startDate = $lineItem->getStartDateTime(); $endDate = $lineItem->getEndDateTime(); printf(" 投放开始时间: %s %s\n", $startDate->getDate()->toString(), $startDate->getTime()->toString()); printf(" 投放结束时间: %s %s\n", $endDate->getDate()->toString(), $endDate->getTime()->toString()); // 获取投放状态 printf(" 投放状态: %s\n", $lineItem->getStatus()); // 获取其他自带属性,比如预算 if ($lineItem->getCostType() === 'CPM') { printf(" 预算: %.2f %s\n", $lineItem->getCostPerUnit()->getMicroAmount() / 1000000, $lineItem->getCostPerUnit()->getCurrencyCode()); } }
二、需要关联其他服务获取的属性
像订单名称、广告商详情这些,LineItem里只存了对应的ID,需要调用对应的API服务来获取完整信息,为了提高效率,建议批量获取,避免多次API请求:
1. 获取订单名称(需要调用OrderService)
首先初始化OrderService,然后收集所有LineItem的orderId,批量获取订单信息:
// 先收集所有LineItem的orderId $orderIds = []; foreach ($page->getResults() as $lineItem) { $orderIds[] = $lineItem->getOrderId(); } // 初始化OrderService $orderService = new DfpServices($user)->get('OrderService', 'v201711'); // 批量获取订单 $orderStatement = new StatementBuilder(); $orderStatement->where('id IN (' . implode(',', $orderIds) . ')'); $orderPage = $orderService->getOrdersByStatement($orderStatement->toStatement()); // 把订单存成ID=>对象的映射,方便后续查找 $orderMap = []; foreach ($orderPage->getResults() as $order) { $orderMap[$order->getId()] = $order; }
之后在遍历LineItem的时候,就能通过orderId拿到订单名称:
foreach ($page->getResults() as $lineItem) { $order = $orderMap[$lineItem->getOrderId()]; printf(" 所属订单名称: %s\n", $order->getName()); }
2. 获取广告商详情(需要调用CompanyService)
广告商属于Company的一种类型,从订单里拿到advertiserId,再调用CompanyService获取详情:
// 收集所有订单的advertiserId $advertiserIds = []; foreach ($orderPage->getResults() as $order) { $advertiserIds[] = $order->getAdvertiserId(); } // 初始化CompanyService $companyService = new DfpServices($user)->get('CompanyService', 'v201711'); // 批量获取广告商信息 $companyStatement = new StatementBuilder(); $companyStatement->where('id IN (' . implode(',', $advertiserIds) . ')'); $companyPage = $companyService->getCompaniesByStatement($companyStatement->toStatement()); // 存成ID=>对象的映射 $advertiserMap = []; foreach ($companyPage->getResults() as $company) { $advertiserMap[$company->getId()] = $company; }
然后在遍历的时候就能获取广告商名称、邮箱等信息:
foreach ($page->getResults() as $lineItem) { $order = $orderMap[$lineItem->getOrderId()]; $advertiser = $advertiserMap[$order->getAdvertiserId()]; printf(" 广告商名称: %s\n", $advertiser->getName()); printf(" 广告商邮箱: %s\n", $advertiser->getEmail()); }
3. 获取活动维度(Targeting)
LineItem的targeting属性里包含了所有投放维度(比如地域、受众、库存定位等),你可以根据需要解析这个对象:
foreach ($page->getResults() as $lineItem) { $targeting = $lineItem->getTargeting(); // 示例:获取地域定位 if ($targeting->getGeoTargeting()) { $geoTargeting = $targeting->getGeoTargeting(); printf(" 地域定位类型: %s\n", $geoTargeting->getTargetingType()); // 如果是定向特定国家,解析countries数组 if (!empty($geoTargeting->getCountries())) { $countryCodes = array_map(function($country) { return $country->getCountryCode(); }, $geoTargeting->getCountries()); printf(" 定向国家: %s\n", implode(', ', $countryCodes)); } } // 示例:获取库存定位(指定广告位) if ($targeting->getInventoryTargeting()) { $inventoryTargeting = $targeting->getInventoryTargeting(); if (!empty($inventoryTargeting->getTargetedAdUnits())) { $adUnitNames = array_map(function($adUnit) { return $adUnit->getName(); }, $inventoryTargeting->getTargetedAdUnits()); printf(" 定向广告位: %s\n", implode(', ', $adUnitNames)); } } }
完整整合后的示例代码
把上面的逻辑整合到原有的GetAllLineItems.php里,大概是这样:
<?php require_once '/path/to/vendor/autoload.php'; use Google\AdsApi\Dfp\DfpServices; use Google\AdsApi\Dfp\DfpSession; use Google\AdsApi\Dfp\DfpSessionBuilder; use Google\AdsApi\Dfp\Util\v201711\StatementBuilder; use Google\AdsApi\Lib\OAuth2TokenBuilder; // 初始化会话 $oAuth2Credential = (new OAuth2TokenBuilder()) ->fromFile() ->build(); $session = (new DfpSessionBuilder()) ->fromFile() ->withOAuth2Credential($oAuth2Credential) ->build(); $dfpServices = new DfpServices(); $lineItemService = $dfpServices->get($session, 'LineItemService', 'v201711'); // 获取所有LineItem(原逻辑) $statementBuilder = new StatementBuilder(); $page = $lineItemService->getLineItemsByStatement($statementBuilder->toStatement()); if ($page->getResults() !== null) { $i = 1; $orderIds = []; // 收集orderId foreach ($page->getResults() as $lineItem) { $orderIds[] = $lineItem->getOrderId(); } // 获取订单 $orderService = $dfpServices->get($session, 'OrderService', 'v201711'); $orderStatement = new StatementBuilder(); $orderStatement->where('id IN (' . implode(',', $orderIds) . ')'); $orderPage = $orderService->getOrdersByStatement($orderStatement->toStatement()); $orderMap = []; $advertiserIds = []; foreach ($orderPage->getResults() as $order) { $orderMap[$order->getId()] = $order; $advertiserIds[] = $order->getAdvertiserId(); } // 获取广告商 $companyService = $dfpServices->get($session, 'CompanyService', 'v201711'); $companyStatement = new StatementBuilder(); $companyStatement->where('id IN (' . implode(',', $advertiserIds) . ')'); $companyPage = $companyService->getCompaniesByStatement($companyStatement->toStatement()); $advertiserMap = []; foreach ($companyPage->getResults() as $company) { $advertiserMap[$company->getId()] = $company; } // 遍历输出所有信息 foreach ($page->getResults() as $lineItem) { printf("%d) Line item with ID %d and name '%s' was found.\n", $i++, $lineItem->getId(), $lineItem->getName()); // 起止日期 $startDate = $lineItem->getStartDateTime(); $endDate = $lineItem->getEndDateTime(); printf(" 投放开始时间: %s %s\n", $startDate->getDate()->toString(), $startDate->getTime()->toString()); printf(" 投放结束时间: %s %s\n", $endDate->getDate()->toString(), $endDate->getTime()->toString()); // 订单信息 $order = $orderMap[$lineItem->getOrderId()]; printf(" 所属订单名称: %s\n", $order->getName()); // 广告商信息 $advertiser = $advertiserMap[$order->getAdvertiserId()]; printf(" 广告商名称: %s\n", $advertiser->getName()); printf(" 广告商邮箱: %s\n", $advertiser->getEmail()); // 定向维度(地域示例) $targeting = $lineItem->getTargeting(); if ($targeting->getGeoTargeting() && !empty($targeting->getGeoTargeting()->getCountries())) { $countryCodes = array_map(function($country) { return $country->getCountryCode(); }, $targeting->getGeoTargeting()->getCountries()); printf(" 定向国家: %s\n", implode(', ', $countryCodes)); } echo "------------------------\n"; } } else { print "No line items found.\n"; } ?>
注意事项
- 记得替换
/path/to/vendor/autoload.php为你实际的依赖路径 - 如果LineItem数量很多,建议用分页查询(
StatementBuilder里加LIMIT和OFFSET),避免单次请求返回数据过多 - 不同的targeting类型有不同的结构,你可以根据API类的结构来解析更多维度
内容的提问来源于stack exchange,提问作者Shamon S
相关产品推荐
相关产品推荐

