#!/usr/bin/perl -w
use
lib
"$Bin/../../lib"
;
qw(PERFORMANCE_MAX)
;
qw(HEADLINE DESCRIPTION LONG_HEADLINE BUSINESS_NAME LOGO MARKETING_IMAGE SQUARE_MARKETING_IMAGE)
;
use
Google::Ads::GoogleAds::V12::Services::CampaignBudgetService::CampaignBudgetOperation;
use
Google::Ads::GoogleAds::V12::Services::CampaignCriterionService::CampaignCriterionOperation;
use
Google::Ads::GoogleAds::V12::Services::AssetGroupService::AssetGroupOperation;
use
Google::Ads::GoogleAds::V12::Services::AssetGroupAssetService::AssetGroupAssetOperation;
use
Google::Ads::GoogleAds::V12::Services::AssetGroupSignalService::AssetGroupSignalOperation;
use
constant
PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID
=> -2;
use
constant
ASSET_GROUP_TEMPORARY_ID
=> -3;
our
$next_temp_id
= ASSET_GROUP_TEMPORARY_ID - 1;
my
$customer_id
=
"INSERT_CUSTOMER_ID_HERE"
;
my
$audience_id
=
undef
;
sub
add_performance_max_campaign {
my
(
$api_client
,
$customer_id
,
$audience_id
) =
@_
;
my
$headline_asset_resource_names
=
create_multiple_text_assets(
$api_client
,
$customer_id
,
[
"Travel"
,
"Travel Reviews"
,
"Book travel"
]);
my
$description_asset_resource_names
=
create_multiple_text_assets(
$api_client
,
$customer_id
,
[
"Take to the air!"
,
"Fly to the sky!"
]);
my
$operations
= [];
push
@$operations
, create_campaign_budget_operation(
$customer_id
);
push
@$operations
, create_performance_max_campaign_operation(
$customer_id
);
push
@$operations
, @{create_campaign_criterion_operations(
$customer_id
)};
push
@$operations
,
@{
create_asset_group_operations(
$customer_id
,
$headline_asset_resource_names
,
$description_asset_resource_names
)};
push
@$operations
,
@{create_asset_group_signal_operations(
$customer_id
,
$audience_id
)};
my
$mutate_google_ads_response
=
$api_client
->GoogleAdsService()->mutate({
customerId
=>
$customer_id
,
mutateOperations
=>
$operations
});
print_response_details(
$mutate_google_ads_response
);
return
1;
}
sub
create_campaign_budget_operation {
my
(
$customer_id
) =
@_
;
return
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
campaignBudgetOperation
=>
Google::Ads::GoogleAds::V12::Services::CampaignBudgetService::CampaignBudgetOperation
->new({
create
=> Google::Ads::GoogleAds::V12::Resources::CampaignBudget->new(
{
resourceName
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::campaign_budget(
$customer_id
, BUDGET_TEMPORARY_ID
),
name
=>
"Performance Max campaign budget #"
. uniqid(),
amountMicros
=> 50000000,
deliveryMethod
=> STANDARD,
explicitlyShared
=>
"false"
,
})})});
}
sub
create_performance_max_campaign_operation {
my
(
$customer_id
) =
@_
;
return
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
campaignOperation
=>
Google::Ads::GoogleAds::V12::Services::CampaignService::CampaignOperation
->new({
create
=> Google::Ads::GoogleAds::V12::Resources::Campaign->new({
resourceName
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::campaign(
$customer_id
, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID
),
name
=>
"Performance Max campaign #"
. uniqid(),
campaignBudget
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::campaign_budget(
$customer_id
, BUDGET_TEMPORARY_ID
),
status
=>
Google::Ads::GoogleAds::V12::Enums::CampaignStatusEnum::PAUSED,
advertisingChannelType
=> PERFORMANCE_MAX,
maximizeConversionValue
=>
Google::Ads::GoogleAds::V12::Common::MaximizeConversionValue->
new({
targetRoas
=> 3.5
}
),
urlExpansionOptOut
=>
"false"
,
startDate
=> strftime(
"%Y%m%d"
,
localtime
(
time
+ 60 * 60 * 24)),
endDate
=>
strftime(
"%Y%m%d"
,
localtime
(
time
+ 60 * 60 * 24 * 365)),
})})});
}
sub
create_campaign_criterion_operations {
my
(
$customer_id
) =
@_
;
my
$operations
= [];
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
campaignCriterionOperation
=>
Google::Ads::GoogleAds::V12::Services::CampaignCriterionService::CampaignCriterionOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::CampaignCriterion->new({
campaign
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::campaign(
$customer_id
, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID
),
location
=>
Google::Ads::GoogleAds::V12::Common::LocationInfo->new({
geoTargetConstant
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::geo_target_constant(
1023191)}
),
negative
=>
"false"
})})});
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
campaignCriterionOperation
=>
Google::Ads::GoogleAds::V12::Services::CampaignCriterionService::CampaignCriterionOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::CampaignCriterion->new({
campaign
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::campaign(
$customer_id
, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID
),
location
=>
Google::Ads::GoogleAds::V12::Common::LocationInfo->new({
geoTargetConstant
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::geo_target_constant(
1022762)}
),
negative
=>
"true"
})})});
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
campaignCriterionOperation
=>
Google::Ads::GoogleAds::V12::Services::CampaignCriterionService::CampaignCriterionOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::CampaignCriterion->new({
campaign
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::campaign(
$customer_id
, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID
),
language
=>
Google::Ads::GoogleAds::V12::Common::LanguageInfo->new({
languageConstant
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::language_constant(
1000)
})})})});
return
$operations
;
}
sub
create_multiple_text_assets {
my
(
$api_client
,
$customer_id
,
$texts
) =
@_
;
my
$operations
= [];
foreach
my
$text
(
@$texts
) {
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation
->new({
assetOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetService::AssetOperation->
new({
create
=> Google::Ads::GoogleAds::V12::Resources::Asset->new({
textAsset
=>
Google::Ads::GoogleAds::V12::Common::TextAsset->new({
text
=>
$text
})})})});
}
my
$mutate_google_ads_response
=
$api_client
->GoogleAdsService()->mutate({
customerId
=>
$customer_id
,
mutateOperations
=>
$operations
});
my
$asset_resource_names
= [];
foreach
my
$response
(@{
$mutate_google_ads_response
->{mutateOperationResponses}})
{
push
@$asset_resource_names
,
$response
->{assetResult}{resourceName};
}
print_response_details(
$mutate_google_ads_response
);
return
$asset_resource_names
;
}
sub
create_asset_group_operations {
my
(
$customer_id
,
$headline_asset_resource_names
,
$description_asset_resource_names
) =
@_
;
my
$operations
= [];
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
assetGroupOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetGroupService::AssetGroupOperation
->new({
create
=> Google::Ads::GoogleAds::V12::Resources::AssetGroup->new({
resourceName
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset_group(
$customer_id
, ASSET_GROUP_TEMPORARY_ID
),
name
=>
"Performance Max asset group #"
. uniqid(),
campaign
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::campaign(
$customer_id
, PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID
),
status
=>
Google::Ads::GoogleAds::V12::Enums::AssetGroupStatusEnum::PAUSED
})})});
foreach
my
$resource_name
(
@$headline_asset_resource_names
) {
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation
->new({
assetGroupAssetOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetGroupAssetService::AssetGroupAssetOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::AssetGroupAsset->new({
asset
=>
$resource_name
,
assetGroup
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset_group(
$customer_id
, ASSET_GROUP_TEMPORARY_ID
),
fieldType
=> HEADLINE
})})});
}
foreach
my
$resource_name
(
@$description_asset_resource_names
) {
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation
->new({
assetGroupAssetOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetGroupAssetService::AssetGroupAssetOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::AssetGroupAsset->new({
asset
=>
$resource_name
,
assetGroup
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset_group(
$customer_id
, ASSET_GROUP_TEMPORARY_ID
),
fieldType
=> DESCRIPTION
})})});
}
push
@$operations
,
@{create_and_link_text_asset(
$customer_id
,
"Travel the World"
,
LONG_HEADLINE)};
push
@$operations
,
@{
create_and_link_text_asset(
$customer_id
,
"Interplanetary Cruises"
,
BUSINESS_NAME)};
push
@$operations
,
@{
LOGO,
"Marketing Logo"
)};
push
@$operations
,
@{
create_and_link_image_asset(
MARKETING_IMAGE,
"Marketing Image"
)};
push
@$operations
,
@{
create_and_link_image_asset(
SQUARE_MARKETING_IMAGE,
"Square Marketing Image"
)};
return
$operations
;
}
sub
create_and_link_text_asset {
my
(
$customer_id
,
$text
,
$field_type
) =
@_
;
my
$operations
= [];
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
assetOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetService::AssetOperation->
new({
create
=> Google::Ads::GoogleAds::V12::Resources::Asset->new({
resourceName
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset(
$customer_id
,
$next_temp_id
),
textAsset
=> Google::Ads::GoogleAds::V12::Common::TextAsset->new({
text
=>
$text
})})})});
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
assetGroupAssetOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetGroupAssetService::AssetGroupAssetOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::AssetGroupAsset->new({
asset
=> Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset(
$customer_id
,
$next_temp_id
),
assetGroup
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset_group(
$customer_id
, ASSET_GROUP_TEMPORARY_ID
),
fieldType
=>
$field_type
})})});
$next_temp_id
--;
return
$operations
;
}
sub
create_and_link_image_asset {
my
(
$customer_id
,
$url
,
$field_type
,
$asset_name
) =
@_
;
my
$operations
= [];
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
assetOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetService::AssetOperation->
new({
create
=> Google::Ads::GoogleAds::V12::Resources::Asset->new({
resourceName
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset(
$customer_id
,
$next_temp_id
),
name
=>
$asset_name
,
imageAsset
=>
Google::Ads::GoogleAds::V12::Common::ImageAsset->new({
data
=> get_base64_data_from_url(
$url
)})})})});
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
assetGroupAssetOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetGroupAssetService::AssetGroupAssetOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::AssetGroupAsset->new({
asset
=> Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset(
$customer_id
,
$next_temp_id
),
assetGroup
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset_group(
$customer_id
, ASSET_GROUP_TEMPORARY_ID
),
fieldType
=>
$field_type
})})});
$next_temp_id
--;
return
$operations
;
}
sub
create_asset_group_signal_operations {
my
(
$customer_id
,
$audience_id
) =
@_
;
my
$operations
= [];
return
$operations
if
not
defined
$audience_id
;
push
@$operations
,
Google::Ads::GoogleAds::V12::Services::GoogleAdsService::MutateOperation->
new({
assetGroupSignalOperation
=>
Google::Ads::GoogleAds::V12::Services::AssetGroupSignalService::AssetGroupSignalOperation
->new({
create
=>
Google::Ads::GoogleAds::V12::Resources::AssetGroupSignal->new({
assetGroup
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::asset_group(
$customer_id
, ASSET_GROUP_TEMPORARY_ID
),
audience
=>
Google::Ads::GoogleAds::V12::Common::AudienceInfo->new({
audience
=>
Google::Ads::GoogleAds::V12::Utils::ResourceNames::audience(
$customer_id
,
$audience_id
)})})})});
return
$operations
;
}
sub
print_response_details {
my
(
$mutate_google_ads_response
) =
@_
;
foreach
my
$response
(@{
$mutate_google_ads_response
->{mutateOperationResponses}})
{
my
$result_type
= [
keys
%$response
]->[0];
printf
"Created a(n) %s with '%s'.\n"
,
ucfirst
$result_type
=~ s/Result$//r,
$response
->{
$result_type
}{resourceName};
}
}
if
(abs_path($0) ne abs_path(__FILE__)) {
return
1;
}
my
$api_client
= Google::Ads::GoogleAds::Client->new();
$api_client
->set_die_on_faults(1);
GetOptions(
"customer_id=s"
=> \
$customer_id
,
"audience_id=i"
=> \
$audience_id
);
pod2usage(2)
if
not check_params(
$customer_id
);
add_performance_max_campaign(
$api_client
,
$customer_id
=~ s/-//gr,
$audience_id
);