PHP AdWords API v201809 - Как получить название города с помощью LocationCriterionService из GEO_PERFORMANCE_REPORT?

Вместо того, чтобы тянуть CRITERIA_PERFORMANCE_REPORTТяну GEO_PERFORMANCE_REPORT используя этот пример: https://developers.google.com/adwords/api/docs/samples/php/reporting

Я тяну CityCriteriaId атрибут для каждого результата из этого отчета API.

Я хочу использовать LocationCriterionService чтобы выяснить, какое название города основано на идентификаторах, которые возвращаются, но застряли на наиболее эффективном способе создания этого запроса. Вот что у меня так далеко:

зависимости:

namespace Google\AdsApi\Examples\AdWords\v201809\Reporting;
namespace Google\AdsApi\Examples\AdWords\v201809\Targeting;

require __DIR__ . '/vendor/autoload.php';

// For all the services/methods necessary from the Reporting namespace
use Google\AdsApi\AdWords\AdWordsSession;
use Google\AdsApi\AdWords\AdWordsSessionBuilder;
use Google\AdsApi\AdWords\Query\v201809\ReportQueryBuilder;
use Google\AdsApi\AdWords\Reporting\v201809\DownloadFormat;
use Google\AdsApi\AdWords\Reporting\v201809\ReportDefinitionDateRangeType;
use Google\AdsApi\AdWords\Reporting\v201809\ReportDownloader;
use Google\AdsApi\AdWords\ReportSettingsBuilder;
use Google\AdsApi\AdWords\v201809\cm\DateRange;
use Google\AdsApi\AdWords\v201809\cm\ReportDefinitionReportType;
use Google\AdsApi\Common\OAuth2TokenBuilder;

// For all the services/methods necessary for the LocationCriterionService
// and Targeting namespace
use Google\AdsApi\AdWords\AdWordsServices;
use Google\AdsApi\AdWords\v201809\cm\LocationCriterionService;
use Google\AdsApi\AdWords\v201809\cm\Predicate;
use Google\AdsApi\AdWords\v201809\cm\PredicateOperator;
use Google\AdsApi\AdWords\v201809\cm\Selector;

runExample: вот код отчета, который у меня есть (это все в своем собственном классе):

public static function runExample(AdWordsServices $adS, AdWordsSession $session, $reportF)
{
    $query = (new ReportQueryBuilder())
        ->select([
            'CityCriteriaId',
            'Clicks'
        ])
        ->from(ReportDefinitionReportType::GEO_PERFORMANCE_REPORT)
        ->duringDateRange(ReportDefinitionDateRangeType::LAST_7_DAYS)
        ->build();

    $reportDownloader = new ReportDownloader($session);
    $reportSettingsOverride = (new ReportSettingsBuilder())
        ->includeZeroImpressions(false)
        ->build();
    $reportDownloadResult = $reportDownloader->downloadReportWithAwql(
        sprintf('%s', $query),
        $reportF,
        $reportSettingsOverride
    );

    $reportResult = $reportDownloadResult->getAsString();
    $xml = simplexml_load_string($reportResult);
    $data = json_decode(json_encode((array)$xml), TRUE);

    $locationIDs = [];
    $results = $data['table']['row']['@attributes']['city'];
    foreach ($results as $cityID) {
        array_push($locationIDs, $cityID);
    }

    // Here's where I don't know what to do...
    // But any and all code for the LocationCriterionService would be done here

}

Основная функция: (взято из примера в URL выше)

public static function main()
{
    $oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build();

    $session = (new AdWordsSessionBuilder())
        ->fromFile()
        ->withOAuth2Credential($oAuth2Credential)
        ->build();

    self::runExample(new AdWordsServices(), $session, DownloadFormat::XML);
}

Любая помощь будет оценена в отношении того, что я должен поместить в это foreach цикл, который перебирает идентификаторы города из результата отчета.

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: я понимаю, что другой способ - сохранить 100000 некоторых записей (из.csv, которые Google предоставляет для перекрестных ссылок городов с назначенными им идентификаторами) в локальной базе данных и перекрестной ссылки таким образом, но этот способ предпочтительнее.

РЕДАКТИРОВАТЬ:

Я начал получать некоторый прогресс с некоторым дополнительным кодом, особенно для LocationCriterionService все же это приводит к ошибке, потому что мой параметр для переменной Predicate неверен (soap DLL требуется в вашем php_info):

$locationCriterionService = $adS->get($session, LocationCriterionService::class);

$selector = new Selector();
$selector->setFields(
    [
        'Id',
        'LocationName',
        'CanonicalName'
    ]
);

$selector->setPredicates(
    [
        new Predicate('locationid', PredicateOperator::EQUALS, $locationIDs)
    ]
);

$locationCriteria = $locationCriterionService->get($selector);

if ($locationCriteria !== null) {
    foreach ($locationCriteria as $locationCriterion) {
        printf(
            "The search term '%s' returned the location '%s' of type '%s' "
            . "with ID %d, and reach %d (%s).\n",
            $locationCriterion->getSearchTerm(),
            $locationCriterion->getLocation()->getLocationName(),
            $locationCriterion->getLocation()->getDisplayType(),
            $locationCriterion->getLocation()->getId()
        );
    }
} else {
    print "No location criteria were found.\n";
}

Ошибка:

Uncaught Google \ AdsApi \ AdWords \ v201809 \ cm \ ApiException: [SelectorError.INVALID_PREDICATE_FIELD_NAME @ selector; Триггер:'locationid']

0 ответов

Я использую Node.js напишите мое приложение google adwords.

API Google adwords: v201809.

Вот мой случай:

я получил xml данные GEO_PERFORMANCE_REPORT нравится:

<row campaignID='1733539359' campaign='Campaign Name3.0-119-1552463540147' impressions='1' countryTerritory='2818' city='1005392'/>
<row campaignID='1733539359' campaign='Campaign Name3.0-119-1552463540147' impressions='4' countryTerritory='2716' city='1028774'/>

Как видите, есть два названных поля: countryTerritory а также city.

Это countrycriteriaid и citycriteriaid.

Теперь я хочу получить название страны и города. Это можно сделать с помощью LocationCriterionService

Вот мой фрагмент кода для selector:

 const criterionIds = [2818, 2716, 1005392, 1028774];

 const selector = new AdWords.Selector.model({
      fields: ['CanonicalName', 'Reach'],
      predicates: [ {
        field: 'Id',
        operator: 'IN',
        values: criterionIds
      }],
      ordering: []
    })

И получаю ответ:

{
    "entries": [
        {
            "location": {
                "id": "2716",
                "Criterion.Type": "Location",
                "locationName": "Zimbabwe",
                "displayType": "Country",
                "targetingStatus": "ACTIVE"
            },
            "canonicalName": "Zimbabwe",
            "reach": "736000"
        },
        {
            "location": {
                "id": "2818",
                "Criterion.Type": "Location",
                "locationName": "Egypt",
                "displayType": "Country",
                "targetingStatus": "ACTIVE"
            },
            "canonicalName": "Egypt",
            "reach": "20300000"
        },
        {
            "location": {
                "id": "1005392",
                "Criterion.Type": "Location",
                "locationName": "Damietta",
                "displayType": "City",
                "targetingStatus": "ACTIVE",
                "parentLocations": [
                    {
                        "id": "21479",
                        "Criterion.Type": "Location",
                        "locationName": "Damietta Governorate",
                        "displayType": "Governorate",
                        "targetingStatus": "ACTIVE"
                    },
                    {
                        "id": "2818",
                        "Criterion.Type": "Location",
                        "locationName": "Egypt",
                        "displayType": "Country",
                        "targetingStatus": "ACTIVE"
                    }
                ]
            },
            "canonicalName": "Damietta,Damietta Governorate,Egypt",
            "reach": "593000"
        },
        {
            "location": {
                "id": "1028774",
                "Criterion.Type": "Location",
                "locationName": "Harare",
                "displayType": "City",
                "targetingStatus": "ACTIVE",
                "parentLocations": [
                    {
                        "id": "9070024",
                        "Criterion.Type": "Location",
                        "locationName": "Harare Province",
                        "displayType": "Province",
                        "targetingStatus": "ACTIVE"
                    },
                    {
                        "id": "2716",
                        "Criterion.Type": "Location",
                        "locationName": "Zimbabwe",
                        "displayType": "Country",
                        "targetingStatus": "ACTIVE"
                    }
                ]
            },
            "canonicalName": "Harare,Harare Province,Zimbabwe",
            "reach": "593000"
        }
    ]
}

Надеюсь, это поможет.

Я столкнулся с той же дилеммой. То, что предлагает @ slideshowp2, и то, что у вас есть отредактированный ответ, - это правильный подход к решению этой проблемы. См. Исходную ветку форума Google: https://groups.google.com/forum/.

Как указано там, вы должны получить настоящее название мест из LocationCriterionService. Вы можете найти пример использования этой службы на https://developers.google.com/adwords/api/docs/samples/php/targeting. Это тот, на котором я фактически основывался, чтобы получить нужные мне данные, но вместо использования имени местоположения я использовал идентификатор местоположения в качестве критерия поиска.

А здесь вы можете увидеть пример того, как выглядит объект локации:

0 => Google\AdsApi\AdWords\v201809\cm\LocationCriterion {#7340
  #location: Google\AdsApi\AdWords\v201809\cm\Location {#7343
    #locationName: "Fort Lauderdale"
    #displayType: "City"
    #targetingStatus: "ACTIVE"
    #parentLocations: array:4 [
      0 => Google\AdsApi\AdWords\v201809\cm\Location {#7338
        #locationName: "Broward County"
        #displayType: "County"
        #targetingStatus: "ACTIVE"
        #parentLocations: null
        #id: 1014969
        #type: null
        #CriterionType: "Location"
        -parameterMap: array:1 [
          "Criterion.Type" => "CriterionType"
        ]
      }
      1 => Google\AdsApi\AdWords\v201809\cm\Location {#7339
        #locationName: "Miami-Ft. Lauderdale FL"
        #displayType: "DMA Region"
        #targetingStatus: "ACTIVE"
        #parentLocations: null
        #id: 200528
        #type: null
        #CriterionType: "Location"
        -parameterMap: array:1 [
          "Criterion.Type" => "CriterionType"
        ]
      }
      2 => Google\AdsApi\AdWords\v201809\cm\Location {#7337
        #locationName: "Florida"
        #displayType: "State"
        #targetingStatus: "ACTIVE"
        #parentLocations: null
        #id: 21142
        #type: null
        #CriterionType: "Location"
        -parameterMap: array:1 [
          "Criterion.Type" => "CriterionType"
        ]
      }
      3 => Google\AdsApi\AdWords\v201809\cm\Location {#7336
        #locationName: "United States"
        #displayType: "Country"
        #targetingStatus: "ACTIVE"
        #parentLocations: null
        #id: 2840
        #type: null
        #CriterionType: "Location"
        -parameterMap: array:1 [
          "Criterion.Type" => "CriterionType"
        ]
      }
    ]
    #id: 1015027
    #type: null
    #CriterionType: "Location"
    -parameterMap: array:1 [
      "Criterion.Type" => "CriterionType"
    ]
  }
  #canonicalName: "Fort Lauderdale,Florida,United States"
  #reach: 1450000
  #locale: null
  #searchTerm: null
  #countryCode: null
}

Наконец, вы получаете ошибку, потому что нет LocationId или locationid (независимо от того, как вы его используете) в Locationобъект. Вы должны использоватьIdвместо. См. Документацию поLocationобъект на https://developers.google.com/adwords/api/docs/reference/v201809/LocationCriterionService.Location.

Кстати, версия API, которую я использовал, такая же, как у вас: v201809.

Другие вопросы по тегам