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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:58:04