google-adwords-api 0.14.1 → 0.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/ChangeLog +3 -0
- data/examples/v201406/optimization/estimate_keyword_traffic.rb +30 -12
- data/examples/v201409/basic_operations/add_keywords.rb +3 -1
- data/examples/v201409/{advanced_operations → extensions}/add_google_my_business_location_extensions.rb +1 -1
- data/examples/v201409/extensions/add_site_links.rb +167 -0
- data/examples/v201409/{advanced_operations/add_site_links.rb → extensions/add_site_links_using_feeds.rb} +0 -0
- data/examples/v201409/migration/migrate_to_extension_settings.rb +365 -0
- data/examples/v201409/optimization/estimate_keyword_traffic.rb +30 -13
- data/examples/v201502/account_management/create_account.rb +92 -0
- data/examples/v201502/account_management/get_account_changes.rb +143 -0
- data/examples/v201502/account_management/get_account_hierarchy.rb +98 -0
- data/examples/v201502/advanced_operations/add_ad_customizer.rb +277 -0
- data/examples/v201502/advanced_operations/add_ad_group_bid_modifier.rb +105 -0
- data/examples/v201502/advanced_operations/add_click_to_download_ad.rb +137 -0
- data/examples/v201502/advanced_operations/add_text_ad_with_upgraded_urls.rb +137 -0
- data/examples/v201502/advanced_operations/create_and_attach_shared_keyword_set.rb +137 -0
- data/examples/v201502/advanced_operations/find_and_remove_criteria_from_shared_set.rb +171 -0
- data/examples/v201502/advanced_operations/get_ad_group_bid_modifiers.rb +106 -0
- data/examples/v201502/advanced_operations/upload_offline_conversions.rb +117 -0
- data/examples/v201502/advanced_operations/use_shared_bidding_strategy.rb +152 -0
- data/examples/v201502/basic_operations/add_ad_groups.rb +144 -0
- data/examples/v201502/basic_operations/add_campaigns.rb +143 -0
- data/examples/v201502/basic_operations/add_keywords.rb +118 -0
- data/examples/v201502/basic_operations/add_text_ads.rb +113 -0
- data/examples/v201502/basic_operations/get_ad_groups.rb +106 -0
- data/examples/v201502/basic_operations/get_campaigns.rb +101 -0
- data/examples/v201502/basic_operations/get_campaigns_with_awql.rb +93 -0
- data/examples/v201502/basic_operations/get_keywords.rb +112 -0
- data/examples/v201502/basic_operations/get_text_ads.rb +114 -0
- data/examples/v201502/basic_operations/pause_ad.rb +92 -0
- data/examples/v201502/basic_operations/remove_ad.rb +93 -0
- data/examples/v201502/basic_operations/remove_ad_group.rb +89 -0
- data/examples/v201502/basic_operations/remove_campaign.rb +91 -0
- data/examples/v201502/basic_operations/remove_keyword.rb +98 -0
- data/examples/v201502/basic_operations/update_ad_group.rb +89 -0
- data/examples/v201502/basic_operations/update_campaign.rb +90 -0
- data/examples/v201502/basic_operations/update_keyword.rb +110 -0
- data/examples/v201502/campaign_management/add_campaign_labels.rb +86 -0
- data/examples/v201502/campaign_management/add_experiment.rb +166 -0
- data/examples/v201502/campaign_management/add_keywords_in_bulk.rb +158 -0
- data/examples/v201502/campaign_management/add_location_extension.rb +125 -0
- data/examples/v201502/campaign_management/get_all_disapproved_ads.rb +101 -0
- data/examples/v201502/campaign_management/get_all_disapproved_ads_with_awql.rb +93 -0
- data/examples/v201502/campaign_management/get_campaigns_by_label.rb +112 -0
- data/examples/v201502/campaign_management/promote_experiment.rb +85 -0
- data/examples/v201502/campaign_management/set_ad_parameters.rb +122 -0
- data/examples/v201502/campaign_management/set_criterion_bid_modifier.rb +108 -0
- data/examples/v201502/campaign_management/validate_text_ad.rb +114 -0
- data/examples/v201502/error_handling/handle_captcha_challenge.rb +93 -0
- data/examples/v201502/error_handling/handle_partial_failures.rb +134 -0
- data/examples/v201502/error_handling/handle_policy_violation_error.rb +145 -0
- data/examples/v201502/error_handling/handle_two_factor_authorization_error.rb +88 -0
- data/examples/v201502/extensions/add_google_my_business_location_extensions.rb +183 -0
- data/examples/v201502/extensions/add_site_links.rb +167 -0
- data/examples/v201502/extensions/add_site_links_using_feeds.rb +306 -0
- data/examples/v201502/migration/migrate_to_extension_settings.rb +365 -0
- data/examples/v201502/migration/upgrade_ad_url.rb +97 -0
- data/examples/v201502/misc/create_ad_words_session_without_properties_file.rb +94 -0
- data/examples/v201502/misc/get_all_images_and_videos.rb +108 -0
- data/examples/v201502/misc/setup_oauth2.rb +88 -0
- data/examples/v201502/misc/upload_image.rb +97 -0
- data/examples/v201502/misc/use_oauth2_jwt.rb +97 -0
- data/examples/v201502/optimization/estimate_keyword_traffic.rb +155 -0
- data/examples/v201502/optimization/get_keyword_bid_simulations.rb +99 -0
- data/examples/v201502/optimization/get_keyword_ideas.rb +130 -0
- data/examples/v201502/remarketing/add_audience.rb +122 -0
- data/examples/v201502/remarketing/add_conversion_tracker.rb +105 -0
- data/examples/v201502/remarketing/add_rule_based_user_lists.rb +171 -0
- data/examples/v201502/reporting/download_criteria_report.rb +87 -0
- data/examples/v201502/reporting/download_criteria_report_with_awql.rb +86 -0
- data/examples/v201502/reporting/get_report_fields.rb +79 -0
- data/examples/v201502/reporting/parallel_report_download.rb +168 -0
- data/examples/v201502/shopping_campaigns/add_product_partition_tree.rb +269 -0
- data/examples/v201502/shopping_campaigns/add_product_scope.rb +133 -0
- data/examples/v201502/shopping_campaigns/add_shopping_campaign.rb +133 -0
- data/examples/v201502/shopping_campaigns/get_product_category_taxonomy.rb +117 -0
- data/examples/v201502/targeting/add_campaign_targeting_criteria.rb +173 -0
- data/examples/v201502/targeting/add_demographic_targeting_criteria.rb +116 -0
- data/examples/v201502/targeting/get_campaign_targeting_criteria.rb +110 -0
- data/examples/v201502/targeting/get_targetable_languages_and_carriers.rb +94 -0
- data/examples/v201502/targeting/lookup_location.rb +112 -0
- data/lib/adwords_api/api_config.rb +98 -4
- data/lib/adwords_api/v201409/ad_customizer_feed_service.rb +38 -0
- data/lib/adwords_api/v201409/ad_customizer_feed_service_registry.rb +46 -0
- data/lib/adwords_api/v201409/ad_group_extension_setting_service.rb +42 -0
- data/lib/adwords_api/v201409/ad_group_extension_setting_service_registry.rb +46 -0
- data/lib/adwords_api/v201409/campaign_extension_setting_service.rb +42 -0
- data/lib/adwords_api/v201409/campaign_extension_setting_service_registry.rb +46 -0
- data/lib/adwords_api/v201409/customer_extension_setting_service.rb +42 -0
- data/lib/adwords_api/v201409/customer_extension_setting_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/account_label_service.rb +38 -0
- data/lib/adwords_api/v201502/account_label_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_customizer_feed_service.rb +38 -0
- data/lib/adwords_api/v201502/ad_customizer_feed_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_ad_service.rb +50 -0
- data/lib/adwords_api/v201502/ad_group_ad_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_bid_modifier_service.rb +42 -0
- data/lib/adwords_api/v201502/ad_group_bid_modifier_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_criterion_service.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_criterion_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_extension_setting_service.rb +42 -0
- data/lib/adwords_api/v201502/ad_group_extension_setting_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_feed_service.rb +42 -0
- data/lib/adwords_api/v201502/ad_group_feed_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_service.rb +46 -0
- data/lib/adwords_api/v201502/ad_group_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/ad_param_service.rb +38 -0
- data/lib/adwords_api/v201502/ad_param_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/adwords_user_list_service.rb +38 -0
- data/lib/adwords_api/v201502/adwords_user_list_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/bidding_strategy_service.rb +42 -0
- data/lib/adwords_api/v201502/bidding_strategy_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/budget_order_service.rb +42 -0
- data/lib/adwords_api/v201502/budget_order_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/budget_service.rb +42 -0
- data/lib/adwords_api/v201502/budget_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/campaign_criterion_service.rb +42 -0
- data/lib/adwords_api/v201502/campaign_criterion_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/campaign_extension_setting_service.rb +42 -0
- data/lib/adwords_api/v201502/campaign_extension_setting_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/campaign_feed_service.rb +42 -0
- data/lib/adwords_api/v201502/campaign_feed_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/campaign_service.rb +46 -0
- data/lib/adwords_api/v201502/campaign_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/campaign_shared_set_service.rb +38 -0
- data/lib/adwords_api/v201502/campaign_shared_set_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/constant_data_service.rb +66 -0
- data/lib/adwords_api/v201502/constant_data_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/conversion_tracker_service.rb +42 -0
- data/lib/adwords_api/v201502/conversion_tracker_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/customer_extension_setting_service.rb +42 -0
- data/lib/adwords_api/v201502/customer_extension_setting_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/customer_feed_service.rb +42 -0
- data/lib/adwords_api/v201502/customer_feed_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/customer_service.rb +38 -0
- data/lib/adwords_api/v201502/customer_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/customer_sync_service.rb +34 -0
- data/lib/adwords_api/v201502/customer_sync_service_registry.rb +47 -0
- data/lib/adwords_api/v201502/data_service.rb +54 -0
- data/lib/adwords_api/v201502/data_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/experiment_service.rb +38 -0
- data/lib/adwords_api/v201502/experiment_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/feed_item_service.rb +42 -0
- data/lib/adwords_api/v201502/feed_item_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/feed_mapping_service.rb +42 -0
- data/lib/adwords_api/v201502/feed_mapping_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/feed_service.rb +42 -0
- data/lib/adwords_api/v201502/feed_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/geo_location_service.rb +34 -0
- data/lib/adwords_api/v201502/geo_location_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/label_service.rb +42 -0
- data/lib/adwords_api/v201502/label_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/location_criterion_service.rb +38 -0
- data/lib/adwords_api/v201502/location_criterion_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/managed_customer_service.rb +54 -0
- data/lib/adwords_api/v201502/managed_customer_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/media_service.rb +42 -0
- data/lib/adwords_api/v201502/media_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/mutate_job_service.rb +42 -0
- data/lib/adwords_api/v201502/mutate_job_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/offline_conversion_feed_service.rb +34 -0
- data/lib/adwords_api/v201502/offline_conversion_feed_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/report_definition_service.rb +34 -0
- data/lib/adwords_api/v201502/report_definition_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/shared_criterion_service.rb +38 -0
- data/lib/adwords_api/v201502/shared_criterion_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/shared_set_service.rb +38 -0
- data/lib/adwords_api/v201502/shared_set_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/targeting_idea_service.rb +34 -0
- data/lib/adwords_api/v201502/targeting_idea_service_registry.rb +46 -0
- data/lib/adwords_api/v201502/traffic_estimator_service.rb +34 -0
- data/lib/adwords_api/v201502/traffic_estimator_service_registry.rb +46 -0
- data/lib/adwords_api/version.rb +1 -1
- data/test/adwords_api/test_adwords_api.rb +1 -12
- data/test/templates/v201406/basic_operations_get_campaigns.def +1 -1
- data/test/templates/v201406/misc_use_oauth2_jwt.def +1 -1
- data/test/templates/v201409/basic_operations_get_campaigns.def +1 -1
- data/test/templates/v201409/misc_use_oauth2_jwt.def +1 -1
- data/test/templates/v201502/basic_operations_get_campaigns.def +114 -0
- data/test/templates/v201502/misc_use_oauth2_jwt.def +131 -0
- metadata +173 -8
- data/examples/v201406/advanced_operations/update_site_links.rb +0 -194
- data/examples/v201409/advanced_operations/update_site_links.rb +0 -194
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# Encoding: utf-8
|
|
3
|
-
#
|
|
4
|
-
# Author:: api.mcloonan@gmail.com (Michael Cloonan)
|
|
5
|
-
#
|
|
6
|
-
# Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
|
|
7
|
-
#
|
|
8
|
-
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
-
# you may not use this file except in compliance with the License.
|
|
10
|
-
# You may obtain a copy of the License at
|
|
11
|
-
#
|
|
12
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
-
#
|
|
14
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
17
|
-
# implied.
|
|
18
|
-
# See the License for the specific language governing permissions and
|
|
19
|
-
# limitations under the License.
|
|
20
|
-
#
|
|
21
|
-
# This example updates an existing sitelinks feed as follows:
|
|
22
|
-
# * Adds FeedItemAttributes for line 1 and line 2 descriptions to the Feed
|
|
23
|
-
# * Populates the new FeedItemAttributes on FeedItems in the Feed
|
|
24
|
-
# * Replaces the Feed's existing FeedMapping with one that contains the new
|
|
25
|
-
# set of FeedItemAttributes
|
|
26
|
-
#
|
|
27
|
-
# The end result of this is that any campaign or ad group whose CampaignFeed
|
|
28
|
-
# or AdGroupFeed points to the Feed's ID will now serve line 1 and line 2
|
|
29
|
-
# descriptions in its sitelinks.
|
|
30
|
-
#
|
|
31
|
-
# Tags: FeedItemService.mutate
|
|
32
|
-
# Tags: FeedMappingService.mutate, FeedService.mutate
|
|
33
|
-
|
|
34
|
-
require 'adwords_api'
|
|
35
|
-
|
|
36
|
-
def update_site_links(feed_id, feed_item_descriptions)
|
|
37
|
-
# AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
|
|
38
|
-
# when called without parameters.
|
|
39
|
-
adwords = AdwordsApi::Api.new
|
|
40
|
-
|
|
41
|
-
# To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
|
|
42
|
-
# the configuration file or provide your own logger:
|
|
43
|
-
# adwords.logger = Logger.new('adwords_xml.log')
|
|
44
|
-
|
|
45
|
-
feed_srv = adwords.service(:FeedService, API_VERSION)
|
|
46
|
-
feed_item_srv = adwords.service(:FeedItemService, API_VERSION)
|
|
47
|
-
feed_mapping_srv = adwords.service(:FeedMappingService, API_VERSION)
|
|
48
|
-
|
|
49
|
-
feed_selector = {
|
|
50
|
-
:fields => ['Id', 'Attributes'],
|
|
51
|
-
:predicates => [
|
|
52
|
-
{:field => 'Id', :operator => 'EQUALS', :values => [feed_id]}
|
|
53
|
-
]
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
feed = feed_srv.get(feed_selector)[:entries][0]
|
|
57
|
-
|
|
58
|
-
# Add new line1 and line2 feed attributes.
|
|
59
|
-
next_attribute_index = feed[:attributes].length()
|
|
60
|
-
|
|
61
|
-
feed[:attributes] = [
|
|
62
|
-
{:type => 'STRING', :name => 'Line 1 Description'},
|
|
63
|
-
{:type => 'STRING', :name => 'Line 2 Description'}
|
|
64
|
-
]
|
|
65
|
-
|
|
66
|
-
mutated_feed_result = feed_srv.mutate([
|
|
67
|
-
{:operator => 'SET', :operand => feed}
|
|
68
|
-
])
|
|
69
|
-
|
|
70
|
-
mutated_feed = mutated_feed_result[:value][0]
|
|
71
|
-
line_1_attribute = mutated_feed[:attributes][next_attribute_index]
|
|
72
|
-
line_2_attribute = mutated_feed[:attributes][next_attribute_index + 1]
|
|
73
|
-
|
|
74
|
-
# Update feed items.
|
|
75
|
-
feed_item_ids = feed_item_descriptions.keys
|
|
76
|
-
item_selector = {
|
|
77
|
-
:fields => ['FeedId', 'FeedItemId', 'AttributeValues'],
|
|
78
|
-
:predicates => [
|
|
79
|
-
{:field => 'FeedId', :operator => 'EQUALS', :values => [feed_id]},
|
|
80
|
-
{:field => 'FeedItemId', :operator => 'IN', :values => feed_item_ids}
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
feed_items = feed_item_srv.get(item_selector)[:entries]
|
|
85
|
-
|
|
86
|
-
item_operations = feed_items.map do |feed_item|
|
|
87
|
-
feed_item[:attribute_values] = [
|
|
88
|
-
{
|
|
89
|
-
:feed_attribute_id => line_1_attribute[:id],
|
|
90
|
-
:string_value => feed_item_descriptions[feed_item[:feed_item_id]][0]
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
:feed_attribute_id => line_2_attribute[:id],
|
|
94
|
-
:string_value => feed_item_descriptions[feed_item[:feed_item_id]][1]
|
|
95
|
-
}
|
|
96
|
-
]
|
|
97
|
-
|
|
98
|
-
{:operator => 'SET', :operand => feed_item}
|
|
99
|
-
end
|
|
100
|
-
items_update_result = feed_item_srv.mutate(item_operations)
|
|
101
|
-
puts 'Updated %d items' % items_update_result[:value].length
|
|
102
|
-
|
|
103
|
-
# Update feed mapping.
|
|
104
|
-
mapping_selector = {
|
|
105
|
-
:fields => [
|
|
106
|
-
'FeedId',
|
|
107
|
-
'FeedMappingId',
|
|
108
|
-
'PlaceholderType',
|
|
109
|
-
'AttributeFieldMappings'
|
|
110
|
-
],
|
|
111
|
-
:predicates => [
|
|
112
|
-
{:field => 'FeedId', :operator => 'EQUALS', :values => [feed_id]}
|
|
113
|
-
]
|
|
114
|
-
}
|
|
115
|
-
feed_mapping_results = feed_mapping_srv.get(mapping_selector)
|
|
116
|
-
feed_mapping = feed_mapping_results[:entries][0]
|
|
117
|
-
|
|
118
|
-
# Feed mappings are immutable, so we have to delete it and re-add
|
|
119
|
-
# it with modifications.
|
|
120
|
-
feed_mapping_srv.mutate([
|
|
121
|
-
{:operator => 'REMOVE', :operand => feed_mapping}
|
|
122
|
-
])[:value][0]
|
|
123
|
-
|
|
124
|
-
feed_mapping[:attribute_field_mappings].push(
|
|
125
|
-
{
|
|
126
|
-
:feed_attribute_id => line_1_attribute[:id],
|
|
127
|
-
:field_id => PLACEHOLDER_FIELD_LINE_1_TEXT
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
:feed_attribute_id => line_2_attribute[:id],
|
|
131
|
-
:field_id => PLACEHOLDER_FIELD_LINE_2_TEXT
|
|
132
|
-
}
|
|
133
|
-
)
|
|
134
|
-
mapping_update_result = feed_mapping_srv.mutate([
|
|
135
|
-
{:operator => 'ADD', :operand => feed_mapping}
|
|
136
|
-
])
|
|
137
|
-
|
|
138
|
-
mutated_mapping = mapping_update_result[:value][0]
|
|
139
|
-
puts 'Updated field mappings for feedId %d and feedMappingId %d to:' %
|
|
140
|
-
[mutated_mapping[:feed_id], mutated_mapping[:feed_mapping_id]]
|
|
141
|
-
mutated_mapping[:attribute_field_mappings].each do |field_mapping|
|
|
142
|
-
puts "\tfeedAttributeId %d --> fieldId %d" %
|
|
143
|
-
[field_mapping[:feed_attribute_id], field_mapping[:field_id]]
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
if __FILE__ == $0
|
|
148
|
-
API_VERSION = :v201406
|
|
149
|
-
|
|
150
|
-
# See the Placeholder reference page for a list of all the placeholder types
|
|
151
|
-
# and fields:
|
|
152
|
-
# https://developers.google.com/adwords/api/docs/appendix/placeholders
|
|
153
|
-
PLACEHOLDER_FIELD_LINE_1_TEXT = 3
|
|
154
|
-
PLACEHOLDER_FIELD_LINE_2_TEXT = 4
|
|
155
|
-
|
|
156
|
-
begin
|
|
157
|
-
feed_id = 'INSERT_FEED_ID_HERE'.to_i
|
|
158
|
-
feed_item_descriptions = {
|
|
159
|
-
'INSERT_FEED_ITEM_A_ID_HERE'.to_i => [
|
|
160
|
-
'INSERT_FEED_ITEM_A_LINE1_DESC_HERE',
|
|
161
|
-
'INSERT_FEED_ITEM_A_LINE2_DESC_HERE'
|
|
162
|
-
],
|
|
163
|
-
'INSERT_FEED_ITEM_B_ID_HERE'.to_i => [
|
|
164
|
-
'INSERT_FEED_ITEM_B_LINE1_DESC_HERE',
|
|
165
|
-
'INSERT_FEED_ITEM_B_LINE2_DESC_HERE'
|
|
166
|
-
]
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
update_site_links(feed_id, feed_item_descriptions)
|
|
170
|
-
|
|
171
|
-
# Authorization error.
|
|
172
|
-
rescue AdsCommon::Errors::OAuth2VerificationRequired => e
|
|
173
|
-
puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
|
|
174
|
-
"OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
|
|
175
|
-
"to retrieve and store OAuth2 tokens."
|
|
176
|
-
puts "See this wiki page for more details:\n\n " +
|
|
177
|
-
'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
|
|
178
|
-
|
|
179
|
-
# HTTP errors.
|
|
180
|
-
rescue AdsCommon::Errors::HttpError => e
|
|
181
|
-
puts "HTTP Error: %s" % e
|
|
182
|
-
|
|
183
|
-
# API errors.
|
|
184
|
-
rescue AdwordsApi::Errors::ApiException => e
|
|
185
|
-
puts "Message: %s" % e.message
|
|
186
|
-
puts 'Errors:'
|
|
187
|
-
e.errors.each_with_index do |error, index|
|
|
188
|
-
puts "\tError [%d]:" % (index + 1)
|
|
189
|
-
error.each do |field, value|
|
|
190
|
-
puts "\t\t%s: %s" % [field, value]
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
end
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# Encoding: utf-8
|
|
3
|
-
#
|
|
4
|
-
# Author:: api.mcloonan@gmail.com (Michael Cloonan)
|
|
5
|
-
#
|
|
6
|
-
# Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
|
|
7
|
-
#
|
|
8
|
-
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
-
# you may not use this file except in compliance with the License.
|
|
10
|
-
# You may obtain a copy of the License at
|
|
11
|
-
#
|
|
12
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
-
#
|
|
14
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
17
|
-
# implied.
|
|
18
|
-
# See the License for the specific language governing permissions and
|
|
19
|
-
# limitations under the License.
|
|
20
|
-
#
|
|
21
|
-
# This example updates an existing sitelinks feed as follows:
|
|
22
|
-
# * Adds FeedItemAttributes for line 1 and line 2 descriptions to the Feed
|
|
23
|
-
# * Populates the new FeedItemAttributes on FeedItems in the Feed
|
|
24
|
-
# * Replaces the Feed's existing FeedMapping with one that contains the new
|
|
25
|
-
# set of FeedItemAttributes
|
|
26
|
-
#
|
|
27
|
-
# The end result of this is that any campaign or ad group whose CampaignFeed
|
|
28
|
-
# or AdGroupFeed points to the Feed's ID will now serve line 1 and line 2
|
|
29
|
-
# descriptions in its sitelinks.
|
|
30
|
-
#
|
|
31
|
-
# Tags: FeedItemService.mutate
|
|
32
|
-
# Tags: FeedMappingService.mutate, FeedService.mutate
|
|
33
|
-
|
|
34
|
-
require 'adwords_api'
|
|
35
|
-
|
|
36
|
-
def update_site_links(feed_id, feed_item_descriptions)
|
|
37
|
-
# AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
|
|
38
|
-
# when called without parameters.
|
|
39
|
-
adwords = AdwordsApi::Api.new
|
|
40
|
-
|
|
41
|
-
# To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
|
|
42
|
-
# the configuration file or provide your own logger:
|
|
43
|
-
# adwords.logger = Logger.new('adwords_xml.log')
|
|
44
|
-
|
|
45
|
-
feed_srv = adwords.service(:FeedService, API_VERSION)
|
|
46
|
-
feed_item_srv = adwords.service(:FeedItemService, API_VERSION)
|
|
47
|
-
feed_mapping_srv = adwords.service(:FeedMappingService, API_VERSION)
|
|
48
|
-
|
|
49
|
-
feed_selector = {
|
|
50
|
-
:fields => ['Id', 'Attributes'],
|
|
51
|
-
:predicates => [
|
|
52
|
-
{:field => 'Id', :operator => 'EQUALS', :values => [feed_id]}
|
|
53
|
-
]
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
feed = feed_srv.get(feed_selector)[:entries][0]
|
|
57
|
-
|
|
58
|
-
# Add new line1 and line2 feed attributes.
|
|
59
|
-
next_attribute_index = feed[:attributes].length()
|
|
60
|
-
|
|
61
|
-
feed[:attributes] = [
|
|
62
|
-
{:type => 'STRING', :name => 'Line 1 Description'},
|
|
63
|
-
{:type => 'STRING', :name => 'Line 2 Description'}
|
|
64
|
-
]
|
|
65
|
-
|
|
66
|
-
mutated_feed_result = feed_srv.mutate([
|
|
67
|
-
{:operator => 'SET', :operand => feed}
|
|
68
|
-
])
|
|
69
|
-
|
|
70
|
-
mutated_feed = mutated_feed_result[:value][0]
|
|
71
|
-
line_1_attribute = mutated_feed[:attributes][next_attribute_index]
|
|
72
|
-
line_2_attribute = mutated_feed[:attributes][next_attribute_index + 1]
|
|
73
|
-
|
|
74
|
-
# Update feed items.
|
|
75
|
-
feed_item_ids = feed_item_descriptions.keys
|
|
76
|
-
item_selector = {
|
|
77
|
-
:fields => ['FeedId', 'FeedItemId', 'AttributeValues'],
|
|
78
|
-
:predicates => [
|
|
79
|
-
{:field => 'FeedId', :operator => 'EQUALS', :values => [feed_id]},
|
|
80
|
-
{:field => 'FeedItemId', :operator => 'IN', :values => feed_item_ids}
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
feed_items = feed_item_srv.get(item_selector)[:entries]
|
|
85
|
-
|
|
86
|
-
item_operations = feed_items.map do |feed_item|
|
|
87
|
-
feed_item[:attribute_values] = [
|
|
88
|
-
{
|
|
89
|
-
:feed_attribute_id => line_1_attribute[:id],
|
|
90
|
-
:string_value => feed_item_descriptions[feed_item[:feed_item_id]][0]
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
:feed_attribute_id => line_2_attribute[:id],
|
|
94
|
-
:string_value => feed_item_descriptions[feed_item[:feed_item_id]][1]
|
|
95
|
-
}
|
|
96
|
-
]
|
|
97
|
-
|
|
98
|
-
{:operator => 'SET', :operand => feed_item}
|
|
99
|
-
end
|
|
100
|
-
items_update_result = feed_item_srv.mutate(item_operations)
|
|
101
|
-
puts 'Updated %d items' % items_update_result[:value].length
|
|
102
|
-
|
|
103
|
-
# Update feed mapping.
|
|
104
|
-
mapping_selector = {
|
|
105
|
-
:fields => [
|
|
106
|
-
'FeedId',
|
|
107
|
-
'FeedMappingId',
|
|
108
|
-
'PlaceholderType',
|
|
109
|
-
'AttributeFieldMappings'
|
|
110
|
-
],
|
|
111
|
-
:predicates => [
|
|
112
|
-
{:field => 'FeedId', :operator => 'EQUALS', :values => [feed_id]}
|
|
113
|
-
]
|
|
114
|
-
}
|
|
115
|
-
feed_mapping_results = feed_mapping_srv.get(mapping_selector)
|
|
116
|
-
feed_mapping = feed_mapping_results[:entries][0]
|
|
117
|
-
|
|
118
|
-
# Feed mappings are immutable, so we have to delete it and re-add
|
|
119
|
-
# it with modifications.
|
|
120
|
-
feed_mapping_srv.mutate([
|
|
121
|
-
{:operator => 'REMOVE', :operand => feed_mapping}
|
|
122
|
-
])[:value][0]
|
|
123
|
-
|
|
124
|
-
feed_mapping[:attribute_field_mappings].push(
|
|
125
|
-
{
|
|
126
|
-
:feed_attribute_id => line_1_attribute[:id],
|
|
127
|
-
:field_id => PLACEHOLDER_FIELD_LINE_1_TEXT
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
:feed_attribute_id => line_2_attribute[:id],
|
|
131
|
-
:field_id => PLACEHOLDER_FIELD_LINE_2_TEXT
|
|
132
|
-
}
|
|
133
|
-
)
|
|
134
|
-
mapping_update_result = feed_mapping_srv.mutate([
|
|
135
|
-
{:operator => 'ADD', :operand => feed_mapping}
|
|
136
|
-
])
|
|
137
|
-
|
|
138
|
-
mutated_mapping = mapping_update_result[:value][0]
|
|
139
|
-
puts 'Updated field mappings for feedId %d and feedMappingId %d to:' %
|
|
140
|
-
[mutated_mapping[:feed_id], mutated_mapping[:feed_mapping_id]]
|
|
141
|
-
mutated_mapping[:attribute_field_mappings].each do |field_mapping|
|
|
142
|
-
puts "\tfeedAttributeId %d --> fieldId %d" %
|
|
143
|
-
[field_mapping[:feed_attribute_id], field_mapping[:field_id]]
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
if __FILE__ == $0
|
|
148
|
-
API_VERSION = :v201409
|
|
149
|
-
|
|
150
|
-
# See the Placeholder reference page for a list of all the placeholder types
|
|
151
|
-
# and fields:
|
|
152
|
-
# https://developers.google.com/adwords/api/docs/appendix/placeholders
|
|
153
|
-
PLACEHOLDER_FIELD_LINE_1_TEXT = 3
|
|
154
|
-
PLACEHOLDER_FIELD_LINE_2_TEXT = 4
|
|
155
|
-
|
|
156
|
-
begin
|
|
157
|
-
feed_id = 'INSERT_FEED_ID_HERE'.to_i
|
|
158
|
-
feed_item_descriptions = {
|
|
159
|
-
'INSERT_FEED_ITEM_A_ID_HERE'.to_i => [
|
|
160
|
-
'INSERT_FEED_ITEM_A_LINE1_DESC_HERE',
|
|
161
|
-
'INSERT_FEED_ITEM_A_LINE2_DESC_HERE'
|
|
162
|
-
],
|
|
163
|
-
'INSERT_FEED_ITEM_B_ID_HERE'.to_i => [
|
|
164
|
-
'INSERT_FEED_ITEM_B_LINE1_DESC_HERE',
|
|
165
|
-
'INSERT_FEED_ITEM_B_LINE2_DESC_HERE'
|
|
166
|
-
]
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
update_site_links(feed_id, feed_item_descriptions)
|
|
170
|
-
|
|
171
|
-
# Authorization error.
|
|
172
|
-
rescue AdsCommon::Errors::OAuth2VerificationRequired => e
|
|
173
|
-
puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
|
|
174
|
-
"OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
|
|
175
|
-
"to retrieve and store OAuth2 tokens."
|
|
176
|
-
puts "See this wiki page for more details:\n\n " +
|
|
177
|
-
'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
|
|
178
|
-
|
|
179
|
-
# HTTP errors.
|
|
180
|
-
rescue AdsCommon::Errors::HttpError => e
|
|
181
|
-
puts "HTTP Error: %s" % e
|
|
182
|
-
|
|
183
|
-
# API errors.
|
|
184
|
-
rescue AdwordsApi::Errors::ApiException => e
|
|
185
|
-
puts "Message: %s" % e.message
|
|
186
|
-
puts 'Errors:'
|
|
187
|
-
e.errors.each_with_index do |error, index|
|
|
188
|
-
puts "\tError [%d]:" % (index + 1)
|
|
189
|
-
error.each do |field, value|
|
|
190
|
-
puts "\t\t%s: %s" % [field, value]
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
end
|