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.
Files changed (184) hide show
  1. checksums.yaml +8 -8
  2. data/ChangeLog +3 -0
  3. data/examples/v201406/optimization/estimate_keyword_traffic.rb +30 -12
  4. data/examples/v201409/basic_operations/add_keywords.rb +3 -1
  5. data/examples/v201409/{advanced_operations → extensions}/add_google_my_business_location_extensions.rb +1 -1
  6. data/examples/v201409/extensions/add_site_links.rb +167 -0
  7. data/examples/v201409/{advanced_operations/add_site_links.rb → extensions/add_site_links_using_feeds.rb} +0 -0
  8. data/examples/v201409/migration/migrate_to_extension_settings.rb +365 -0
  9. data/examples/v201409/optimization/estimate_keyword_traffic.rb +30 -13
  10. data/examples/v201502/account_management/create_account.rb +92 -0
  11. data/examples/v201502/account_management/get_account_changes.rb +143 -0
  12. data/examples/v201502/account_management/get_account_hierarchy.rb +98 -0
  13. data/examples/v201502/advanced_operations/add_ad_customizer.rb +277 -0
  14. data/examples/v201502/advanced_operations/add_ad_group_bid_modifier.rb +105 -0
  15. data/examples/v201502/advanced_operations/add_click_to_download_ad.rb +137 -0
  16. data/examples/v201502/advanced_operations/add_text_ad_with_upgraded_urls.rb +137 -0
  17. data/examples/v201502/advanced_operations/create_and_attach_shared_keyword_set.rb +137 -0
  18. data/examples/v201502/advanced_operations/find_and_remove_criteria_from_shared_set.rb +171 -0
  19. data/examples/v201502/advanced_operations/get_ad_group_bid_modifiers.rb +106 -0
  20. data/examples/v201502/advanced_operations/upload_offline_conversions.rb +117 -0
  21. data/examples/v201502/advanced_operations/use_shared_bidding_strategy.rb +152 -0
  22. data/examples/v201502/basic_operations/add_ad_groups.rb +144 -0
  23. data/examples/v201502/basic_operations/add_campaigns.rb +143 -0
  24. data/examples/v201502/basic_operations/add_keywords.rb +118 -0
  25. data/examples/v201502/basic_operations/add_text_ads.rb +113 -0
  26. data/examples/v201502/basic_operations/get_ad_groups.rb +106 -0
  27. data/examples/v201502/basic_operations/get_campaigns.rb +101 -0
  28. data/examples/v201502/basic_operations/get_campaigns_with_awql.rb +93 -0
  29. data/examples/v201502/basic_operations/get_keywords.rb +112 -0
  30. data/examples/v201502/basic_operations/get_text_ads.rb +114 -0
  31. data/examples/v201502/basic_operations/pause_ad.rb +92 -0
  32. data/examples/v201502/basic_operations/remove_ad.rb +93 -0
  33. data/examples/v201502/basic_operations/remove_ad_group.rb +89 -0
  34. data/examples/v201502/basic_operations/remove_campaign.rb +91 -0
  35. data/examples/v201502/basic_operations/remove_keyword.rb +98 -0
  36. data/examples/v201502/basic_operations/update_ad_group.rb +89 -0
  37. data/examples/v201502/basic_operations/update_campaign.rb +90 -0
  38. data/examples/v201502/basic_operations/update_keyword.rb +110 -0
  39. data/examples/v201502/campaign_management/add_campaign_labels.rb +86 -0
  40. data/examples/v201502/campaign_management/add_experiment.rb +166 -0
  41. data/examples/v201502/campaign_management/add_keywords_in_bulk.rb +158 -0
  42. data/examples/v201502/campaign_management/add_location_extension.rb +125 -0
  43. data/examples/v201502/campaign_management/get_all_disapproved_ads.rb +101 -0
  44. data/examples/v201502/campaign_management/get_all_disapproved_ads_with_awql.rb +93 -0
  45. data/examples/v201502/campaign_management/get_campaigns_by_label.rb +112 -0
  46. data/examples/v201502/campaign_management/promote_experiment.rb +85 -0
  47. data/examples/v201502/campaign_management/set_ad_parameters.rb +122 -0
  48. data/examples/v201502/campaign_management/set_criterion_bid_modifier.rb +108 -0
  49. data/examples/v201502/campaign_management/validate_text_ad.rb +114 -0
  50. data/examples/v201502/error_handling/handle_captcha_challenge.rb +93 -0
  51. data/examples/v201502/error_handling/handle_partial_failures.rb +134 -0
  52. data/examples/v201502/error_handling/handle_policy_violation_error.rb +145 -0
  53. data/examples/v201502/error_handling/handle_two_factor_authorization_error.rb +88 -0
  54. data/examples/v201502/extensions/add_google_my_business_location_extensions.rb +183 -0
  55. data/examples/v201502/extensions/add_site_links.rb +167 -0
  56. data/examples/v201502/extensions/add_site_links_using_feeds.rb +306 -0
  57. data/examples/v201502/migration/migrate_to_extension_settings.rb +365 -0
  58. data/examples/v201502/migration/upgrade_ad_url.rb +97 -0
  59. data/examples/v201502/misc/create_ad_words_session_without_properties_file.rb +94 -0
  60. data/examples/v201502/misc/get_all_images_and_videos.rb +108 -0
  61. data/examples/v201502/misc/setup_oauth2.rb +88 -0
  62. data/examples/v201502/misc/upload_image.rb +97 -0
  63. data/examples/v201502/misc/use_oauth2_jwt.rb +97 -0
  64. data/examples/v201502/optimization/estimate_keyword_traffic.rb +155 -0
  65. data/examples/v201502/optimization/get_keyword_bid_simulations.rb +99 -0
  66. data/examples/v201502/optimization/get_keyword_ideas.rb +130 -0
  67. data/examples/v201502/remarketing/add_audience.rb +122 -0
  68. data/examples/v201502/remarketing/add_conversion_tracker.rb +105 -0
  69. data/examples/v201502/remarketing/add_rule_based_user_lists.rb +171 -0
  70. data/examples/v201502/reporting/download_criteria_report.rb +87 -0
  71. data/examples/v201502/reporting/download_criteria_report_with_awql.rb +86 -0
  72. data/examples/v201502/reporting/get_report_fields.rb +79 -0
  73. data/examples/v201502/reporting/parallel_report_download.rb +168 -0
  74. data/examples/v201502/shopping_campaigns/add_product_partition_tree.rb +269 -0
  75. data/examples/v201502/shopping_campaigns/add_product_scope.rb +133 -0
  76. data/examples/v201502/shopping_campaigns/add_shopping_campaign.rb +133 -0
  77. data/examples/v201502/shopping_campaigns/get_product_category_taxonomy.rb +117 -0
  78. data/examples/v201502/targeting/add_campaign_targeting_criteria.rb +173 -0
  79. data/examples/v201502/targeting/add_demographic_targeting_criteria.rb +116 -0
  80. data/examples/v201502/targeting/get_campaign_targeting_criteria.rb +110 -0
  81. data/examples/v201502/targeting/get_targetable_languages_and_carriers.rb +94 -0
  82. data/examples/v201502/targeting/lookup_location.rb +112 -0
  83. data/lib/adwords_api/api_config.rb +98 -4
  84. data/lib/adwords_api/v201409/ad_customizer_feed_service.rb +38 -0
  85. data/lib/adwords_api/v201409/ad_customizer_feed_service_registry.rb +46 -0
  86. data/lib/adwords_api/v201409/ad_group_extension_setting_service.rb +42 -0
  87. data/lib/adwords_api/v201409/ad_group_extension_setting_service_registry.rb +46 -0
  88. data/lib/adwords_api/v201409/campaign_extension_setting_service.rb +42 -0
  89. data/lib/adwords_api/v201409/campaign_extension_setting_service_registry.rb +46 -0
  90. data/lib/adwords_api/v201409/customer_extension_setting_service.rb +42 -0
  91. data/lib/adwords_api/v201409/customer_extension_setting_service_registry.rb +46 -0
  92. data/lib/adwords_api/v201502/account_label_service.rb +38 -0
  93. data/lib/adwords_api/v201502/account_label_service_registry.rb +46 -0
  94. data/lib/adwords_api/v201502/ad_customizer_feed_service.rb +38 -0
  95. data/lib/adwords_api/v201502/ad_customizer_feed_service_registry.rb +46 -0
  96. data/lib/adwords_api/v201502/ad_group_ad_service.rb +50 -0
  97. data/lib/adwords_api/v201502/ad_group_ad_service_registry.rb +46 -0
  98. data/lib/adwords_api/v201502/ad_group_bid_modifier_service.rb +42 -0
  99. data/lib/adwords_api/v201502/ad_group_bid_modifier_service_registry.rb +46 -0
  100. data/lib/adwords_api/v201502/ad_group_criterion_service.rb +46 -0
  101. data/lib/adwords_api/v201502/ad_group_criterion_service_registry.rb +46 -0
  102. data/lib/adwords_api/v201502/ad_group_extension_setting_service.rb +42 -0
  103. data/lib/adwords_api/v201502/ad_group_extension_setting_service_registry.rb +46 -0
  104. data/lib/adwords_api/v201502/ad_group_feed_service.rb +42 -0
  105. data/lib/adwords_api/v201502/ad_group_feed_service_registry.rb +46 -0
  106. data/lib/adwords_api/v201502/ad_group_service.rb +46 -0
  107. data/lib/adwords_api/v201502/ad_group_service_registry.rb +46 -0
  108. data/lib/adwords_api/v201502/ad_param_service.rb +38 -0
  109. data/lib/adwords_api/v201502/ad_param_service_registry.rb +46 -0
  110. data/lib/adwords_api/v201502/adwords_user_list_service.rb +38 -0
  111. data/lib/adwords_api/v201502/adwords_user_list_service_registry.rb +46 -0
  112. data/lib/adwords_api/v201502/bidding_strategy_service.rb +42 -0
  113. data/lib/adwords_api/v201502/bidding_strategy_service_registry.rb +46 -0
  114. data/lib/adwords_api/v201502/budget_order_service.rb +42 -0
  115. data/lib/adwords_api/v201502/budget_order_service_registry.rb +46 -0
  116. data/lib/adwords_api/v201502/budget_service.rb +42 -0
  117. data/lib/adwords_api/v201502/budget_service_registry.rb +46 -0
  118. data/lib/adwords_api/v201502/campaign_criterion_service.rb +42 -0
  119. data/lib/adwords_api/v201502/campaign_criterion_service_registry.rb +46 -0
  120. data/lib/adwords_api/v201502/campaign_extension_setting_service.rb +42 -0
  121. data/lib/adwords_api/v201502/campaign_extension_setting_service_registry.rb +46 -0
  122. data/lib/adwords_api/v201502/campaign_feed_service.rb +42 -0
  123. data/lib/adwords_api/v201502/campaign_feed_service_registry.rb +46 -0
  124. data/lib/adwords_api/v201502/campaign_service.rb +46 -0
  125. data/lib/adwords_api/v201502/campaign_service_registry.rb +46 -0
  126. data/lib/adwords_api/v201502/campaign_shared_set_service.rb +38 -0
  127. data/lib/adwords_api/v201502/campaign_shared_set_service_registry.rb +46 -0
  128. data/lib/adwords_api/v201502/constant_data_service.rb +66 -0
  129. data/lib/adwords_api/v201502/constant_data_service_registry.rb +46 -0
  130. data/lib/adwords_api/v201502/conversion_tracker_service.rb +42 -0
  131. data/lib/adwords_api/v201502/conversion_tracker_service_registry.rb +46 -0
  132. data/lib/adwords_api/v201502/customer_extension_setting_service.rb +42 -0
  133. data/lib/adwords_api/v201502/customer_extension_setting_service_registry.rb +46 -0
  134. data/lib/adwords_api/v201502/customer_feed_service.rb +42 -0
  135. data/lib/adwords_api/v201502/customer_feed_service_registry.rb +46 -0
  136. data/lib/adwords_api/v201502/customer_service.rb +38 -0
  137. data/lib/adwords_api/v201502/customer_service_registry.rb +46 -0
  138. data/lib/adwords_api/v201502/customer_sync_service.rb +34 -0
  139. data/lib/adwords_api/v201502/customer_sync_service_registry.rb +47 -0
  140. data/lib/adwords_api/v201502/data_service.rb +54 -0
  141. data/lib/adwords_api/v201502/data_service_registry.rb +46 -0
  142. data/lib/adwords_api/v201502/experiment_service.rb +38 -0
  143. data/lib/adwords_api/v201502/experiment_service_registry.rb +46 -0
  144. data/lib/adwords_api/v201502/feed_item_service.rb +42 -0
  145. data/lib/adwords_api/v201502/feed_item_service_registry.rb +46 -0
  146. data/lib/adwords_api/v201502/feed_mapping_service.rb +42 -0
  147. data/lib/adwords_api/v201502/feed_mapping_service_registry.rb +46 -0
  148. data/lib/adwords_api/v201502/feed_service.rb +42 -0
  149. data/lib/adwords_api/v201502/feed_service_registry.rb +46 -0
  150. data/lib/adwords_api/v201502/geo_location_service.rb +34 -0
  151. data/lib/adwords_api/v201502/geo_location_service_registry.rb +46 -0
  152. data/lib/adwords_api/v201502/label_service.rb +42 -0
  153. data/lib/adwords_api/v201502/label_service_registry.rb +46 -0
  154. data/lib/adwords_api/v201502/location_criterion_service.rb +38 -0
  155. data/lib/adwords_api/v201502/location_criterion_service_registry.rb +46 -0
  156. data/lib/adwords_api/v201502/managed_customer_service.rb +54 -0
  157. data/lib/adwords_api/v201502/managed_customer_service_registry.rb +46 -0
  158. data/lib/adwords_api/v201502/media_service.rb +42 -0
  159. data/lib/adwords_api/v201502/media_service_registry.rb +46 -0
  160. data/lib/adwords_api/v201502/mutate_job_service.rb +42 -0
  161. data/lib/adwords_api/v201502/mutate_job_service_registry.rb +46 -0
  162. data/lib/adwords_api/v201502/offline_conversion_feed_service.rb +34 -0
  163. data/lib/adwords_api/v201502/offline_conversion_feed_service_registry.rb +46 -0
  164. data/lib/adwords_api/v201502/report_definition_service.rb +34 -0
  165. data/lib/adwords_api/v201502/report_definition_service_registry.rb +46 -0
  166. data/lib/adwords_api/v201502/shared_criterion_service.rb +38 -0
  167. data/lib/adwords_api/v201502/shared_criterion_service_registry.rb +46 -0
  168. data/lib/adwords_api/v201502/shared_set_service.rb +38 -0
  169. data/lib/adwords_api/v201502/shared_set_service_registry.rb +46 -0
  170. data/lib/adwords_api/v201502/targeting_idea_service.rb +34 -0
  171. data/lib/adwords_api/v201502/targeting_idea_service_registry.rb +46 -0
  172. data/lib/adwords_api/v201502/traffic_estimator_service.rb +34 -0
  173. data/lib/adwords_api/v201502/traffic_estimator_service_registry.rb +46 -0
  174. data/lib/adwords_api/version.rb +1 -1
  175. data/test/adwords_api/test_adwords_api.rb +1 -12
  176. data/test/templates/v201406/basic_operations_get_campaigns.def +1 -1
  177. data/test/templates/v201406/misc_use_oauth2_jwt.def +1 -1
  178. data/test/templates/v201409/basic_operations_get_campaigns.def +1 -1
  179. data/test/templates/v201409/misc_use_oauth2_jwt.def +1 -1
  180. data/test/templates/v201502/basic_operations_get_campaigns.def +114 -0
  181. data/test/templates/v201502/misc_use_oauth2_jwt.def +131 -0
  182. metadata +173 -8
  183. data/examples/v201406/advanced_operations/update_site_links.rb +0 -194
  184. data/examples/v201409/advanced_operations/update_site_links.rb +0 -194
@@ -84,27 +84,44 @@ def estimate_keyword_traffic()
84
84
  keyword = keyword_requests[index][:keyword]
85
85
 
86
86
  # Find the mean of the min and max values.
87
- mean_avg_cpc = (estimate[:min][:average_cpc][:micro_amount] +
88
- estimate[:max][:average_cpc][:micro_amount]) / 2
89
- mean_avg_position = (estimate[:min][:average_position] +
90
- estimate[:max][:average_position]) / 2
91
- mean_clicks = (estimate[:min][:clicks_per_day] +
92
- estimate[:max][:clicks_per_day]) / 2
93
- mean_total_cost = (estimate[:min][:total_cost][:micro_amount] +
94
- estimate[:max][:total_cost][:micro_amount]) / 2
87
+ mean_avg_cpc = calculate_mean(
88
+ estimate[:min][:average_cpc][:micro_amount],
89
+ estimate[:max][:average_cpc][:micro_amount]
90
+ )
91
+ mean_avg_position = calculate_mean(
92
+ estimate[:min][:average_position],
93
+ estimate[:max][:average_position])
94
+ )
95
+ mean_clicks = calculate_mean(
96
+ estimate[:min][:clicks_per_day],
97
+ estimate[:max][:clicks_per_day]
98
+ )
99
+ mean_total_cost = calculate_mean(
100
+ estimate[:min][:total_cost][:micro_amount],
101
+ estimate[:max][:total_cost][:micro_amount]
102
+ )
95
103
 
96
104
  puts "Results for the keyword with text '%s' and match type %s:" %
97
105
  [keyword[:text], keyword[:match_type]]
98
- puts "\tEstimated average CPC: %d" % mean_avg_cpc
99
- puts "\tEstimated ad position: %.2f" % mean_avg_position
100
- puts "\tEstimated daily clicks: %d" % mean_clicks
101
- puts "\tEstimated daily cost: %d" % mean_total_cost
102
- end
106
+ puts "\tEstimated average CPC: %s" % format_mean(mean_avg_cpc)
107
+ puts "\tEstimated ad position: %s" % format_mean(mean_avg_position)
108
+ puts "\tEstimated daily clicks: %s" % format_mean(mean_clicks)
109
+ puts "\tEstimated daily cost: %s" % format_mean(mean_total_cost)
103
110
  else
104
111
  puts 'No traffic estimates were returned.'
105
112
  end
106
113
  end
107
114
 
115
+ def format_mean(mean)
116
+ return "nil" if mean.nil?
117
+ return "%.2f" % mean
118
+ end
119
+
120
+ def calculate_mean(min_money, max_money)
121
+ return nil if min_money.nil? || max_money.nil?
122
+ return (min_money.to_f + max_money.to_f) / 2.0
123
+ end
124
+
108
125
  if __FILE__ == $0
109
126
  API_VERSION = :v201409
110
127
 
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2011, 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 create an account. Note by default this
22
+ # account will only be accessible via parent MCC.
23
+ #
24
+ # Tags: ManagedCustomerService.mutate
25
+
26
+ require 'adwords_api'
27
+ require 'adwords_api/utils'
28
+
29
+ def create_account()
30
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
31
+ # when called without parameters.
32
+ adwords = AdwordsApi::Api.new
33
+
34
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
35
+ # the configuration file or provide your own logger:
36
+ # adwords.logger = Logger.new('adwords_xml.log')
37
+
38
+ managed_customer_srv = adwords.service(:ManagedCustomerService, API_VERSION)
39
+
40
+ # Create a local Customer object.
41
+ customer = {
42
+ :name => 'Account created with ManagedCustomerService',
43
+ :currency_code => 'EUR',
44
+ :date_time_zone => 'Europe/London'
45
+ }
46
+
47
+ # Prepare operation to create an account.
48
+ operation = {
49
+ :operator => 'ADD',
50
+ :operand => customer
51
+ }
52
+
53
+ # Create the account. It is possible to create multiple accounts with one
54
+ # request by sending an array of operations.
55
+ response = managed_customer_srv.mutate([operation])
56
+
57
+ response[:value].each do |new_account|
58
+ puts "Account with customer ID '%s' was successfully created." %
59
+ AdwordsApi::Utils.format_id(new_account[:customer_id])
60
+ end
61
+ end
62
+
63
+ if __FILE__ == $0
64
+ API_VERSION = :v201502
65
+
66
+ begin
67
+ create_account()
68
+
69
+ # Authorization error.
70
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
71
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
72
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
73
+ "to retrieve and store OAuth2 tokens."
74
+ puts "See this wiki page for more details:\n\n " +
75
+ 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
76
+
77
+ # HTTP errors.
78
+ rescue AdsCommon::Errors::HttpError => e
79
+ puts "HTTP Error: %s" % e
80
+
81
+ # API errors.
82
+ rescue AdwordsApi::Errors::ApiException => e
83
+ puts "Message: %s" % e.message
84
+ puts 'Errors:'
85
+ e.errors.each_with_index do |error, index|
86
+ puts "\tError [%d]:" % (index + 1)
87
+ error.each do |field, value|
88
+ puts "\t\t%s: %s" % [field, value]
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2011, 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 gets all account changes that happened within the last 24 hours,
22
+ # for all your campaigns.
23
+ #
24
+ # Tags: CustomerSyncService.get
25
+
26
+ require 'adwords_api'
27
+ require 'date'
28
+ require 'pp'
29
+
30
+ def get_account_changes()
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
+ campaign_srv = adwords.service(:CampaignService, API_VERSION)
40
+ customer_sync_srv = adwords.service(:CustomerSyncService, API_VERSION)
41
+
42
+ today_at_midnight = DateTime.parse(Date.today.to_s)
43
+ yesterday_at_midnight = DateTime.parse((Date.today - 1).to_s)
44
+ min_date_time = yesterday_at_midnight.strftime("%Y%m%d %H%M%S")
45
+ max_date_time = today_at_midnight.strftime("%Y%m%d %H%M%S")
46
+
47
+ # Get all the campaigns for this account.
48
+ selector = {
49
+ :fields => ['Id']
50
+ }
51
+ response = campaign_srv.get(selector)
52
+
53
+ campaign_ids = []
54
+
55
+ if response and response[:entries]
56
+ campaign_ids = response[:entries].map { |campaign| campaign[:id] }
57
+ else
58
+ raise StandardError, 'No campaigns were found.'
59
+ end
60
+
61
+ # Create a selector for CustomerSyncService.
62
+ selector = {
63
+ :campaign_ids => campaign_ids,
64
+ :date_time_range => {
65
+ :min => min_date_time,
66
+ :max => max_date_time
67
+ }
68
+ }
69
+
70
+ # Get all account changes for the campaigns.
71
+ campaign_changes = customer_sync_srv.get(selector)
72
+
73
+ # Display changes.
74
+ if campaign_changes
75
+ puts "Most recent change: %s" % campaign_changes[:last_change_timestamp]
76
+ campaign_changes[:changed_campaigns].each do |campaign|
77
+ puts "Campaign with ID %d was changed:" % campaign[:campaign_id]
78
+ puts "\tCampaign change status: '%s'" % campaign[:campaign_change_status]
79
+ unless ['NEW', 'FIELDS_UNCHANGED'].include?(
80
+ campaign[:campaign_change_status])
81
+ puts "\tAdded ad extensions: '%s'" %
82
+ campaign[:added_ad_extensions].pretty_inspect.chomp
83
+ puts "\tAdded campaign criteria: '%s'" %
84
+ campaign[:added_campaign_criteria].pretty_inspect.chomp
85
+ puts "\tDeleted ad extensions: '%s'" %
86
+ campaign[:deleted_ad_extensions].pretty_inspect.chomp
87
+ puts "\tDeleted campaign criteria: '%s'" %
88
+ campaign[:deleted_campaign_criteria].pretty_inspect.chomp
89
+
90
+ if campaign[:changed_ad_groups]
91
+ campaign[:changed_ad_groups].each do |ad_group|
92
+ puts "\tAd group with ID %d was changed:" % ad_group[:ad_group_id]
93
+ puts "\t\tAd group changed status: '%s'" %
94
+ ad_group[:ad_group_change_status]
95
+ unless ['NEW', 'FIELDS_UNCHANGED'].include?(
96
+ ad_group[:ad_group_change_status])
97
+ puts "\t\tAds changed: '%s'" %
98
+ ad_group[:changed_ads].pretty_inspect.chomp
99
+ puts "\t\tCriteria changed: '%s'" %
100
+ ad_group[:changed_criteria].pretty_inspect.chomp
101
+ puts "\t\tCriteria deleted: '%s'" %
102
+ ad_group[:deleted_criteria].pretty_inspect.chomp
103
+ end
104
+ end
105
+ end
106
+ end
107
+ puts
108
+ end
109
+ else
110
+ puts 'No account changes were found.'
111
+ end
112
+ end
113
+
114
+ if __FILE__ == $0
115
+ API_VERSION = :v201502
116
+
117
+ begin
118
+ get_account_changes()
119
+
120
+ # Authorization error.
121
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
122
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
123
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
124
+ "to retrieve and store OAuth2 tokens."
125
+ puts "See this wiki page for more details:\n\n " +
126
+ 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
127
+
128
+ # HTTP errors.
129
+ rescue AdsCommon::Errors::HttpError => e
130
+ puts "HTTP Error: %s" % e
131
+
132
+ # API errors.
133
+ rescue AdwordsApi::Errors::ApiException => e
134
+ puts "Message: %s" % e.message
135
+ puts 'Errors:'
136
+ e.errors.each_with_index do |error, index|
137
+ puts "\tError [%d]:" % (index + 1)
138
+ error.each do |field, value|
139
+ puts "\t\t%s: %s" % [field, value]
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2011, 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 retrieve the account hierarchy under an
22
+ # account. This example needs to be run against an MCC account.
23
+ #
24
+ # Tags: ManagedCustomerService.get
25
+
26
+ require 'adwords_api'
27
+ require 'adwords_api/utils'
28
+
29
+ def get_account_hierarchy()
30
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
31
+ # when called without parameters.
32
+ adwords = AdwordsApi::Api.new
33
+
34
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
35
+ # the configuration file or provide your own logger:
36
+ # adwords.logger = Logger.new('adwords_xml.log')
37
+
38
+ managed_customer_srv = adwords.service(:ManagedCustomerService, API_VERSION)
39
+
40
+ # Get the account hierarchy for this account.
41
+ selector = {
42
+ :fields => ['CustomerId', 'Name']
43
+ }
44
+
45
+ graph = managed_customer_srv.get(selector)
46
+
47
+ if graph and graph[:entries]
48
+ puts 'Accounts under this hierarchy: %d' % graph[:total_num_entries]
49
+ graph[:entries].each_with_index do |account, index|
50
+ puts "%d) Customer ID: %s" %
51
+ [index + 1, AdwordsApi::Utils.format_id(account[:customer_id])]
52
+ puts "\tName: %s" % account[:name]
53
+ end
54
+
55
+ # Display the links.
56
+ if graph[:links]
57
+ puts 'Hierarchy links:'
58
+ graph[:links].each do |link|
59
+ puts "\tThere is a link from %s to %s" %
60
+ [AdwordsApi::Utils.format_id(link[:manager_customer_id]),
61
+ AdwordsApi::Utils.format_id(link[:client_customer_id])]
62
+ end
63
+ end
64
+ else
65
+ puts 'No accounts were found.'
66
+ end
67
+ end
68
+
69
+ if __FILE__ == $0
70
+ API_VERSION = :v201502
71
+
72
+ begin
73
+ get_account_hierarchy()
74
+
75
+ # Authorization error.
76
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
77
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
78
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
79
+ "to retrieve and store OAuth2 tokens."
80
+ puts "See this wiki page for more details:\n\n " +
81
+ 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
82
+
83
+ # HTTP errors.
84
+ rescue AdsCommon::Errors::HttpError => e
85
+ puts "HTTP Error: %s" % e
86
+
87
+ # API errors.
88
+ rescue AdwordsApi::Errors::ApiException => e
89
+ puts "Message: %s" % e.message
90
+ puts 'Errors:'
91
+ e.errors.each_with_index do |error, index|
92
+ puts "\tError [%d]:" % (index + 1)
93
+ error.each do |field, value|
94
+ puts "\t\t%s: %s" % [field, value]
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,277 @@
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 an ad customizer feed and associates it with the customer.
22
+ # Then it adds an ad that uses the feed to populate dynamic data.
23
+ #
24
+ # Tags: CustomerFeedService.mutate, FeedItemService.mutate
25
+ # Tags: FeedMappingService.mutate, FeedService.mutate
26
+ # Tags: AdGroupAdService.mutate
27
+
28
+ require 'adwords_api'
29
+
30
+ def add_ad_customizer(ad_group_ids)
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
+ feed_item_srv = adwords.service(:FeedItemService, API_VERSION)
41
+ feed_mapping_srv = adwords.service(:FeedMappingService, API_VERSION)
42
+ customer_feed_srv = adwords.service(:CustomerFeedService, API_VERSION)
43
+ ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)
44
+
45
+ # First, create a customizer feed. One feed per account can be used for
46
+ # all ads.
47
+ customizer_feed = {
48
+ :name => 'CustomizerFeed',
49
+ :attributes => [
50
+ {:type => 'STRING', :name => 'Name'},
51
+ {:type => 'STRING', :name => 'Price'},
52
+ {:type => 'DATE_TIME', :name => 'Date'}
53
+ ]
54
+ }
55
+
56
+ response = feed_srv.mutate([
57
+ {:operator => 'ADD', :operand => customizer_feed}
58
+ ])
59
+
60
+ feed_data = {}
61
+ if response and response[:value]
62
+ feed = response[:value].first
63
+ feed_data = {
64
+ :feed_id => feed[:id],
65
+ :name_id => feed[:attributes][0][:id],
66
+ :price_id => feed[:attributes][1][:id],
67
+ :date_id => feed[:attributes][2][:id]
68
+ }
69
+ puts "Feed with name '%s' and ID %d was added with:" %
70
+ [feed[:name], feed[:id]]
71
+ puts ("\tName attribute ID %d and price attribute ID %d " +
72
+ "and date attribute ID %d.") % [
73
+ feed_data[:name_id],
74
+ feed_data[:price_id],
75
+ feed_data[:date_id]
76
+ ]
77
+ else
78
+ raise new StandardError, 'No feeds were added.'
79
+ end
80
+
81
+ # Creating feed mapping to map the fields with customizer IDs.
82
+ feed_mapping = {
83
+ :placeholder_type => PLACEHOLDER_AD_CUSTOMIZER,
84
+ :feed_id => feed_data[:feed_id],
85
+ :attribute_field_mappings => [
86
+ {
87
+ :feed_attribute_id => feed_data[:name_id],
88
+ :field_id => PLACEHOLDER_FIELD_STRING
89
+ },
90
+ {
91
+ :feed_attribute_id => feed_data[:price_id],
92
+ :field_id => PLACEHOLDER_FIELD_PRICE
93
+ },
94
+ {
95
+ :feed_attribute_id => feed_data[:date_id],
96
+ :field_id => PLACEHOLDER_FIELD_DATE
97
+ }
98
+ ]
99
+ }
100
+
101
+ response = feed_mapping_srv.mutate([
102
+ {:operator => 'ADD', :operand => feed_mapping}
103
+ ])
104
+ if response and response[:value]
105
+ feed_mapping = response[:value].first
106
+ puts ('Feed mapping with ID %d and placeholder type %d was saved for feed' +
107
+ ' with ID %d.') % [
108
+ feed_mapping[:feed_mapping_id],
109
+ feed_mapping[:placeholder_type],
110
+ feed_mapping[:feed_id]
111
+ ]
112
+ else
113
+ raise new StandardError, 'No feed mappings were added.'
114
+ end
115
+
116
+ # Now adding feed items -- the values we'd like to place.
117
+ items_data = [
118
+ {
119
+ :name => 'Mars',
120
+ :price => '$1234.56',
121
+ :date => '20140601 000000',
122
+ :ad_group_id => ad_group_ids[0]
123
+ },
124
+ {
125
+ :name => 'Venus',
126
+ :price => '$1450.00',
127
+ :date => '20140615 120000',
128
+ :ad_group_id => ad_group_ids[1]
129
+ }
130
+ ]
131
+
132
+ feed_items = items_data.map do |item|
133
+ {
134
+ :feed_id => feed_data[:feed_id],
135
+ :attribute_values => [
136
+ {
137
+ :feed_attribute_id => feed_data[:name_id],
138
+ :string_value => item[:name]
139
+ },
140
+ {
141
+ :feed_attribute_id => feed_data[:price_id],
142
+ :string_value => item[:price]
143
+ },
144
+ {
145
+ :feed_attribute_id => feed_data[:date_id],
146
+ :string_value => item[:date]
147
+ }
148
+ ],
149
+ :ad_group_targeting => {
150
+ :targeting_ad_group_id => item[:ad_group_id]
151
+ }
152
+ }
153
+ end
154
+
155
+ feed_items_operations = feed_items.map do |item|
156
+ {:operator => 'ADD', :operand => item}
157
+ end
158
+
159
+ response = feed_item_srv.mutate(feed_items_operations)
160
+ if response and response[:value]
161
+ response[:value].each do |feed_item|
162
+ puts 'Feed item with ID %d was added.' % feed_item[:feed_item_id]
163
+ end
164
+ else
165
+ raise new StandardError, 'No feed items were added.'
166
+ end
167
+
168
+ # Finally, creating a customer (account-level) feed with a matching function
169
+ # that determines when to use this feed. For this case we use the "IDENTITY"
170
+ # matching function that is always 'true' just to associate this feed with
171
+ # the customer. The targeting is done within the feed items using the
172
+ # :campaign_targeting, :ad_group_targeting, or :keyword_targeting attributes.
173
+ matching_function = {
174
+ :operator => 'IDENTITY',
175
+ :lhs_operand => [
176
+ {
177
+ :xsi_type => 'ConstantOperand',
178
+ :type => 'BOOLEAN',
179
+ :boolean_value => true
180
+ }
181
+ ]
182
+ }
183
+
184
+ customer_feed = {
185
+ :feed_id => feed_data[:feed_id],
186
+ :matching_function => matching_function,
187
+ :placeholder_types => [PLACEHOLDER_AD_CUSTOMIZER]
188
+ }
189
+
190
+ response = customer_feed_srv.mutate([
191
+ {:operator => 'ADD', :operand => customer_feed}
192
+ ])
193
+ if response and response[:value]
194
+ feed = response[:value].first
195
+ puts 'Customer feed with ID %d was added.' % [feed[:feed_id]]
196
+ else
197
+ raise new StandardError, 'No customer feeds were added.'
198
+ end
199
+
200
+ # All set! We can now create ads with customizations.
201
+ text_ad = {
202
+ :xsi_type => 'TextAd',
203
+ :headline => 'Luxury Cruise to {=CustomizerFeed.Name}',
204
+ :description1 => 'Only {=CustomizerFeed.Price}',
205
+ :description2 => 'Offer ends in {=countdown(CustomizerFeed.Date)}!',
206
+ :final_urls => ['http://www.example.com'],
207
+ :display_url => 'www.example.com'
208
+ }
209
+
210
+ # We add the same ad to both ad groups. When they serve, they will show
211
+ # different values, since they match different feed items.
212
+ operations = ad_group_ids.map do |ad_group_id|
213
+ {
214
+ :operator => 'ADD',
215
+ :operand => {
216
+ :ad_group_id => ad_group_id,
217
+ :ad => text_ad
218
+ }
219
+ }
220
+ end
221
+
222
+ response = ad_group_ad_srv.mutate(operations)
223
+ if response and response[:value]
224
+ ads = response[:value]
225
+ ads.each do |ad|
226
+ puts "\tCreated an ad with ID %d, type '%s' and status '%s'" %
227
+ [ad[:ad][:id], ad[:ad][:ad_type], ad[:status]]
228
+ end
229
+ else
230
+ raise StandardError, 'No ads were added.'
231
+ end
232
+ end
233
+
234
+ if __FILE__ == $0
235
+ API_VERSION = :v201502
236
+
237
+ # See the Placeholder reference page for a list of all the placeholder types
238
+ # and fields:
239
+ # https://developers.google.com/adwords/api/docs/appendix/placeholders
240
+ PLACEHOLDER_AD_CUSTOMIZER = 10
241
+ PLACEHOLDER_FIELD_INTEGER = 1
242
+ PLACEHOLDER_FIELD_FLOAT = 2
243
+ PLACEHOLDER_FIELD_PRICE = 3
244
+ PLACEHOLDER_FIELD_DATE = 4
245
+ PLACEHOLDER_FIELD_STRING = 5
246
+
247
+ begin
248
+ ad_group_ids = [
249
+ 'INSERT_AD_GROUP_ID_HERE'.to_i,
250
+ 'INSERT_AD_GROUP_ID_HERE'.to_i
251
+ ]
252
+ add_ad_customizer(ad_group_ids)
253
+
254
+ # Authorization error.
255
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
256
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
257
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
258
+ "to retrieve and store OAuth2 tokens."
259
+ puts "See this wiki page for more details:\n\n " +
260
+ 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
261
+
262
+ # HTTP errors.
263
+ rescue AdsCommon::Errors::HttpError => e
264
+ puts "HTTP Error: %s" % e
265
+
266
+ # API errors.
267
+ rescue AdwordsApi::Errors::ApiException => e
268
+ puts "Message: %s" % e.message
269
+ puts 'Errors:'
270
+ e.errors.each_with_index do |error, index|
271
+ puts "\tError [%d]:" % (index + 1)
272
+ error.each do |field, value|
273
+ puts "\t\t%s: %s" % [field, value]
274
+ end
275
+ end
276
+ end
277
+ end