#!/usr/bin/perl -w
use
lib
"$Bin/../../lib"
;
qw(CREATE UPDATE)
;
qw(AD AD_GROUP AD_GROUP_AD AD_GROUP_ASSET AD_GROUP_CRITERION AD_GROUP_BID_MODIFIER ASSET ASSET_SET ASSET_SET_ASSET CAMPAIGN CAMPAIGN_ASSET CAMPAIGN_ASSET_SET CAMPAIGN_BUDGET CAMPAIGN_CRITERION AD_GROUP_FEED CAMPAIGN_FEED CUSTOMER_ASSET FEED FEED_ITEM)
;
use
Google::Ads::GoogleAds::V13::Services::GoogleAdsService::SearchGoogleAdsRequest;
my
$customer_id
=
"INSERT_CUSTOMER_ID_HERE"
;
sub
get_change_details {
my
(
$api_client
,
$customer_id
) =
@_
;
my
$search_query
=
"SELECT change_event.resource_name, change_event.change_date_time, "
.
"change_event.change_resource_name, change_event.user_email, "
.
"change_event.client_type, change_event.change_resource_type, "
.
"change_event.old_resource, change_event.new_resource, "
.
"change_event.resource_change_operation, change_event.changed_fields "
.
"FROM change_event "
.
"WHERE change_event.change_date_time DURING LAST_14_DAYS "
.
"ORDER BY change_event.change_date_time DESC LIMIT 5"
;
my
$search_request
=
Google::Ads::GoogleAds::V13::Services::GoogleAdsService::SearchGoogleAdsRequest
->new({
customerId
=>
$customer_id
,
query
=>
$search_query
,
pageSize
=> PAGE_SIZE
});
my
$google_ads_service
=
$api_client
->GoogleAdsService();
my
$iterator
= Google::Ads::GoogleAds::Utils::SearchGoogleAdsIterator->new({
service
=>
$google_ads_service
,
request
=>
$search_request
});
while
(
$iterator
->has_next) {
my
$google_ads_row
=
$iterator
->
next
;
my
$change_event
=
$google_ads_row
->{changeEvent};
printf
"On %s, user %s used interface %s to perform a(n) %s operation "
.
"on a %s with resource name '%s'.\n"
,
$change_event
->{changeDateTime},
$change_event
->{userEmail},
$change_event
->{clientType},
$change_event
->{resourceChangeOperation},
$change_event
->{changeResourceType},
$change_event
->{changeResourceName};
if
(
grep
/
$change_event
->{resourceChangeOperation}/, (CREATE, UPDATE)) {
my
(
$old_resource
,
$new_resource
) =
_get_changed_resources_for_resource_type(
$change_event
);
foreach
my
$changed_field
(
split
/,/,
$change_event
->{changedFields}) {
my
$new_value
=
_convert_to_string(get_field_value(
$new_resource
,
$changed_field
))
||
""
;
if
(
$change_event
->{resourceChangeOperation} eq CREATE) {
print
"\t$changed_field set to '$new_value'.\n"
;
}
else
{
my
$old_value
=
_convert_to_string(get_field_value(
$old_resource
,
$changed_field
))
||
""
;
print
"\t$changed_field changed from '$old_value' to '$new_value'.\n"
;
}
}
}
}
return
1;
}
sub
_convert_to_string {
my
$value
=
shift
;
my
$string_value
=
""
;
if
(
ref
(
$value
) eq
"ARRAY"
) {
$string_value
.=
"["
;
foreach
my
$item
(
@$value
) {
if
(is_hash_ref(
$item
)) {
$string_value
.= (JSON::XS->new->utf8->encode(
$item
) .
","
);
}
else
{
$string_value
.= (
$item
.
","
);
}
}
$string_value
.=
"]"
;
}
elsif
(is_hash_ref(
$value
)) {
$string_value
.= JSON::XS->new->utf8->encode(
$value
);
}
else
{
$string_value
=
$value
;
}
return
$string_value
;
}
sub
_get_changed_resources_for_resource_type {
my
$change_event
=
shift
;
my
$resource_type
=
$change_event
->{changeResourceType};
if
(
$resource_type
eq AD) {
return
$change_event
->{oldResource}{ad},
$change_event
->{newResource}{ad};
}
elsif
(
$resource_type
eq AD_GROUP) {
return
$change_event
->{oldResource}{adGroup},
$change_event
->{newResource}{adGroup};
}
elsif
(
$resource_type
eq AD_GROUP_AD) {
return
$change_event
->{oldResource}{adGroupAd},
$change_event
->{newResource}{adGroupAd};
}
elsif
(
$resource_type
eq AD_GROUP_ASSET) {
return
$change_event
->{oldResource}{adGroupAsset},
$change_event
->{newResource}{adGroupAsset};
}
elsif
(
$resource_type
eq AD_GROUP_CRITERION) {
return
$change_event
->{oldResource}{adGroupCriterion},
$change_event
->{newResource}{adGroupCriterion};
}
elsif
(
$resource_type
eq AD_GROUP_BID_MODIFIER) {
return
$change_event
->{oldResource}{adGroupBidModifier},
$change_event
->{newResource}{adGroupBidModifier};
}
elsif
(
$resource_type
eq AD_GROUP_FEED) {
return
$change_event
->{oldResource}{adGroupFeed},
$change_event
->{newResource}{adGroupFeed};
}
elsif
(
$resource_type
eq ASSET) {
return
$change_event
->{oldResource}{asset},
$change_event
->{newResource}{asset};
}
elsif
(
$resource_type
eq ASSET_SET) {
return
$change_event
->{oldResource}{assetSet},
$change_event
->{newResource}{assetSet};
}
elsif
(
$resource_type
eq ASSET_SET_ASSET) {
return
$change_event
->{oldResource}{assetSetAsset},
$change_event
->{newResource}{assetSetAsset};
}
elsif
(
$resource_type
eq CAMPAIGN) {
return
$change_event
->{oldResource}{campaign},
$change_event
->{newResource}{campaign};
}
elsif
(
$resource_type
eq CAMPAIGN_ASSET) {
return
$change_event
->{oldResource}{campaignAsset},
$change_event
->{newResource}{campaignAsset};
}
elsif
(
$resource_type
eq CAMPAIGN_ASSET_SET) {
return
$change_event
->{oldResource}{campaignAssetSet},
$change_event
->{newResource}{campaignAssetSet};
}
elsif
(
$resource_type
eq CAMPAIGN_BUDGET) {
return
$change_event
->{oldResource}{campaignBudget},
$change_event
->{newResource}{campaignBudget};
}
elsif
(
$resource_type
eq CAMPAIGN_CRITERION) {
return
$change_event
->{oldResource}{campaignCriterion},
$change_event
->{newResource}{campaignCriterion};
}
elsif
(
$resource_type
eq CAMPAIGN_FEED) {
return
$change_event
->{oldResource}{campaignFeed},
$change_event
->{newResource}{campaignFeed};
}
elsif
(
$resource_type
eq CUSTOMER_ASSET) {
return
$change_event
->{oldResource}{customerAsset},
$change_event
->{newResource}{customerAsset};
}
elsif
(
$resource_type
eq FEED) {
return
$change_event
->{oldResource}{feed},
$change_event
->{newResource}{feed};
}
elsif
(
$resource_type
eq FEED_ITEM) {
return
$change_event
->{oldResource}{feedItem},
$change_event
->{newResource}{feedItem};
}
else
{
print
"Unknown change_resource_type $resource_type.\n"
;
}
}
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
);
pod2usage(2)
if
not check_params(
$customer_id
);
get_change_details(
$api_client
,
$customer_id
=~ s/-//gr);