google-adwords-api 0.15.1 → 0.15.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 (166) hide show
  1. checksums.yaml +8 -8
  2. data/ChangeLog +4 -0
  3. data/examples/v201502/extensions/add_google_my_business_location_extensions.rb +4 -4
  4. data/examples/v201506/account_management/create_account.rb +92 -0
  5. data/examples/v201506/account_management/get_account_changes.rb +143 -0
  6. data/examples/v201506/account_management/get_account_hierarchy.rb +98 -0
  7. data/examples/v201506/advanced_operations/add_ad_customizers.rb +189 -0
  8. data/examples/v201506/advanced_operations/add_ad_group_bid_modifier.rb +105 -0
  9. data/examples/v201506/advanced_operations/add_click_to_download_ad.rb +137 -0
  10. data/examples/v201506/advanced_operations/add_text_ad_with_upgraded_urls.rb +138 -0
  11. data/examples/v201506/advanced_operations/create_and_attach_shared_keyword_set.rb +137 -0
  12. data/examples/v201506/advanced_operations/find_and_remove_criteria_from_shared_set.rb +171 -0
  13. data/examples/v201506/advanced_operations/get_ad_group_bid_modifiers.rb +106 -0
  14. data/examples/v201506/advanced_operations/upload_offline_conversions.rb +117 -0
  15. data/examples/v201506/advanced_operations/use_shared_bidding_strategy.rb +152 -0
  16. data/examples/v201506/basic_operations/add_ad_groups.rb +144 -0
  17. data/examples/v201506/basic_operations/add_campaigns.rb +143 -0
  18. data/examples/v201506/basic_operations/add_keywords.rb +118 -0
  19. data/examples/v201506/basic_operations/add_text_ads.rb +113 -0
  20. data/examples/v201506/basic_operations/get_ad_groups.rb +106 -0
  21. data/examples/v201506/basic_operations/get_campaigns.rb +101 -0
  22. data/examples/v201506/basic_operations/get_campaigns_with_awql.rb +93 -0
  23. data/examples/v201506/basic_operations/get_keywords.rb +112 -0
  24. data/examples/v201506/basic_operations/get_text_ads.rb +114 -0
  25. data/examples/v201506/basic_operations/pause_ad.rb +92 -0
  26. data/examples/v201506/basic_operations/remove_ad.rb +93 -0
  27. data/examples/v201506/basic_operations/remove_ad_group.rb +89 -0
  28. data/examples/v201506/basic_operations/remove_campaign.rb +91 -0
  29. data/examples/v201506/basic_operations/remove_keyword.rb +98 -0
  30. data/examples/v201506/basic_operations/update_ad_group.rb +89 -0
  31. data/examples/v201506/basic_operations/update_campaign.rb +90 -0
  32. data/examples/v201506/basic_operations/update_keyword.rb +110 -0
  33. data/examples/v201506/campaign_management/add_campaign_labels.rb +86 -0
  34. data/examples/v201506/campaign_management/add_experiment.rb +166 -0
  35. data/examples/v201506/campaign_management/add_keywords_in_bulk.rb +158 -0
  36. data/examples/v201506/campaign_management/get_all_disapproved_ads.rb +101 -0
  37. data/examples/v201506/campaign_management/get_all_disapproved_ads_with_awql.rb +93 -0
  38. data/examples/v201506/campaign_management/get_campaigns_by_label.rb +112 -0
  39. data/examples/v201506/campaign_management/promote_experiment.rb +85 -0
  40. data/examples/v201506/campaign_management/set_ad_parameters.rb +122 -0
  41. data/examples/v201506/campaign_management/set_criterion_bid_modifier.rb +108 -0
  42. data/examples/v201506/campaign_management/validate_text_ad.rb +114 -0
  43. data/examples/v201506/error_handling/handle_partial_failures.rb +134 -0
  44. data/examples/v201506/error_handling/handle_policy_violation_error.rb +145 -0
  45. data/examples/v201506/extensions/add_google_my_business_location_extensions.rb +190 -0
  46. data/examples/v201506/extensions/add_site_links.rb +168 -0
  47. data/examples/v201506/extensions/add_site_links_using_feeds.rb +276 -0
  48. data/examples/v201506/migration/migrate_to_extension_settings.rb +392 -0
  49. data/examples/v201506/migration/upgrade_ad_url.rb +97 -0
  50. data/examples/v201506/misc/create_ad_words_session_without_properties_file.rb +94 -0
  51. data/examples/v201506/misc/get_all_images_and_videos.rb +108 -0
  52. data/examples/v201506/misc/setup_oauth2.rb +88 -0
  53. data/examples/v201506/misc/upload_image.rb +97 -0
  54. data/examples/v201506/misc/use_oauth2_jwt.rb +97 -0
  55. data/examples/v201506/optimization/estimate_keyword_traffic.rb +150 -0
  56. data/examples/v201506/optimization/get_keyword_bid_simulations.rb +99 -0
  57. data/examples/v201506/optimization/get_keyword_ideas.rb +130 -0
  58. data/examples/v201506/remarketing/add_audience.rb +122 -0
  59. data/examples/v201506/remarketing/add_conversion_tracker.rb +104 -0
  60. data/examples/v201506/remarketing/add_rule_based_user_lists.rb +171 -0
  61. data/examples/v201506/reporting/download_criteria_report.rb +94 -0
  62. data/examples/v201506/reporting/download_criteria_report_with_awql.rb +95 -0
  63. data/examples/v201506/reporting/get_report_fields.rb +79 -0
  64. data/examples/v201506/reporting/parallel_report_download.rb +168 -0
  65. data/examples/v201506/shopping_campaigns/add_product_partition_tree.rb +269 -0
  66. data/examples/v201506/shopping_campaigns/add_product_scope.rb +133 -0
  67. data/examples/v201506/shopping_campaigns/add_shopping_campaign.rb +133 -0
  68. data/examples/v201506/shopping_campaigns/get_product_category_taxonomy.rb +117 -0
  69. data/examples/v201506/targeting/add_campaign_targeting_criteria.rb +184 -0
  70. data/examples/v201506/targeting/add_demographic_targeting_criteria.rb +116 -0
  71. data/examples/v201506/targeting/get_campaign_targeting_criteria.rb +110 -0
  72. data/examples/v201506/targeting/get_targetable_languages_and_carriers.rb +94 -0
  73. data/examples/v201506/targeting/lookup_location.rb +112 -0
  74. data/lib/adwords_api.rb +9 -0
  75. data/lib/adwords_api/api_config.rb +90 -4
  76. data/lib/adwords_api/report_header_handler.rb +5 -0
  77. data/lib/adwords_api/v201506/account_label_service.rb +38 -0
  78. data/lib/adwords_api/v201506/account_label_service_registry.rb +46 -0
  79. data/lib/adwords_api/v201506/ad_customizer_feed_service.rb +38 -0
  80. data/lib/adwords_api/v201506/ad_customizer_feed_service_registry.rb +46 -0
  81. data/lib/adwords_api/v201506/ad_group_ad_service.rb +50 -0
  82. data/lib/adwords_api/v201506/ad_group_ad_service_registry.rb +46 -0
  83. data/lib/adwords_api/v201506/ad_group_bid_modifier_service.rb +42 -0
  84. data/lib/adwords_api/v201506/ad_group_bid_modifier_service_registry.rb +46 -0
  85. data/lib/adwords_api/v201506/ad_group_criterion_service.rb +46 -0
  86. data/lib/adwords_api/v201506/ad_group_criterion_service_registry.rb +46 -0
  87. data/lib/adwords_api/v201506/ad_group_extension_setting_service.rb +42 -0
  88. data/lib/adwords_api/v201506/ad_group_extension_setting_service_registry.rb +46 -0
  89. data/lib/adwords_api/v201506/ad_group_feed_service.rb +42 -0
  90. data/lib/adwords_api/v201506/ad_group_feed_service_registry.rb +46 -0
  91. data/lib/adwords_api/v201506/ad_group_service.rb +46 -0
  92. data/lib/adwords_api/v201506/ad_group_service_registry.rb +46 -0
  93. data/lib/adwords_api/v201506/ad_param_service.rb +38 -0
  94. data/lib/adwords_api/v201506/ad_param_service_registry.rb +46 -0
  95. data/lib/adwords_api/v201506/adwords_user_list_service.rb +38 -0
  96. data/lib/adwords_api/v201506/adwords_user_list_service_registry.rb +46 -0
  97. data/lib/adwords_api/v201506/bidding_strategy_service.rb +42 -0
  98. data/lib/adwords_api/v201506/bidding_strategy_service_registry.rb +46 -0
  99. data/lib/adwords_api/v201506/budget_order_service.rb +42 -0
  100. data/lib/adwords_api/v201506/budget_order_service_registry.rb +46 -0
  101. data/lib/adwords_api/v201506/budget_service.rb +42 -0
  102. data/lib/adwords_api/v201506/budget_service_registry.rb +46 -0
  103. data/lib/adwords_api/v201506/campaign_criterion_service.rb +42 -0
  104. data/lib/adwords_api/v201506/campaign_criterion_service_registry.rb +46 -0
  105. data/lib/adwords_api/v201506/campaign_extension_setting_service.rb +42 -0
  106. data/lib/adwords_api/v201506/campaign_extension_setting_service_registry.rb +46 -0
  107. data/lib/adwords_api/v201506/campaign_feed_service.rb +42 -0
  108. data/lib/adwords_api/v201506/campaign_feed_service_registry.rb +46 -0
  109. data/lib/adwords_api/v201506/campaign_service.rb +46 -0
  110. data/lib/adwords_api/v201506/campaign_service_registry.rb +46 -0
  111. data/lib/adwords_api/v201506/campaign_shared_set_service.rb +42 -0
  112. data/lib/adwords_api/v201506/campaign_shared_set_service_registry.rb +46 -0
  113. data/lib/adwords_api/v201506/constant_data_service.rb +66 -0
  114. data/lib/adwords_api/v201506/constant_data_service_registry.rb +46 -0
  115. data/lib/adwords_api/v201506/conversion_tracker_service.rb +42 -0
  116. data/lib/adwords_api/v201506/conversion_tracker_service_registry.rb +46 -0
  117. data/lib/adwords_api/v201506/customer_extension_setting_service.rb +42 -0
  118. data/lib/adwords_api/v201506/customer_extension_setting_service_registry.rb +46 -0
  119. data/lib/adwords_api/v201506/customer_feed_service.rb +42 -0
  120. data/lib/adwords_api/v201506/customer_feed_service_registry.rb +46 -0
  121. data/lib/adwords_api/v201506/customer_service.rb +38 -0
  122. data/lib/adwords_api/v201506/customer_service_registry.rb +46 -0
  123. data/lib/adwords_api/v201506/customer_sync_service.rb +34 -0
  124. data/lib/adwords_api/v201506/customer_sync_service_registry.rb +47 -0
  125. data/lib/adwords_api/v201506/data_service.rb +54 -0
  126. data/lib/adwords_api/v201506/data_service_registry.rb +46 -0
  127. data/lib/adwords_api/v201506/experiment_service.rb +38 -0
  128. data/lib/adwords_api/v201506/experiment_service_registry.rb +46 -0
  129. data/lib/adwords_api/v201506/feed_item_service.rb +42 -0
  130. data/lib/adwords_api/v201506/feed_item_service_registry.rb +46 -0
  131. data/lib/adwords_api/v201506/feed_mapping_service.rb +42 -0
  132. data/lib/adwords_api/v201506/feed_mapping_service_registry.rb +46 -0
  133. data/lib/adwords_api/v201506/feed_service.rb +42 -0
  134. data/lib/adwords_api/v201506/feed_service_registry.rb +46 -0
  135. data/lib/adwords_api/v201506/geo_location_service.rb +34 -0
  136. data/lib/adwords_api/v201506/geo_location_service_registry.rb +46 -0
  137. data/lib/adwords_api/v201506/label_service.rb +42 -0
  138. data/lib/adwords_api/v201506/label_service_registry.rb +46 -0
  139. data/lib/adwords_api/v201506/location_criterion_service.rb +38 -0
  140. data/lib/adwords_api/v201506/location_criterion_service_registry.rb +46 -0
  141. data/lib/adwords_api/v201506/managed_customer_service.rb +54 -0
  142. data/lib/adwords_api/v201506/managed_customer_service_registry.rb +46 -0
  143. data/lib/adwords_api/v201506/media_service.rb +42 -0
  144. data/lib/adwords_api/v201506/media_service_registry.rb +46 -0
  145. data/lib/adwords_api/v201506/mutate_job_service.rb +42 -0
  146. data/lib/adwords_api/v201506/mutate_job_service_registry.rb +46 -0
  147. data/lib/adwords_api/v201506/offline_conversion_feed_service.rb +34 -0
  148. data/lib/adwords_api/v201506/offline_conversion_feed_service_registry.rb +46 -0
  149. data/lib/adwords_api/v201506/report_definition_service.rb +34 -0
  150. data/lib/adwords_api/v201506/report_definition_service_registry.rb +46 -0
  151. data/lib/adwords_api/v201506/shared_criterion_service.rb +42 -0
  152. data/lib/adwords_api/v201506/shared_criterion_service_registry.rb +46 -0
  153. data/lib/adwords_api/v201506/shared_set_service.rb +42 -0
  154. data/lib/adwords_api/v201506/shared_set_service_registry.rb +46 -0
  155. data/lib/adwords_api/v201506/targeting_idea_service.rb +34 -0
  156. data/lib/adwords_api/v201506/targeting_idea_service_registry.rb +46 -0
  157. data/lib/adwords_api/v201506/traffic_estimator_service.rb +34 -0
  158. data/lib/adwords_api/v201506/traffic_estimator_service_registry.rb +46 -0
  159. data/lib/adwords_api/version.rb +1 -1
  160. data/test/adwords_api/test_adwords_api.rb +1 -1
  161. data/test/adwords_api/test_api_config.rb +8 -8
  162. data/test/adwords_api/test_choices.rb +2 -2
  163. data/test/adwords_api/test_report_utils.rb +1 -1
  164. data/test/templates/v201506/basic_operations_get_campaigns.def +116 -0
  165. data/test/templates/v201506/misc_use_oauth2_jwt.def +131 -0
  166. metadata +156 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OWQzMDNlMDY2NjU2NDY0NjU0ZjMzMjRlZGMwYjJhOTdkMzcwMjEwYw==
4
+ ZDg4YzZmNzUwODM5MWQ2NWNmYmI5YTNmYmRlMmYxNmU0OThhZTRiMQ==
5
5
  data.tar.gz: !binary |-
6
- ZTBiMWQwYjRmMmUzMTIxZGQ4OWJhNWZlYjU4ZWEwNDUyM2MwMWIwZQ==
6
+ MzdkMTRhYjNiMGMzZjE4ZjZlZGI5OTVhOGM4ODU4OTZkNDEwMjE5Ng==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZDM4ZmIxMjg1M2RkY2EwODZjMzU3OGYxNDM4YWZlZGQ1NjY1NzVmZGFlYzJl
10
- MzA3YTI4MDFjNGIyZTkxOWZkYWVhZTQ0MTlkOTM3MDdlNmRiZTNkMDdjN2M4
11
- YmE0MDA0YTg1ZTBlZjIyZTY4YmEyMWE2MTk5Y2E2NjM4MWJkMWE=
9
+ NTgxZGM4YzEwNWE4M2IyZTJmMzhhMmIyODllZGI0YjQ0N2Q4NDQ3YjJkYThi
10
+ NjM4MGFkMzU4OTFhM2IyZWFhYzY3MmYwMTU3NzJmZGE5NGE1M2RjYWM5OTgx
11
+ ZTVlOTNjMmJiOGI4Y2ZjNGRkZDZkOTJhNmE0NzU3M2EwM2ZkMTA=
12
12
  data.tar.gz: !binary |-
13
- N2M1MWNiMjQ3NjIzYTA5MjFjNTE5ZTE4NzhhMWJiNGY5Yjc4NDkwNTRkMGNl
14
- MzMyY2M1OWMzOWVkNmQwOTkxZmNjMGJhZDEwZTUyOTY1OWM3ZTJkZjAwZmU3
15
- NDliMDNjYjRlMzkwMzg0ZDNiYWY4OTNmNGExMDE4MWY0MDczZjc=
13
+ ZGQwOGE0MDNkM2QzZmIyNWY3ZTZiZGRlNmJlNzc4ZDcwOWQ1NDE3Y2NmYjU4
14
+ ZmU5ODBlODU3Mzk4Yzc4YzZlOWJmOTEzNDdmZjQxMzFlNWM2YzQyOWU0ZTY5
15
+ ODkwN2VkNGI4NDViN2IyOTZiMjBjY2ZiMDM2NzZhODVhNTk5MzY=
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ 0.15.2:
2
+ - Support and examples for v201502.
3
+ - Added support for including zero impression rows in reports via HTTP header.
4
+
1
5
  0.15.1:
2
6
  - Allowing requests without CID specified for use with CustomerService.
3
7
 
@@ -77,14 +77,14 @@ def add_gmb_location_extensions(gmb_email_address, gmb_access_token,
77
77
  # LOCATION placeholder type.
78
78
  customer_feed = {
79
79
  :feed_id => added_feed[:id],
80
- :placeholder_types => PLACEHOLDER_TYPE_LOCATION,
80
+ :placeholder_types => [PLACEHOLDER_TYPE_LOCATION],
81
81
  :matching_function => {
82
82
  :operator => 'IDENTITY',
83
- :lhsOperand => {
83
+ :lhs_operand => [{
84
84
  :xsi_type => 'ConstantOperand',
85
85
  :type => 'BOOLEAN',
86
86
  :boolean_value => true
87
- }
87
+ }]
88
88
  }
89
89
  }
90
90
 
@@ -146,7 +146,7 @@ if __FILE__ == $0
146
146
  # the generated access token
147
147
  gmb_access_token = 'INSERT_GMB_OAUTH_ACCESS_TOKEN_HERE'
148
148
 
149
- # If the gmb_email_address above is for a GMB manager instead of
149
+ # If the gmb_email_address above is for a GMB manager instead of
150
150
  # the GMB account owner, then set business_account_identifier to the
151
151
  # +Page ID of a location for which the manager has access. See the
152
152
  # location extensions guide at
@@ -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 = :v201506
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 "\tRemoved ad extensions: '%s'" %
86
+ campaign[:removed_ad_extensions].pretty_inspect.chomp
87
+ puts "\tRemoved campaign criteria: '%s'" %
88
+ campaign[:removed_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 removed: '%s'" %
102
+ ad_group[:removed_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 = :v201506
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 = :v201506
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,189 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.mcloonan@gmail.com (Michael Cloonan)
5
+ #
6
+ # Copyright:: Copyright 2015, 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 using Extension Services. Then it adds
22
+ # an ad that uses the feed to populate dynamic data.
23
+ #
24
+ # Tags: AdCustomizerFeedService.mutate, FeedItemService.mutate
25
+ # Tags: AdGroupAdService.mutate
26
+
27
+ require 'adwords_api'
28
+ require 'date'
29
+
30
+ def add_ad_customizers(feed_name, 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_item_srv = adwords.service(:FeedItemService, API_VERSION)
40
+ ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)
41
+
42
+ # Create a customizer feed. One feed per account can be used for all ads.
43
+ feed_data = create_customizer_feed(adwords, feed_name)
44
+
45
+ # Now adding feed items -- the values we'd like to place.
46
+ now_date = Date.today()
47
+
48
+ items_data = [
49
+ {
50
+ :name => 'Mars',
51
+ :price => '$1234.56',
52
+ :date => now_date.strftime('%Y%m01 000000'),
53
+ :ad_group_id => ad_group_ids[0]
54
+ },
55
+ {
56
+ :name => 'Venus',
57
+ :price => '$1450.00',
58
+ :date => now_date.strftime('%Y%m15 000000'),
59
+ :ad_group_id => ad_group_ids[1]
60
+ }
61
+ ]
62
+
63
+ feed_items = items_data.map do |item|
64
+ {
65
+ :feed_id => feed_data[:feed_id],
66
+ :attribute_values => [
67
+ {
68
+ :feed_attribute_id => feed_data[:name_id],
69
+ :string_value => item[:name]
70
+ },
71
+ {
72
+ :feed_attribute_id => feed_data[:price_id],
73
+ :string_value => item[:price]
74
+ },
75
+ {
76
+ :feed_attribute_id => feed_data[:date_id],
77
+ :string_value => item[:date]
78
+ }
79
+ ],
80
+ :ad_group_targeting => {
81
+ :targeting_ad_group_id => item[:ad_group_id]
82
+ }
83
+ }
84
+ end
85
+
86
+ feed_items_operations = feed_items.map do |item|
87
+ {:operator => 'ADD', :operand => item}
88
+ end
89
+
90
+ response = feed_item_srv.mutate(feed_items_operations)
91
+ if response and response[:value]
92
+ response[:value].each do |feed_item|
93
+ puts 'Feed item with ID %d was added.' % feed_item[:feed_item_id]
94
+ end
95
+ else
96
+ raise new StandardError, 'No feed items were added.'
97
+ end
98
+
99
+ # All set! We can now create ads with customizations.
100
+ text_ad = {
101
+ :xsi_type => 'TextAd',
102
+ :headline => 'Luxury Cruise to {=%s.Name}' % feed_name,
103
+ :description1 => 'Only {=%s.Price}' % feed_name,
104
+ :description2 => 'Offer ends in {=countdown(%s.Date)}!' % feed_name,
105
+ :final_urls => ['http://www.example.com'],
106
+ :display_url => 'www.example.com'
107
+ }
108
+
109
+ # We add the same ad to both ad groups. When they serve, they will show
110
+ # different values, since they match different feed items.
111
+ operations = ad_group_ids.map do |ad_group_id|
112
+ {
113
+ :operator => 'ADD',
114
+ :operand => {
115
+ :ad_group_id => ad_group_id,
116
+ :ad => text_ad.dup()
117
+ }
118
+ }
119
+ end
120
+
121
+ response = ad_group_ad_srv.mutate(operations)
122
+ if response and response[:value]
123
+ ads = response[:value]
124
+ ads.each do |ad|
125
+ puts "\tCreated an ad with ID %d, type '%s' and status '%s'" %
126
+ [ad[:ad][:id], ad[:ad][:ad_type], ad[:status]]
127
+ end
128
+ else
129
+ raise StandardError, 'No ads were added.'
130
+ end
131
+ end
132
+
133
+ def create_customizer_feed(adwords, feed_name)
134
+ ad_customizer_srv = adwords.service(:AdCustomizerFeedService, API_VERSION)
135
+ feed = {
136
+ :feed_name => feed_name,
137
+ :feed_attributes => [
138
+ {:name => 'Name', :type => 'STRING'},
139
+ {:name => 'Price', :type => 'PRICE'},
140
+ {:name => 'Date', :type => 'DATE_TIME'}
141
+ ]
142
+ }
143
+ operation = {:operand => feed, :operator => 'ADD'}
144
+ added_feed = ad_customizer_srv.mutate([operation])[:value].first()
145
+ puts "Created ad customizer feed with ID = %d and name = '%s'." %
146
+ [added_feed[:feed_id], added_feed[:feed_name]]
147
+ return {
148
+ :feed_id => added_feed[:feed_id],
149
+ :name_id => added_feed[:feed_attributes][0][:id],
150
+ :price_id => added_feed[:feed_attributes][1][:id],
151
+ :date_id => added_feed[:feed_attributes][2][:id]
152
+ }
153
+ end
154
+
155
+ if __FILE__ == $0
156
+ API_VERSION = :v201506
157
+
158
+ begin
159
+ feed_name = 'INSERT_FEED_NAME_HERE'.to_s
160
+ ad_group_ids = [
161
+ 'INSERT_AD_GROUP_ID_HERE'.to_i,
162
+ 'INSERT_AD_GROUP_ID_HERE'.to_i
163
+ ]
164
+ add_ad_customizers(feed_name, ad_group_ids)
165
+
166
+ # Authorization error.
167
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
168
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
169
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
170
+ "to retrieve and store OAuth2 tokens."
171
+ puts "See this wiki page for more details:\n\n " +
172
+ 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
173
+
174
+ # HTTP errors.
175
+ rescue AdsCommon::Errors::HttpError => e
176
+ puts "HTTP Error: %s" % e
177
+
178
+ # API errors.
179
+ rescue AdwordsApi::Errors::ApiException => e
180
+ puts "Message: %s" % e.message
181
+ puts 'Errors:'
182
+ e.errors.each_with_index do |error, index|
183
+ puts "\tError [%d]:" % (index + 1)
184
+ error.each do |field, value|
185
+ puts "\t\t%s: %s" % [field, value]
186
+ end
187
+ end
188
+ end
189
+ end