google-adwords-api 0.13.2 → 0.14.0

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.
Files changed (163) hide show
  1. checksums.yaml +8 -8
  2. data/ChangeLog +12 -0
  3. data/examples/v201406/advanced_operations/{add_places_location_extensions.rb → add_google_my_business_location_extensions.rb} +24 -15
  4. data/examples/v201409/advanced_operations/{add_places_location_extensions.rb → add_google_my_business_location_extensions.rb} +41 -16
  5. data/examples/v201409/advanced_operations/use_shared_bidding_strategy.rb +1 -13
  6. data/examples/v201409/basic_operations/add_campaigns.rb +0 -10
  7. data/examples/v201409/remarketing/add_audience.rb +0 -1
  8. data/examples/v201409/remarketing/add_rule_based_user_lists.rb +171 -0
  9. data/examples/v201409/shopping_campaigns/add_shopping_campaign.rb +0 -4
  10. data/lib/adwords_api/api_config.rb +0 -78
  11. data/lib/adwords_api/report_header_handler.rb +0 -4
  12. data/lib/adwords_api/report_utils.rb +0 -9
  13. data/lib/adwords_api/version.rb +1 -1
  14. data/test/adwords_api/test_choices.rb +138 -0
  15. data/test/adwords_api/test_report_utils.rb +0 -27
  16. data/test/templates/v201406/basic_operations_get_campaigns.def +1 -1
  17. data/test/templates/v201406/misc_use_oauth2_jwt.def +1 -1
  18. data/test/templates/v201409/basic_operations_get_campaigns.def +1 -1
  19. data/test/templates/v201409/misc_use_oauth2_jwt.def +1 -1
  20. metadata +8 -149
  21. data/examples/v201402/account_management/create_account.rb +0 -95
  22. data/examples/v201402/account_management/get_account_alerts.rb +0 -122
  23. data/examples/v201402/account_management/get_account_changes.rb +0 -145
  24. data/examples/v201402/account_management/get_account_hierarchy.rb +0 -103
  25. data/examples/v201402/advanced_operations/add_ad_group_bid_modifier.rb +0 -105
  26. data/examples/v201402/advanced_operations/add_click_to_download_ad.rb +0 -137
  27. data/examples/v201402/advanced_operations/add_places_location_extensions.rb +0 -159
  28. data/examples/v201402/advanced_operations/add_site_links.rb +0 -306
  29. data/examples/v201402/advanced_operations/get_ad_group_bid_modifiers.rb +0 -106
  30. data/examples/v201402/advanced_operations/update_site_links.rb +0 -194
  31. data/examples/v201402/advanced_operations/upload_offline_conversions.rb +0 -117
  32. data/examples/v201402/advanced_operations/use_shared_bidding_strategy.rb +0 -163
  33. data/examples/v201402/basic_operations/add_ad_groups.rb +0 -142
  34. data/examples/v201402/basic_operations/add_campaigns.rb +0 -153
  35. data/examples/v201402/basic_operations/add_keywords.rb +0 -116
  36. data/examples/v201402/basic_operations/add_text_ads.rb +0 -113
  37. data/examples/v201402/basic_operations/delete_ad.rb +0 -93
  38. data/examples/v201402/basic_operations/delete_ad_group.rb +0 -89
  39. data/examples/v201402/basic_operations/delete_campaign.rb +0 -90
  40. data/examples/v201402/basic_operations/delete_keyword.rb +0 -98
  41. data/examples/v201402/basic_operations/get_ad_groups.rb +0 -106
  42. data/examples/v201402/basic_operations/get_campaigns.rb +0 -101
  43. data/examples/v201402/basic_operations/get_campaigns_with_awql.rb +0 -93
  44. data/examples/v201402/basic_operations/get_keywords.rb +0 -112
  45. data/examples/v201402/basic_operations/get_text_ads.rb +0 -114
  46. data/examples/v201402/basic_operations/pause_ad.rb +0 -92
  47. data/examples/v201402/basic_operations/update_ad_group.rb +0 -89
  48. data/examples/v201402/basic_operations/update_campaign.rb +0 -90
  49. data/examples/v201402/basic_operations/update_keyword.rb +0 -110
  50. data/examples/v201402/campaign_management/add_experiment.rb +0 -166
  51. data/examples/v201402/campaign_management/add_keywords_in_bulk.rb +0 -158
  52. data/examples/v201402/campaign_management/add_location_extension.rb +0 -125
  53. data/examples/v201402/campaign_management/get_all_disapproved_ads.rb +0 -101
  54. data/examples/v201402/campaign_management/get_all_disapproved_ads_with_awql.rb +0 -93
  55. data/examples/v201402/campaign_management/promote_experiment.rb +0 -85
  56. data/examples/v201402/campaign_management/set_ad_parameters.rb +0 -122
  57. data/examples/v201402/campaign_management/set_criterion_bid_modifier.rb +0 -108
  58. data/examples/v201402/campaign_management/validate_text_ad.rb +0 -114
  59. data/examples/v201402/error_handling/handle_captcha_challenge.rb +0 -93
  60. data/examples/v201402/error_handling/handle_partial_failures.rb +0 -134
  61. data/examples/v201402/error_handling/handle_policy_violation_error.rb +0 -145
  62. data/examples/v201402/error_handling/handle_two_factor_authorization_error.rb +0 -88
  63. data/examples/v201402/misc/create_ad_words_session_without_properties_file.rb +0 -94
  64. data/examples/v201402/misc/get_all_images_and_videos.rb +0 -108
  65. data/examples/v201402/misc/setup_oauth2.rb +0 -88
  66. data/examples/v201402/misc/upload_image.rb +0 -97
  67. data/examples/v201402/misc/use_oauth2_jwt.rb +0 -97
  68. data/examples/v201402/optimization/estimate_keyword_traffic.rb +0 -137
  69. data/examples/v201402/optimization/get_keyword_bid_simulations.rb +0 -100
  70. data/examples/v201402/optimization/get_keyword_ideas.rb +0 -130
  71. data/examples/v201402/optimization/get_placement_ideas.rb +0 -112
  72. data/examples/v201402/remarketing/add_audience.rb +0 -123
  73. data/examples/v201402/remarketing/add_conversion_tracker.rb +0 -105
  74. data/examples/v201402/reporting/download_criteria_report.rb +0 -87
  75. data/examples/v201402/reporting/download_criteria_report_with_awql.rb +0 -86
  76. data/examples/v201402/reporting/get_report_fields.rb +0 -79
  77. data/examples/v201402/reporting/parallel_report_download.rb +0 -171
  78. data/examples/v201402/shopping_campaigns/add_product_partition_tree.rb +0 -269
  79. data/examples/v201402/shopping_campaigns/add_product_scope.rb +0 -133
  80. data/examples/v201402/shopping_campaigns/add_shopping_campaign.rb +0 -135
  81. data/examples/v201402/shopping_campaigns/get_product_category_taxonomy.rb +0 -117
  82. data/examples/v201402/shopping_campaigns/set_product_sales_channel.rb +0 -98
  83. data/examples/v201402/targeting/add_campaign_targeting_criteria.rb +0 -157
  84. data/examples/v201402/targeting/add_demographic_targeting_criteria.rb +0 -116
  85. data/examples/v201402/targeting/get_campaign_targeting_criteria.rb +0 -110
  86. data/examples/v201402/targeting/get_targetable_languages_and_carriers.rb +0 -94
  87. data/examples/v201402/targeting/lookup_location.rb +0 -112
  88. data/lib/adwords_api/v201402/ad_group_ad_service.rb +0 -42
  89. data/lib/adwords_api/v201402/ad_group_ad_service_registry.rb +0 -46
  90. data/lib/adwords_api/v201402/ad_group_bid_modifier_service.rb +0 -42
  91. data/lib/adwords_api/v201402/ad_group_bid_modifier_service_registry.rb +0 -46
  92. data/lib/adwords_api/v201402/ad_group_criterion_service.rb +0 -42
  93. data/lib/adwords_api/v201402/ad_group_criterion_service_registry.rb +0 -46
  94. data/lib/adwords_api/v201402/ad_group_feed_service.rb +0 -42
  95. data/lib/adwords_api/v201402/ad_group_feed_service_registry.rb +0 -46
  96. data/lib/adwords_api/v201402/ad_group_service.rb +0 -42
  97. data/lib/adwords_api/v201402/ad_group_service_registry.rb +0 -46
  98. data/lib/adwords_api/v201402/ad_param_service.rb +0 -38
  99. data/lib/adwords_api/v201402/ad_param_service_registry.rb +0 -46
  100. data/lib/adwords_api/v201402/adwords_user_list_service.rb +0 -38
  101. data/lib/adwords_api/v201402/adwords_user_list_service_registry.rb +0 -46
  102. data/lib/adwords_api/v201402/alert_service.rb +0 -34
  103. data/lib/adwords_api/v201402/alert_service_registry.rb +0 -46
  104. data/lib/adwords_api/v201402/bidding_strategy_service.rb +0 -42
  105. data/lib/adwords_api/v201402/bidding_strategy_service_registry.rb +0 -46
  106. data/lib/adwords_api/v201402/budget_order_service.rb +0 -42
  107. data/lib/adwords_api/v201402/budget_order_service_registry.rb +0 -46
  108. data/lib/adwords_api/v201402/budget_service.rb +0 -42
  109. data/lib/adwords_api/v201402/budget_service_registry.rb +0 -46
  110. data/lib/adwords_api/v201402/campaign_ad_extension_service.rb +0 -38
  111. data/lib/adwords_api/v201402/campaign_ad_extension_service_registry.rb +0 -46
  112. data/lib/adwords_api/v201402/campaign_criterion_service.rb +0 -42
  113. data/lib/adwords_api/v201402/campaign_criterion_service_registry.rb +0 -46
  114. data/lib/adwords_api/v201402/campaign_feed_service.rb +0 -42
  115. data/lib/adwords_api/v201402/campaign_feed_service_registry.rb +0 -46
  116. data/lib/adwords_api/v201402/campaign_service.rb +0 -42
  117. data/lib/adwords_api/v201402/campaign_service_registry.rb +0 -46
  118. data/lib/adwords_api/v201402/campaign_shared_set_service.rb +0 -38
  119. data/lib/adwords_api/v201402/campaign_shared_set_service_registry.rb +0 -47
  120. data/lib/adwords_api/v201402/constant_data_service.rb +0 -66
  121. data/lib/adwords_api/v201402/constant_data_service_registry.rb +0 -46
  122. data/lib/adwords_api/v201402/conversion_tracker_service.rb +0 -38
  123. data/lib/adwords_api/v201402/conversion_tracker_service_registry.rb +0 -46
  124. data/lib/adwords_api/v201402/customer_feed_service.rb +0 -42
  125. data/lib/adwords_api/v201402/customer_feed_service_registry.rb +0 -46
  126. data/lib/adwords_api/v201402/customer_service.rb +0 -38
  127. data/lib/adwords_api/v201402/customer_service_registry.rb +0 -46
  128. data/lib/adwords_api/v201402/customer_sync_service.rb +0 -34
  129. data/lib/adwords_api/v201402/customer_sync_service_registry.rb +0 -47
  130. data/lib/adwords_api/v201402/data_service.rb +0 -46
  131. data/lib/adwords_api/v201402/data_service_registry.rb +0 -46
  132. data/lib/adwords_api/v201402/experiment_service.rb +0 -38
  133. data/lib/adwords_api/v201402/experiment_service_registry.rb +0 -46
  134. data/lib/adwords_api/v201402/feed_item_service.rb +0 -42
  135. data/lib/adwords_api/v201402/feed_item_service_registry.rb +0 -46
  136. data/lib/adwords_api/v201402/feed_mapping_service.rb +0 -42
  137. data/lib/adwords_api/v201402/feed_mapping_service_registry.rb +0 -46
  138. data/lib/adwords_api/v201402/feed_service.rb +0 -42
  139. data/lib/adwords_api/v201402/feed_service_registry.rb +0 -46
  140. data/lib/adwords_api/v201402/geo_location_service.rb +0 -34
  141. data/lib/adwords_api/v201402/geo_location_service_registry.rb +0 -46
  142. data/lib/adwords_api/v201402/location_criterion_service.rb +0 -38
  143. data/lib/adwords_api/v201402/location_criterion_service_registry.rb +0 -46
  144. data/lib/adwords_api/v201402/managed_customer_service.rb +0 -50
  145. data/lib/adwords_api/v201402/managed_customer_service_registry.rb +0 -46
  146. data/lib/adwords_api/v201402/media_service.rb +0 -42
  147. data/lib/adwords_api/v201402/media_service_registry.rb +0 -46
  148. data/lib/adwords_api/v201402/mutate_job_service.rb +0 -42
  149. data/lib/adwords_api/v201402/mutate_job_service_registry.rb +0 -46
  150. data/lib/adwords_api/v201402/offline_conversion_feed_service.rb +0 -34
  151. data/lib/adwords_api/v201402/offline_conversion_feed_service_registry.rb +0 -46
  152. data/lib/adwords_api/v201402/report_definition_service.rb +0 -34
  153. data/lib/adwords_api/v201402/report_definition_service_registry.rb +0 -46
  154. data/lib/adwords_api/v201402/shared_criterion_service.rb +0 -38
  155. data/lib/adwords_api/v201402/shared_criterion_service_registry.rb +0 -47
  156. data/lib/adwords_api/v201402/shared_set_service.rb +0 -38
  157. data/lib/adwords_api/v201402/shared_set_service_registry.rb +0 -47
  158. data/lib/adwords_api/v201402/targeting_idea_service.rb +0 -38
  159. data/lib/adwords_api/v201402/targeting_idea_service_registry.rb +0 -46
  160. data/lib/adwords_api/v201402/traffic_estimator_service.rb +0 -34
  161. data/lib/adwords_api/v201402/traffic_estimator_service_registry.rb +0 -46
  162. data/test/templates/v201402/basic_operations_get_campaigns.def +0 -114
  163. data/test/templates/v201402/misc_use_oauth2_jwt.def +0 -131
@@ -1,105 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Encoding: utf-8
3
- #
4
- # Author:: api.dklimkin@gmail.com (Danial Klimkin)
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 illustrates how to add an ad group level mobile bid modifier
22
- # override for a campaign.
23
- #
24
- # Tags: AdGroupBidModifierService.mutate
25
-
26
- require 'adwords_api'
27
-
28
- def add_ad_group_bid_modifier(ad_group_id, bid_modifier)
29
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
- # when called without parameters.
31
- adwords = AdwordsApi::Api.new
32
-
33
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
- # the configuration file or provide your own logger:
35
- # adwords.logger = Logger.new('adwords_xml.log')
36
-
37
- bid_modifier_srv = adwords.service(:AdGroupBidModifierService, API_VERSION)
38
-
39
- # Mobile criterion ID.
40
- criterion_id = 30001
41
-
42
- # Prepare to add an ad group level override.
43
- operation = {
44
- # Use 'ADD' to add a new modifier and 'SET' to update an existing one. A
45
- # modifier can be removed with the 'REMOVE' operator.
46
- :operator => 'ADD',
47
- :operand => {
48
- :ad_group_id => ad_group_id,
49
- :criterion => {
50
- :xsi_type => 'Platform',
51
- :id => criterion_id
52
- },
53
- :bid_modifier => bid_modifier
54
- }
55
- }
56
-
57
- # Add ad group level mobile bid modifier.
58
- response = bid_modifier_srv.mutate([operation])
59
- if response and response[:value]
60
- modifier = response[:value].first
61
- value = modifier[:bid_modifier] || 'unset'
62
- puts ('Campaign ID %d, AdGroup ID %d, Criterion ID %d was updated with ' +
63
- 'ad group level modifier: %s') %
64
- [modifier[:campaign_id], modifier[:ad_group_id],
65
- modifier[:criterion][:id], value]
66
- else
67
- puts 'No modifiers were added.'
68
- end
69
- end
70
-
71
- if __FILE__ == $0
72
- API_VERSION = :v201402
73
-
74
- begin
75
- # ID of an ad group to add an override for.
76
- ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
77
- # Bid modifier to override with.
78
- bid_modifier = 1.5
79
-
80
- add_ad_group_bid_modifier(ad_group_id, bid_modifier)
81
-
82
- # Authorization error.
83
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
84
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
85
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
86
- "to retrieve and store OAuth2 tokens."
87
- puts "See this wiki page for more details:\n\n " +
88
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
89
-
90
- # HTTP errors.
91
- rescue AdsCommon::Errors::HttpError => e
92
- puts "HTTP Error: %s" % e
93
-
94
- # API errors.
95
- rescue AdwordsApi::Errors::ApiException => e
96
- puts "Message: %s" % e.message
97
- puts 'Errors:'
98
- e.errors.each_with_index do |error, index|
99
- puts "\tError [%d]:" % (index + 1)
100
- error.each do |field, value|
101
- puts "\t\t%s: %s" % [field, value]
102
- end
103
- end
104
- end
105
- end
@@ -1,137 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Encoding: utf-8
3
- #
4
- # Author:: api.dklimkin@gmail.com (Danial Klimkin)
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 code example creates a click-to-download ad, also known as an app
22
- # promotion ad to a given ad group. To list ad groups, run get_ad_groups.rb.
23
- #
24
- # Tags: AdGroupAdService.mutate
25
-
26
- require 'adwords_api'
27
-
28
- def add_click_to_download_ad(ad_group_id)
29
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
- # when called without parameters.
31
- adwords = AdwordsApi::Api.new
32
-
33
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
- # the configuration file or provide your own logger:
35
- # adwords.logger = Logger.new('adwords_xml.log')
36
-
37
- ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)
38
-
39
- # Create the template elements for the ad. You can refer to
40
- # https://developers.google.com/adwords/api/docs/appendix/templateads
41
- # for the list of available template fields.
42
- ad_data = {
43
- :unique_name => 'adData',
44
- :fields => [
45
- {
46
- :name => 'headline',
47
- :field_text => 'Enjoy your drive in Mars',
48
- :type => 'TEXT'
49
- },
50
- {
51
- :name => 'description1',
52
- :field_text => 'Realistic physics simulation',
53
- :type => 'TEXT'
54
- },
55
- {
56
- :name => 'description2',
57
- :field_text => 'Race against players online',
58
- :type => 'TEXT'
59
- },
60
- {
61
- :name => 'appId',
62
- :field_text => 'com.example.demogame',
63
- :type => 'TEXT'
64
- },
65
- {
66
- :name => 'appStore',
67
- :field_text => '2',
68
- :type => 'ENUM'
69
- }
70
- ]
71
- }
72
-
73
- # Create click to download ad.
74
- click_to_download_app_ad = {
75
- :xsi_type => 'TemplateAd',
76
- :name => 'Ad for demo game',
77
- :template_id => 353,
78
- :url =>
79
- 'http://play.google.com/store/apps/details?id=com.example.demogame',
80
- :display_url => 'play.google.com',
81
- :template_elements => [ad_data]
82
- }
83
-
84
- # Create ad group ad.
85
- ad_group_ad = {
86
- :ad_group_id => ad_group_id,
87
- :ad => click_to_download_app_ad,
88
- # Optional.
89
- :status => 'PAUSED'
90
- }
91
-
92
- # Add ad.
93
- response = ad_group_ad_srv.mutate([
94
- {:operator => 'ADD', :operand => ad_group_ad}
95
- ])
96
- if response and response[:value]
97
- response[:value].each do |ad|
98
- puts "Added new click-to-download ad to ad group ID %d with url '%s'." %
99
- [ad[:ad][:id], ad[:ad][:url]]
100
- end
101
- else
102
- raise StandardError, 'No ads were added.'
103
- end
104
- end
105
-
106
- if __FILE__ == $0
107
- API_VERSION = :v201402
108
-
109
- begin
110
- # Ad group ID to add text ads to.
111
- ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
112
- add_click_to_download_ad(ad_group_id)
113
-
114
- # Authorization error.
115
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
116
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
117
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
118
- "to retrieve and store OAuth2 tokens."
119
- puts "See this wiki page for more details:\n\n " +
120
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
121
-
122
- # HTTP errors.
123
- rescue AdsCommon::Errors::HttpError => e
124
- puts "HTTP Error: %s" % e
125
-
126
- # API errors.
127
- rescue AdwordsApi::Errors::ApiException => e
128
- puts "Message: %s" % e.message
129
- puts 'Errors:'
130
- e.errors.each_with_index do |error, index|
131
- puts "\tError [%d]:" % (index + 1)
132
- error.each do |field, value|
133
- puts "\t\t%s: %s" % [field, value]
134
- end
135
- end
136
- end
137
- end
@@ -1,159 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Encoding: utf-8
3
- #
4
- # Author:: api.mcloonan@gmail.com (Michael Cloonan)
5
- #
6
- # Copyright:: Copyright 2014, 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 adds a feed that syncs feed items from a Google Places account
22
- # and associates the feed with a customer.
23
- #
24
- # Tags: CustomerFeedService.mutate, FeedItemService.mutate
25
- # Tags: FeedMappingService.mutate, FeedService.mutate
26
-
27
- require 'adwords_api'
28
- require 'date'
29
-
30
- def add_places_location_extensions(places_email_address, places_access_token)
31
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
32
- # when called without parameters.
33
- adwords = AdwordsApi::Api.new
34
-
35
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
36
- # the configuration file or provide your own logger:
37
- # adwords.logger = Logger.new('adwords_xml.log')
38
-
39
- feed_srv = adwords.service(:FeedService, API_VERSION)
40
- customer_feed_srv = adwords.service(:CustomerFeedService, API_VERSION)
41
-
42
- places_feed = {
43
- :name => "Places feed #%d" % (Time.new.to_f * 1000).to_i,
44
- :system_feed_generation_data => {
45
- :xsi_type => 'PlacesLocationFeedData',
46
- :o_auth_info => {
47
- :http_method => 'GET',
48
- :http_request_url => 'https://www.google.com/local/add',
49
- :http_authorization_header => "Bearer %s" % places_access_token
50
- },
51
- :email_address => places_email_address
52
- },
53
- # Since this feed's feed items will be managed by AdWords, you must set
54
- # its origin to ADWORDS.
55
- :origin => 'ADWORDS'
56
- }
57
-
58
- places_operation = {
59
- :operator => 'ADD',
60
- :operand => places_feed
61
- }
62
-
63
- result = feed_srv.mutate([places_operation])
64
- added_feed = result[:value].first
65
- puts "Added places feed with ID %d" % added_feed[:id]
66
-
67
- # Add a CustomerFeed that associates the feed with this customer for the
68
- # LOCATION placeholder type.
69
- customer_feed = {
70
- :feed_id => added_feed[:id],
71
- :placeholder_types => PLACEHOLDER_TYPE_LOCATION,
72
- :matching_function => {
73
- :operator => 'IDENTITY',
74
- :lhsOperand => {
75
- :xsi_type => 'FunctionArgumentOperand',
76
- :type => 'BOOLEAN',
77
- :boolean_value => true
78
- }
79
- }
80
- }
81
-
82
- customer_feed_operation = {
83
- :xsi_type => 'CustomerFeedOperation',
84
- :operator => 'ADD',
85
- :operand => customer_feed
86
- }
87
-
88
- added_customer_feed = nil
89
- number_of_attempts = 0
90
- while i < MAX_CUSTOMER_FEED_ADD_ATTEMPTS && !added_customer_feed
91
- number_of_attempts += 1
92
- begin
93
- result = customer_feed_srv.mutate([customer_feed_operation])
94
- added_customer_feed = result[:value].first
95
- puts "Attempt #%d to add the CustomerFeed was successful" %
96
- number_of_attempts
97
- rescue
98
- sleep_seconds = 5 * (2 ** number_of_attempts)
99
- puts ("Attempt #%d to add the CustomerFeed was not succeessful. " +
100
- "Waiting %d seconds before trying again.") %
101
- [number_of_attempts, sleep_seconds]
102
- sleep(sleep_seconds)
103
- end
104
- end
105
-
106
- unless added_customer_feed
107
- raise StandardError, ("Could not create the CustomerFeed after %d " +
108
- "attempts. Please retry the CustomerFeed ADD operation later.") %
109
- MAX_CUSTOMER_FEED_ADD_ATTEMPTS
110
- end
111
-
112
- puts "Added CustomerFeed for feed ID %d and placeholder type %d" %
113
- [added_customer_feed[:id], added_customer_feed[:placeholder_types].first]
114
-
115
- # OPTIONAL: Create a CampaignFeed to specify which FeedItems to use at the
116
- # Campaign level. This will be similar to the CampaignFeed in the
117
- # add_site_links example, except you can filter based on the business name
118
- # and category of each FeedItem by using a FeedAttributeOperand in your
119
- # matching function.
120
-
121
- # OPTIONAL: Create an AdGroupFeed for even more fine grained control over
122
- # which feed items are used at the AdGroup level.
123
- end
124
-
125
- if __FILE__ == $0
126
- API_VERSION = :v201402
127
- PLACEHOLDER_TYPE_LOCATION = 7
128
- MAX_CUSTOMER_FEED_ADD_ATTEMPTS = 10
129
-
130
- begin
131
- places_email_address = 'INSERT_PLACES_EMAIL_ADDRESS_HERE'
132
- places_access_token = 'INSERT_PLACES_ACCESS_TOKEN_HERE'
133
-
134
- add_places_location_extensions(places_email_address, places_access_token)
135
-
136
- # Authorization error.
137
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
138
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
139
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
140
- "to retrieve and store OAuth2 tokens."
141
- puts "See this wiki page for more details:\n\n " +
142
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
143
-
144
- # HTTP errors.
145
- rescue AdsCommon::Errors::HttpError => e
146
- puts "HTTP Error: %s" % e
147
-
148
- # API errors.
149
- rescue AdwordsApi::Errors::ApiException => e
150
- puts "Message: %s" % e.message
151
- puts 'Errors:'
152
- e.errors.each_with_index do |error, index|
153
- puts "\tError [%d]:" % (index + 1)
154
- error.each do |field, value|
155
- puts "\t\t%s: %s" % [field, value]
156
- end
157
- end
158
- end
159
- end
@@ -1,306 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Encoding: utf-8
3
- #
4
- # Author:: api.dklimkin@gmail.com (Danial Klimkin)
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 adds a sitelinks feed and associates it with a campaign.
22
- #
23
- # Tags: CampaignFeedService.mutate, FeedItemService.mutate
24
- # Tags: FeedMappingService.mutate, FeedService.mutate
25
-
26
- require 'adwords_api'
27
-
28
- def add_site_links(campaign_id)
29
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
- # when called without parameters.
31
- adwords = AdwordsApi::Api.new
32
-
33
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
- # the configuration file or provide your own logger:
35
- # adwords.logger = Logger.new('adwords_xml.log')
36
-
37
- feed_srv = adwords.service(:FeedService, API_VERSION)
38
- feed_item_srv = adwords.service(:FeedItemService, API_VERSION)
39
- feed_mapping_srv = adwords.service(:FeedMappingService, API_VERSION)
40
- campaign_feed_srv = adwords.service(:CampaignFeedService, API_VERSION)
41
-
42
- sitelinks_data = {}
43
-
44
- # Create site links feed first.
45
- site_links_feed = {
46
- :name => 'Feed For Site Links',
47
- :attributes => [
48
- {:type => 'STRING', :name => 'Link Text'},
49
- {:type => 'URL', :name => 'Link URL'},
50
- {:type => 'STRING', :name => 'Line 1 Description'},
51
- {:type => 'STRING', :name => 'Line 2 Description'}
52
- ]
53
- }
54
-
55
- response = feed_srv.mutate([
56
- {:operator => 'ADD', :operand => site_links_feed}
57
- ])
58
- if response and response[:value]
59
- feed = response[:value].first
60
- # Attribute of type STRING.
61
- link_text_feed_attribute_id = feed[:attributes][0][:id]
62
- # Attribute of type URL.
63
- link_url_feed_attribute_id = feed[:attributes][1][:id]
64
- # Attribute of type STRING.
65
- line_1_feed_attribute_id = feed[:attributes][2][:id]
66
- #Attribute of type STRING.
67
- line_2_feed_attribute_id = feed[:attributes][3][:id]
68
- puts "Feed with name '%s' and ID %d was added with" %
69
- [feed[:name], feed[:id]]
70
- puts "\tText attribute ID %d and URL attribute ID %d " +
71
- "and Line 1 attribute ID %d and Line 2 attribute ID %d." % [
72
- link_text_feed_attribute_id,
73
- link_url_feed_attribute_id,
74
- line_1_feed_attribute_id,
75
- line_2_feed_attribute_id
76
- ]
77
-
78
- sitelinks_data[:feed_id] = feed[:id]
79
- sitelinks_data[:link_text_feed_id] = link_text_feed_attribute_id
80
- sitelinks_data[:link_url_feed_id] = link_url_feed_attribute_id
81
- sitelinks_data[:line_1_feed_id] = line_1_feed_attribute_id
82
- sitelinks_data[:line_2_feed_id] = line_2_feed_attribute_id
83
- else
84
- raise new StandardError, 'No feeds were added.'
85
- end
86
-
87
- # Create site links feed items.
88
- items_data = [
89
- {
90
- :text => 'Home',
91
- :url => 'http://www.example.com',
92
- :line_1 => 'Home line 1',
93
- :line_2 => 'Home line 2'
94
- },
95
- {
96
- :text => 'Stores',
97
- :url => 'http://www.example.com/stores',
98
- :line_1 => 'Stores line 1',
99
- :line_2 => 'Stores line 2'
100
- },
101
- {
102
- :text => 'On Sale',
103
- :url => 'http://www.example.com/sale',
104
- :line_1 => 'On Sale line 1',
105
- :line_2 => 'On Sale line 2'
106
- },
107
- {
108
- :text => 'Support',
109
- :url => 'http://www.example.com/support',
110
- :line_1 => 'Support line 1',
111
- :line_2 => 'Support line 2'
112
- },
113
- {
114
- :text => 'Products',
115
- :url => 'http://www.example.com/products',
116
- :line_1 => 'Products line 1',
117
- :line_2 => 'Products line 2'
118
- },
119
- {
120
- :text => 'About',
121
- :url => 'http://www.example.com/about',
122
- :line_1 => 'About line 1',
123
- :line_2 => 'About line 2'
124
- }
125
- ]
126
-
127
- feed_items = items_data.map do |item|
128
- {
129
- :feed_id => sitelinks_data[:feed_id],
130
- :attribute_values => [
131
- {
132
- :feed_attribute_id => sitelinks_data[:link_text_feed_id],
133
- :string_value => item[:text]
134
- },
135
- {
136
- :feed_attribute_id => sitelinks_data[:link_url_feed_id],
137
- :string_value => item[:url]
138
- },
139
- {
140
- :feed_attribute_id => sitelinks_data[:line_1_feed_id],
141
- :string_value => item[:line_1]
142
- },
143
- {
144
- :feed_attribute_id => sitelinks_data[:line_2_feed_id],
145
- :string_value => item[:line_2]
146
- }
147
- ]
148
- }
149
- end
150
-
151
- feed_items_operations = feed_items.map do |item|
152
- {:operator => 'ADD', :operand => item}
153
- end
154
-
155
- response = feed_item_srv.mutate(feed_items_operations)
156
- if response and response[:value]
157
- sitelinks_data[:feed_item_ids] = []
158
- response[:value].each do |feed_item|
159
- puts 'Feed item with ID %d was added.' % feed_item[:feed_item_id]
160
- sitelinks_data[:feed_item_ids] << feed_item[:feed_item_id]
161
- end
162
- else
163
- raise new StandardError, 'No feed items were added.'
164
- end
165
-
166
- # Create site links feed mapping.
167
- feed_mapping = {
168
- :placeholder_type => PLACEHOLDER_SITELINKS,
169
- :feed_id => sitelinks_data[:feed_id],
170
- :attribute_field_mappings => [
171
- {
172
- :feed_attribute_id => sitelinks_data[:link_text_feed_id],
173
- :field_id => PLACEHOLDER_FIELD_SITELINK_LINK_TEXT
174
- },
175
- {
176
- :feed_attribute_id => sitelinks_data[:link_url_feed_id],
177
- :field_id => PLACEHOLDER_FIELD_SITELINK_LINK_URL
178
- },
179
- {
180
- :feed_attribute_id => sitelinks_data[:line_1_feed_id],
181
- :field_id => PLACEHOLDER_FIELD_SITELINK_LINE_1_TEXT
182
- },
183
- {
184
- :feed_attribute_id => sitelinks_data[:line_2_feed_id],
185
- :field_id => PLACEHOLDER_FIELD_SITELINK_LINE_2_TEXT
186
- }
187
- ]
188
- }
189
-
190
- response = feed_mapping_srv.mutate([
191
- {:operator => 'ADD', :operand => feed_mapping}
192
- ])
193
- if response and response[:value]
194
- feed_mapping = response[:value].first
195
- puts ('Feed mapping with ID %d and placeholder type %d was saved for feed' +
196
- ' with ID %d.') % [
197
- feed_mapping[:feed_mapping_id],
198
- feed_mapping[:placeholder_type],
199
- feed_mapping[:feed_id]
200
- ]
201
- else
202
- raise new StandardError, 'No feed mappings were added.'
203
- end
204
-
205
- # Create site links campaign feed.
206
- operands = sitelinks_data[:feed_item_ids].map do |feed_item_id|
207
- {
208
- :xsi_type => 'ConstantOperand',
209
- :type => 'LONG',
210
- :long_value => feed_item_id
211
- }
212
- end
213
-
214
- feed_item_function = {
215
- :operator => 'IN',
216
- :lhs_operand => [
217
- {:xsi_type => 'RequestContextOperand', :context_type => 'FEED_ITEM_ID'}
218
- ],
219
- :rhs_operand => operands
220
- }
221
-
222
- # Optional: to target to a platform, define a function and 'AND' it with the
223
- # feed item ID link:
224
- platform_function = {
225
- :operator => 'EQUALS',
226
- :lhs_operand => [
227
- {:xsi_type => 'RequestContextOperand', :context_type => 'DEVICE_PLATFORM'}
228
- ],
229
- :rhs_operand => [
230
- {
231
- :xsi_type => 'ConstantOperand',
232
- :type => 'STRING',
233
- :string_value => 'Mobile'
234
- }
235
- ]
236
- }
237
- combined_function = {
238
- :operator => 'AND',
239
- :lhs_operand => [
240
- {:xsi_type => 'FunctionOperand', :value => feed_item_function},
241
- {:xsi_type => 'FunctionOperand', :value => platform_function}
242
- ]
243
- }
244
-
245
- campaign_feed = {
246
- :feed_id => sitelinks_data[:feed_id],
247
- :campaign_id => campaign_id,
248
- :matching_function => combined_function,
249
- # Specifying placeholder types on the CampaignFeed allows the same feed
250
- # to be used for different placeholders in different Campaigns.
251
- :placeholder_types => [PLACEHOLDER_SITELINKS]
252
- }
253
-
254
- response = campaign_feed_srv.mutate([
255
- {:operator => 'ADD', :operand => campaign_feed}
256
- ])
257
- if response and response[:value]
258
- campaign_feed = response[:value].first
259
- puts 'Campaign with ID %d was associated with feed with ID %d.' %
260
- [campaign_feed[:campaign_id], campaign_feed[:feed_id]]
261
- else
262
- raise new StandardError, 'No campaign feeds were added.'
263
- end
264
- end
265
-
266
- if __FILE__ == $0
267
- API_VERSION = :v201402
268
-
269
- # See the Placeholder reference page for a list of all the placeholder types
270
- # and fields, see:
271
- # https://developers.google.com/adwords/api/docs/appendix/placeholders
272
- PLACEHOLDER_SITELINKS = 1
273
- PLACEHOLDER_FIELD_SITELINK_LINK_TEXT = 1
274
- PLACEHOLDER_FIELD_SITELINK_LINK_URL = 2
275
- PLACEHOLDER_FIELD_SITELINK_LINE_1_TEXT = 3
276
- PLACEHOLDER_FIELD_SITELINK_LINE_2_TEXT = 4
277
-
278
- begin
279
- # Campaign ID to add site link to.
280
- campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
281
- add_site_links(campaign_id)
282
-
283
- # Authorization error.
284
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
285
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
286
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
287
- "to retrieve and store OAuth2 tokens."
288
- puts "See this wiki page for more details:\n\n " +
289
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
290
-
291
- # HTTP errors.
292
- rescue AdsCommon::Errors::HttpError => e
293
- puts "HTTP Error: %s" % e
294
-
295
- # API errors.
296
- rescue AdwordsApi::Errors::ApiException => e
297
- puts "Message: %s" % e.message
298
- puts 'Errors:'
299
- e.errors.each_with_index do |error, index|
300
- puts "\tError [%d]:" % (index + 1)
301
- error.each do |field, value|
302
- puts "\t\t%s: %s" % [field, value]
303
- end
304
- end
305
- end
306
- end