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

Вместо извлечения CRITERIA_PERFORMANCE_REPORT я извлекаю GEO_PERFORMANCE_REPORT, используя этот пример: https://developers.google.com/adwords/api/docs/samples/php/reporting#download-a-criteria-performance-report-with-awql

Я извлекаю атрибут 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, который проходит по городским идентификаторам из результата отчета.

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Я понимаю, что другой способ - сохранить 100 000 некоторых записей (из .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";
}

Ошибка:

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

1 Ответ

0 голосов
/ 10 апреля 2019

Я использую 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"
        }
    ]
}

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

...