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
.