#!/usr/bin/perl -w
use
lib
"$Bin/../../lib"
;
use
Google::Ads::GoogleAds::V19::Services::AdGroupCriterionService::AdGroupCriterionOperation;
my
$customer_id
=
"INSERT_CUSTOMER_ID_HERE"
;
my
$ad_group_id
=
"INSERT_AD_GROUP_ID_HERE"
;
my
$keyword_text
=
"medication"
;
sub
handle_keyword_policy_violations {
my
(
$api_client
,
$customer_id
,
$ad_group_id
,
$keyword_text
) =
@_
;
my
$keyword_info
= Google::Ads::GoogleAds::V19::Common::KeywordInfo->new({
text
=>
$keyword_text
,
matchType
=> EXACT
});
my
$ad_group_criterion
=
Google::Ads::GoogleAds::V19::Resources::AdGroupCriterion->new({
adGroup
=> Google::Ads::GoogleAds::V19::Utils::ResourceNames::ad_group(
$customer_id
,
$ad_group_id
),
status
=> ENABLED,
keyword
=>
$keyword_info
});
my
$ad_group_criterion_operation
=
Google::Ads::GoogleAds::V19::Services::AdGroupCriterionService::AdGroupCriterionOperation
->new({
create
=>
$ad_group_criterion
});
my
$response
=
$api_client
->AdGroupCriterionService()->mutate({
customerId
=>
$customer_id
,
operations
=> [
$ad_group_criterion_operation
]});
if
(
$response
->isa(
"Google::Ads::GoogleAds::GoogleAdsException"
)) {
my
$exempt_policy_violation_keys
=
fetch_exempt_policy_violation_keys(
$response
);
if
(
@$exempt_policy_violation_keys
==
@{
$response
->get_google_ads_failure()->{errors}})
{
request_exemption(
$api_client
,
$customer_id
,
$ad_group_criterion_operation
,
$exempt_policy_violation_keys
);
}
else
{
print
"No exemption request is sent because 1) your keyword contained "
.
"some non-exemptible policy violations or 2) there are other "
.
"non-policy related errors thrown.\n"
;
}
}
else
{
printf
"Added a keyword with resource name '%s'.\n"
,
$response
->{results}[0]{resourceName};
}
return
1;
}
sub
fetch_exempt_policy_violation_keys {
my
$google_ads_exception
=
shift
;
my
$exempt_policy_violation_keys
= [];
print
"Google Ads failure details:\n"
;
foreach
my
$error
(@{
$google_ads_exception
->get_google_ads_failure()->{errors}})
{
printf
"\t%s: %s\n"
, [
keys
%{
$error
->{errorCode}}]->[0],
$error
->{message};
if
(
$error
->{details}{policyViolationDetails}) {
my
$policy_violation_details
=
$error
->{details}{policyViolationDetails};
printf
"\tPolicy violation details:\n"
;
printf
"\t\tExternal policy name: '%s'\n"
,
$policy_violation_details
->{externalPolicyName};
printf
"\t\tExternal policy description: '%s'\n"
,
$policy_violation_details
->{externalPolicyDescription};
printf
"\t\tIs exemptible? '%s'\n"
,
$policy_violation_details
->{isExemptible} ?
"yes"
:
"no"
;
if
(
$policy_violation_details
->{isExemptible}
and
$policy_violation_details
->{key})
{
my
$policy_violation_details_key
=
$policy_violation_details
->{key};
push
@$exempt_policy_violation_keys
,
$policy_violation_details_key
;
printf
"\t\tPolicy violation key:\n"
;
printf
"\t\t\tName: '%s'\n"
,
$policy_violation_details_key
->{policyName};
printf
"\t\t\tViolating text: '%s'\n"
,
$policy_violation_details_key
->{violatingText};
}
}
}
return
$exempt_policy_violation_keys
;
}
sub
request_exemption {
my
(
$api_client
,
$customer_id
,
$ad_group_criterion_operation
,
$exempt_policy_violation_keys
)
=
@_
;
print
"Try adding a keyword again by requesting exemption for its "
.
"policy violations.\n"
;
$ad_group_criterion_operation
->{exemptPolicyViolationKeys} =
$exempt_policy_violation_keys
;
my
$ad_group_criteria_response
=
$api_client
->AdGroupCriterionService()->mutate({
customerId
=>
$customer_id
,
operations
=> [
$ad_group_criterion_operation
]});
printf
"Successfully added a keyword with resource name '%s' by requesting "
.
"for policy violation exemption.\n"
,
$ad_group_criteria_response
->{results}[0]{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(0);
GetOptions(
"customer_id=s"
=> \
$customer_id
,
"ad_group_id=i"
=> \
$ad_group_id
,
"keyword_text=s"
=> \
$keyword_text
);
pod2usage(2)
if
not check_params(
$customer_id
,
$ad_group_id
,
$keyword_text
);
handle_keyword_policy_violations(
$api_client
,
$customer_id
=~ s/-//gr,
$ad_group_id
,
$keyword_text
);