google-adwords-api 0.15.1 → 0.15.2

Sign up to get free protection for your applications and to get access to all the features.
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