google-adwords-api 0.18.0 → 0.18.1

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +8 -0
  3. data/examples/v201509/basic_operations/add_ad_groups.rb +4 -2
  4. data/examples/v201509/remarketing/add_crm_based_user_list.rb +2 -4
  5. data/examples/v201509/{advanced_operations → remarketing}/upload_offline_conversions.rb +6 -21
  6. data/examples/v201601/account_management/create_account.rb +88 -0
  7. data/examples/v201601/account_management/get_account_changes.rb +139 -0
  8. data/examples/v201601/account_management/get_account_hierarchy.rb +132 -0
  9. data/examples/v201601/advanced_operations/add_ad_customizers.rb +184 -0
  10. data/examples/v201601/advanced_operations/add_ad_group_bid_modifier.rb +101 -0
  11. data/examples/v201601/advanced_operations/add_click_to_download_ad.rb +133 -0
  12. data/examples/v201601/advanced_operations/add_html5_ad.rb +137 -0
  13. data/examples/v201601/advanced_operations/add_keywords_using_incremental_batch_job.rb +179 -0
  14. data/examples/v201601/advanced_operations/add_text_ad_with_upgraded_urls.rb +134 -0
  15. data/examples/v201601/advanced_operations/create_and_attach_shared_keyword_set.rb +141 -0
  16. data/examples/v201601/advanced_operations/find_and_remove_criteria_from_shared_set.rb +174 -0
  17. data/examples/v201601/advanced_operations/get_ad_group_bid_modifiers.rb +102 -0
  18. data/examples/v201601/advanced_operations/use_shared_bidding_strategy.rb +147 -0
  19. data/examples/v201601/basic_operations/add_ad_groups.rb +142 -0
  20. data/examples/v201601/basic_operations/add_campaigns.rb +139 -0
  21. data/examples/v201601/basic_operations/add_keywords.rb +114 -0
  22. data/examples/v201601/basic_operations/add_text_ads.rb +109 -0
  23. data/examples/v201601/basic_operations/get_ad_groups.rb +102 -0
  24. data/examples/v201601/basic_operations/get_campaigns.rb +97 -0
  25. data/examples/v201601/basic_operations/get_campaigns_with_awql.rb +89 -0
  26. data/examples/v201601/basic_operations/get_keywords.rb +109 -0
  27. data/examples/v201601/basic_operations/get_text_ads.rb +110 -0
  28. data/examples/v201601/basic_operations/pause_ad.rb +88 -0
  29. data/examples/v201601/basic_operations/remove_ad.rb +89 -0
  30. data/examples/v201601/basic_operations/remove_ad_group.rb +85 -0
  31. data/examples/v201601/basic_operations/remove_campaign.rb +87 -0
  32. data/examples/v201601/basic_operations/remove_keyword.rb +94 -0
  33. data/examples/v201601/basic_operations/update_ad_group.rb +85 -0
  34. data/examples/v201601/basic_operations/update_campaign.rb +86 -0
  35. data/examples/v201601/basic_operations/update_keyword.rb +106 -0
  36. data/examples/v201601/campaign_management/add_campaign_labels.rb +82 -0
  37. data/examples/v201601/campaign_management/add_complete_campaigns_using_batch_job.rb +356 -0
  38. data/examples/v201601/campaign_management/add_experiment.rb +162 -0
  39. data/examples/v201601/campaign_management/add_keywords_in_bulk.rb +153 -0
  40. data/examples/v201601/campaign_management/get_all_disapproved_ads.rb +97 -0
  41. data/examples/v201601/campaign_management/get_all_disapproved_ads_with_awql.rb +89 -0
  42. data/examples/v201601/campaign_management/get_campaigns_by_label.rb +108 -0
  43. data/examples/v201601/campaign_management/promote_experiment.rb +81 -0
  44. data/examples/v201601/campaign_management/set_ad_parameters.rb +118 -0
  45. data/examples/v201601/campaign_management/set_criterion_bid_modifier.rb +104 -0
  46. data/examples/v201601/campaign_management/validate_text_ad.rb +110 -0
  47. data/examples/v201601/error_handling/handle_partial_failures.rb +130 -0
  48. data/examples/v201601/error_handling/handle_policy_violation_error.rb +141 -0
  49. data/examples/v201601/extensions/add_google_my_business_location_extensions.rb +193 -0
  50. data/examples/v201601/extensions/add_site_links.rb +164 -0
  51. data/examples/v201601/extensions/add_site_links_using_feeds.rb +281 -0
  52. data/examples/v201601/migration/migrate_to_extension_settings.rb +386 -0
  53. data/examples/v201601/migration/upgrade_ad_url.rb +93 -0
  54. data/examples/v201601/misc/get_all_images_and_videos.rb +104 -0
  55. data/examples/v201601/misc/setup_oauth2.rb +84 -0
  56. data/examples/v201601/misc/upload_image.rb +93 -0
  57. data/examples/v201601/misc/upload_media_bundle.rb +90 -0
  58. data/examples/v201601/misc/use_oauth2_jwt.rb +93 -0
  59. data/examples/v201601/misc/use_runtime_config.rb +92 -0
  60. data/examples/v201601/optimization/estimate_keyword_traffic.rb +146 -0
  61. data/examples/v201601/optimization/get_keyword_bid_simulations.rb +95 -0
  62. data/examples/v201601/optimization/get_keyword_ideas.rb +126 -0
  63. data/examples/v201601/remarketing/add_audience.rb +118 -0
  64. data/examples/v201601/remarketing/add_conversion_tracker.rb +97 -0
  65. data/examples/v201601/remarketing/add_crm_based_user_list.rb +119 -0
  66. data/examples/v201601/remarketing/add_rule_based_user_lists.rb +167 -0
  67. data/examples/v201601/remarketing/upload_offline_conversions.rb +98 -0
  68. data/examples/v201601/reporting/download_criteria_report.rb +92 -0
  69. data/examples/v201601/reporting/download_criteria_report_with_awql.rb +93 -0
  70. data/examples/v201601/reporting/get_report_fields.rb +75 -0
  71. data/examples/v201601/reporting/parallel_report_download.rb +166 -0
  72. data/examples/v201601/reporting/stream_criteria_report_results.rb +97 -0
  73. data/examples/v201601/shopping_campaigns/add_product_partition_tree.rb +267 -0
  74. data/examples/v201601/shopping_campaigns/add_product_scope.rb +129 -0
  75. data/examples/v201601/shopping_campaigns/add_shopping_campaign.rb +129 -0
  76. data/examples/v201601/shopping_campaigns/get_product_category_taxonomy.rb +115 -0
  77. data/examples/v201601/targeting/add_campaign_targeting_criteria.rb +180 -0
  78. data/examples/v201601/targeting/add_demographic_targeting_criteria.rb +112 -0
  79. data/examples/v201601/targeting/get_campaign_targeting_criteria.rb +106 -0
  80. data/examples/v201601/targeting/get_targetable_languages_and_carriers.rb +89 -0
  81. data/examples/v201601/targeting/lookup_location.rb +108 -0
  82. data/lib/adwords_api/api_config.rb +90 -4
  83. data/lib/adwords_api/batch_job_utils.rb +29 -17
  84. data/lib/adwords_api/incremental_upload_helper.rb +5 -1
  85. data/lib/adwords_api/report_stream.rb +7 -8
  86. data/lib/adwords_api/report_utils.rb +4 -4
  87. data/lib/adwords_api/v201601/account_label_service.rb +46 -0
  88. data/lib/adwords_api/v201601/account_label_service_registry.rb +46 -0
  89. data/lib/adwords_api/v201601/ad_customizer_feed_service.rb +46 -0
  90. data/lib/adwords_api/v201601/ad_customizer_feed_service_registry.rb +46 -0
  91. data/lib/adwords_api/v201601/ad_group_ad_service.rb +70 -0
  92. data/lib/adwords_api/v201601/ad_group_ad_service_registry.rb +46 -0
  93. data/lib/adwords_api/v201601/ad_group_bid_modifier_service.rb +54 -0
  94. data/lib/adwords_api/v201601/ad_group_bid_modifier_service_registry.rb +46 -0
  95. data/lib/adwords_api/v201601/ad_group_criterion_service.rb +62 -0
  96. data/lib/adwords_api/v201601/ad_group_criterion_service_registry.rb +46 -0
  97. data/lib/adwords_api/v201601/ad_group_extension_setting_service.rb +54 -0
  98. data/lib/adwords_api/v201601/ad_group_extension_setting_service_registry.rb +46 -0
  99. data/lib/adwords_api/v201601/ad_group_feed_service.rb +54 -0
  100. data/lib/adwords_api/v201601/ad_group_feed_service_registry.rb +46 -0
  101. data/lib/adwords_api/v201601/ad_group_service.rb +62 -0
  102. data/lib/adwords_api/v201601/ad_group_service_registry.rb +46 -0
  103. data/lib/adwords_api/v201601/ad_param_service.rb +46 -0
  104. data/lib/adwords_api/v201601/ad_param_service_registry.rb +46 -0
  105. data/lib/adwords_api/v201601/adwords_user_list_service.rb +54 -0
  106. data/lib/adwords_api/v201601/adwords_user_list_service_registry.rb +46 -0
  107. data/lib/adwords_api/v201601/batch_job_service.rb +54 -0
  108. data/lib/adwords_api/v201601/batch_job_service_registry.rb +46 -0
  109. data/lib/adwords_api/v201601/bidding_strategy_service.rb +54 -0
  110. data/lib/adwords_api/v201601/bidding_strategy_service_registry.rb +46 -0
  111. data/lib/adwords_api/v201601/budget_order_service.rb +54 -0
  112. data/lib/adwords_api/v201601/budget_order_service_registry.rb +46 -0
  113. data/lib/adwords_api/v201601/budget_service.rb +54 -0
  114. data/lib/adwords_api/v201601/budget_service_registry.rb +46 -0
  115. data/lib/adwords_api/v201601/campaign_criterion_service.rb +54 -0
  116. data/lib/adwords_api/v201601/campaign_criterion_service_registry.rb +46 -0
  117. data/lib/adwords_api/v201601/campaign_extension_setting_service.rb +54 -0
  118. data/lib/adwords_api/v201601/campaign_extension_setting_service_registry.rb +46 -0
  119. data/lib/adwords_api/v201601/campaign_feed_service.rb +54 -0
  120. data/lib/adwords_api/v201601/campaign_feed_service_registry.rb +46 -0
  121. data/lib/adwords_api/v201601/campaign_service.rb +62 -0
  122. data/lib/adwords_api/v201601/campaign_service_registry.rb +46 -0
  123. data/lib/adwords_api/v201601/campaign_shared_set_service.rb +54 -0
  124. data/lib/adwords_api/v201601/campaign_shared_set_service_registry.rb +46 -0
  125. data/lib/adwords_api/v201601/constant_data_service.rb +110 -0
  126. data/lib/adwords_api/v201601/constant_data_service_registry.rb +46 -0
  127. data/lib/adwords_api/v201601/conversion_tracker_service.rb +54 -0
  128. data/lib/adwords_api/v201601/conversion_tracker_service_registry.rb +46 -0
  129. data/lib/adwords_api/v201601/customer_extension_setting_service.rb +54 -0
  130. data/lib/adwords_api/v201601/customer_extension_setting_service_registry.rb +46 -0
  131. data/lib/adwords_api/v201601/customer_feed_service.rb +54 -0
  132. data/lib/adwords_api/v201601/customer_feed_service_registry.rb +46 -0
  133. data/lib/adwords_api/v201601/customer_service.rb +54 -0
  134. data/lib/adwords_api/v201601/customer_service_registry.rb +46 -0
  135. data/lib/adwords_api/v201601/customer_sync_service.rb +38 -0
  136. data/lib/adwords_api/v201601/customer_sync_service_registry.rb +47 -0
  137. data/lib/adwords_api/v201601/data_service.rb +78 -0
  138. data/lib/adwords_api/v201601/data_service_registry.rb +46 -0
  139. data/lib/adwords_api/v201601/experiment_service.rb +46 -0
  140. data/lib/adwords_api/v201601/experiment_service_registry.rb +46 -0
  141. data/lib/adwords_api/v201601/feed_item_service.rb +54 -0
  142. data/lib/adwords_api/v201601/feed_item_service_registry.rb +46 -0
  143. data/lib/adwords_api/v201601/feed_mapping_service.rb +54 -0
  144. data/lib/adwords_api/v201601/feed_mapping_service_registry.rb +46 -0
  145. data/lib/adwords_api/v201601/feed_service.rb +54 -0
  146. data/lib/adwords_api/v201601/feed_service_registry.rb +46 -0
  147. data/lib/adwords_api/v201601/label_service.rb +54 -0
  148. data/lib/adwords_api/v201601/label_service_registry.rb +46 -0
  149. data/lib/adwords_api/v201601/location_criterion_service.rb +46 -0
  150. data/lib/adwords_api/v201601/location_criterion_service_registry.rb +46 -0
  151. data/lib/adwords_api/v201601/managed_customer_service.rb +78 -0
  152. data/lib/adwords_api/v201601/managed_customer_service_registry.rb +46 -0
  153. data/lib/adwords_api/v201601/media_service.rb +54 -0
  154. data/lib/adwords_api/v201601/media_service_registry.rb +46 -0
  155. data/lib/adwords_api/v201601/mutate_job_service.rb +54 -0
  156. data/lib/adwords_api/v201601/mutate_job_service_registry.rb +46 -0
  157. data/lib/adwords_api/v201601/offline_conversion_feed_service.rb +38 -0
  158. data/lib/adwords_api/v201601/offline_conversion_feed_service_registry.rb +46 -0
  159. data/lib/adwords_api/v201601/report_definition_service.rb +38 -0
  160. data/lib/adwords_api/v201601/report_definition_service_registry.rb +46 -0
  161. data/lib/adwords_api/v201601/shared_criterion_service.rb +54 -0
  162. data/lib/adwords_api/v201601/shared_criterion_service_registry.rb +46 -0
  163. data/lib/adwords_api/v201601/shared_set_service.rb +54 -0
  164. data/lib/adwords_api/v201601/shared_set_service_registry.rb +46 -0
  165. data/lib/adwords_api/v201601/targeting_idea_service.rb +38 -0
  166. data/lib/adwords_api/v201601/targeting_idea_service_registry.rb +46 -0
  167. data/lib/adwords_api/v201601/traffic_estimator_service.rb +38 -0
  168. data/lib/adwords_api/v201601/traffic_estimator_service_registry.rb +46 -0
  169. data/lib/adwords_api/version.rb +1 -1
  170. data/test/adwords_api/test_batch_job_utils.rb +11 -2
  171. metadata +163 -5
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This example creates an experiment using a query percentage of 10, which
20
+ # defines what fraction of auctions should go to the control split (90%) vs.
21
+ # the experiment split (10%), then adds experimental bid changes for criteria
22
+ # and ad groups. To get campaigns, run get_campaigns.rb. To get ad groups,
23
+ # run get_ad_groups.rb. To get keywords, run get_keywords.rb.
24
+
25
+ require 'adwords_api'
26
+ require 'date'
27
+
28
+ def add_experiment(campaign_id, ad_group_id, criterion_id)
29
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
+ # when called without parameters.
31
+ adwords = AdwordsApi::Api.new
32
+
33
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
+ # the configuration file or provide your own logger:
35
+ # adwords.logger = Logger.new('adwords_xml.log')
36
+
37
+ experiment_srv = adwords.service(:ExperimentService, API_VERSION)
38
+ ad_group_srv = adwords.service(:AdGroupService, API_VERSION)
39
+ ad_group_criterion_srv =
40
+ adwords.service(:AdGroupCriterionService, API_VERSION)
41
+
42
+ # Prepare for adding experiment.
43
+ operation = {
44
+ :operator => 'ADD',
45
+ :operand => {
46
+ :campaign_id => campaign_id,
47
+ :name => "Interplanetary Experiment #%d" % (Time.new.to_f * 1000).to_i,
48
+ :query_percentage => 10,
49
+ :start_date_time => Time.now.strftime('%Y%m%d %H%M%S'),
50
+ # Optional fields:
51
+ :status => 'ENABLED',
52
+ :end_date_time =>
53
+ DateTime.parse((Date.today + 30).to_s).strftime('%Y%m%d %H%M%S')
54
+ }
55
+ }
56
+
57
+ # Add experiment.
58
+ response = experiment_srv.mutate([operation])
59
+ experiment = response[:value].first
60
+ puts "Experiment with name '%s' and ID %d was added." %
61
+ [experiment[:name], experiment[:id]]
62
+
63
+ experiment_id = experiment[:id]
64
+
65
+ # Setup ad group for the experiment.
66
+ ad_group = {
67
+ :id => ad_group_id,
68
+ # Set experiment data for the ad group.
69
+ :experiment_data => {
70
+ :experiment_id => experiment_id,
71
+ :experiment_delta_status => 'MODIFIED',
72
+ # Bid multiplier rule that will modify ad group bid for the experiment.
73
+ :experiment_bid_multipliers => {
74
+ :xsi_type => 'ManualCPCAdGroupExperimentBidMultipliers',
75
+ :max_cpc_multiplier => {
76
+ :multiplier => 1.5
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ # Prepare for updating ad group.
83
+ operation = {
84
+ :operator => 'SET',
85
+ :operand => ad_group
86
+ }
87
+
88
+ # Update ad group.
89
+ response = ad_group_srv.mutate([operation])
90
+ ad_group = response[:value].first
91
+ puts "Ad group ID %d was updated for the experiment." % ad_group[:id]
92
+
93
+ # Setup ad group criterion for the experiment.
94
+ ad_group_criterion = {
95
+ :xsi_type => 'BiddableAdGroupCriterion',
96
+ :ad_group_id => ad_group_id,
97
+ :criterion => {
98
+ :id => criterion_id
99
+ },
100
+ # Set experiment data for the criterion.
101
+ :experiment_data => {
102
+ :xsi_type => 'BiddableAdGroupCriterionExperimentData',
103
+ :experiment_id => experiment_id,
104
+ :experiment_delta_status => 'MODIFIED',
105
+ # Bid multiplier rule that will modify criterion bid for the experiment.
106
+ :experiment_bid_multiplier => {
107
+ :xsi_type => 'ManualCPCAdGroupCriterionExperimentBidMultiplier',
108
+ :max_cpc_multiplier => {
109
+ :multiplier => 1.5
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ # Prepare for updating ad group criterion.
116
+ operation = {
117
+ :operator => 'SET',
118
+ :operand => ad_group_criterion
119
+ }
120
+
121
+ # Update criterion.
122
+ response = ad_group_criterion_srv.mutate([operation])
123
+ criterion = response[:value].first
124
+ puts "Criterion ID %d was successfully updated for the experiment." %
125
+ [criterion[:criterion][:id]]
126
+
127
+ end
128
+
129
+ if __FILE__ == $0
130
+ API_VERSION = :v201601
131
+
132
+ begin
133
+ # IDs of the required objects.
134
+ campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
135
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
136
+ criterion_id = 'INSERT_CRITERION_ID_HERE'.to_i
137
+ add_experiment(campaign_id, ad_group_id, criterion_id)
138
+
139
+ # Authorization error.
140
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
141
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
142
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
143
+ "to retrieve and store OAuth2 tokens."
144
+ puts "See this wiki page for more details:\n\n " +
145
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
146
+
147
+ # HTTP errors.
148
+ rescue AdsCommon::Errors::HttpError => e
149
+ puts "HTTP Error: %s" % e
150
+
151
+ # API errors.
152
+ rescue AdwordsApi::Errors::ApiException => e
153
+ puts "Message: %s" % e.message
154
+ puts 'Errors:'
155
+ e.errors.each_with_index do |error, index|
156
+ puts "\tError [%d]:" % (index + 1)
157
+ error.each do |field, value|
158
+ puts "\t\t%s: %s" % [field, value]
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This code sample illustrates how to add many keywords using asynchronous
20
+ # requests and MutateJobService.
21
+
22
+ require 'adwords_api'
23
+
24
+ def add_keywords_in_bulk()
25
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
26
+ # when called without parameters.
27
+ adwords = AdwordsApi::Api.new
28
+
29
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
30
+ # the configuration file or provide your own logger:
31
+ # adwords.logger = Logger.new('adwords_xml.log')
32
+
33
+ mutate_job_srv = adwords.service(:MutateJobService, API_VERSION)
34
+
35
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
36
+
37
+ # Create AdGroupCriterionOperations to add keywords.
38
+ operations = (1..KEYWORD_NUMBER).map do |index|
39
+ {:xsi_type => 'AdGroupCriterionOperation',
40
+ :operator => 'ADD',
41
+ :operand => {
42
+ :xsi_type => 'BiddableAdGroupCriterion',
43
+ :ad_group_id => ad_group_id,
44
+ :criterion => {
45
+ :xsi_type => 'Keyword',
46
+ :match_type => 'BROAD',
47
+ :text => "mars%d" % index}}}
48
+ end
49
+
50
+ # You can specify up to 3 job IDs that must successfully complete before
51
+ # this job can be processed.
52
+ policy = {:prerequisite_job_ids => []}
53
+
54
+ # Call mutate to create a new job.
55
+ response = mutate_job_srv.mutate(operations, policy)
56
+
57
+ raise StandardError, 'Failed to submit a job; aborting.' unless response
58
+
59
+ job_id = response[:id]
60
+ puts "Job ID %d was successfully created." % job_id
61
+
62
+ # Creating selector to retrive hob status and wait for it to complete.
63
+ selector = {
64
+ :xsi_type => 'BulkMutateJobSelector',
65
+ :job_ids => [job_id]
66
+ }
67
+
68
+ status = nil
69
+
70
+ # Poll for job status until it's finished.
71
+ puts 'Retrieving job status...'
72
+ RETRIES_COUNT.times do |retry_attempt|
73
+ job_status_response = mutate_job_srv.get(selector)
74
+ if job_status_response
75
+ status = job_status_response.first[:status]
76
+ case status
77
+ when 'FAILED'
78
+ raise StandardError, "Job failed with reason: '%s'" %
79
+ job_status_response.first[:failure_reason]
80
+ when 'COMPLETED'
81
+ puts "[%d] Job finished with status '%s'" % [retry_attempt, status]
82
+ break
83
+ else
84
+ puts "[%d] Current status is '%s', waiting %d seconds to retry..." %
85
+ [retry_attempt, status, RETRY_INTERVAL]
86
+ sleep(RETRY_INTERVAL)
87
+ end
88
+ else
89
+ raise StandardError, 'Error retrieving job status; aborting.'
90
+ end
91
+ end
92
+
93
+ if status == 'COMPLETED'
94
+ # Get the job result. Here we re-use the same selector.
95
+ result_response = mutate_job_srv.get_result(selector)
96
+
97
+ if result_response and result_response[:simple_mutate_result]
98
+ results = result_response[:simple_mutate_result][:results]
99
+ if results
100
+ results.each_with_index do |result, index|
101
+ result_message = result.include?(:place_holder) ?
102
+ 'FAILED' : 'SUCCEEDED'
103
+ puts "Operation [%d] - %s" % [index, result_message]
104
+ end
105
+ end
106
+ errors = result_response[:simple_mutate_result][:errors]
107
+ if errors
108
+ errors.each do |error|
109
+ puts "Error, reason: '%s', trigger: '%s', field path: '%s'" %
110
+ [error[:reason], error[:trigger], error[:field_path]]
111
+ end
112
+ end
113
+ else
114
+ raise StandardError, 'Error retrieving job results; aborting.'
115
+ end
116
+ else
117
+ puts "Job failed to complete after %d retries." % RETRY_COUNT
118
+ end
119
+ end
120
+
121
+ if __FILE__ == $0
122
+ API_VERSION = :v201601
123
+ RETRY_INTERVAL = 30
124
+ RETRIES_COUNT = 30
125
+ KEYWORD_NUMBER = 100
126
+
127
+ begin
128
+ add_keywords_in_bulk()
129
+
130
+ # Authorization error.
131
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
132
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
133
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
134
+ "to retrieve and store OAuth2 tokens."
135
+ puts "See this wiki page for more details:\n\n " +
136
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
137
+
138
+ # HTTP errors.
139
+ rescue AdsCommon::Errors::HttpError => e
140
+ puts "HTTP Error: %s" % e
141
+
142
+ # API errors.
143
+ rescue AdwordsApi::Errors::ApiException => e
144
+ puts "Message: %s" % e.message
145
+ puts 'Errors:'
146
+ e.errors.each_with_index do |error, index|
147
+ puts "\tError [%d]:" % (index + 1)
148
+ error.each do |field, value|
149
+ puts "\t\t%s: %s" % [field, value]
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This example illustrates how to retrieve all the disapproved ads in a given
20
+ # ad group. To add ads, run add_text_ads.rb.
21
+
22
+ require 'adwords_api'
23
+
24
+ def get_all_disapproved_ads(ad_group_id)
25
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
26
+ # when called without parameters.
27
+ adwords = AdwordsApi::Api.new
28
+
29
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
30
+ # the configuration file or provide your own logger:
31
+ # adwords.logger = Logger.new('adwords_xml.log')
32
+
33
+ ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)
34
+
35
+ # Get all the disapproved ads for this campaign.
36
+ selector = {
37
+ :fields => ['Id', 'AdGroupAdDisapprovalReasons'],
38
+ :ordering => [{:field => 'Id', :sort_order => 'ASCENDING'}],
39
+ :predicates => [
40
+ {:field => 'AdGroupId', :operator => 'IN', :values => [ad_group_id]},
41
+ {
42
+ :field => 'AdGroupCreativeApprovalStatus',
43
+ :operator => 'IN',
44
+ :values => ['DISAPPROVED']
45
+ }
46
+ ]
47
+ }
48
+ response = ad_group_ad_srv.get(selector)
49
+ if response and response[:entries]
50
+ puts 'Ad group %d has %d disapproved ad(s).' %
51
+ [ad_group_id, response[:total_num_entries]]
52
+ response[:entries].each do |ad_group_ad|
53
+ puts ("\tAd with ID %d and type '%s' was disapproved for the following " +
54
+ 'reasons:') % [ad_group_ad[:ad][:id], ad_group_ad[:ad][:xsi_type]]
55
+ if ad_group_ad.include?(:disapproval_reasons)
56
+ ad_group_ad[:disapproval_reasons].each {|reason| puts "\t\t%s" % reason}
57
+ else
58
+ puts "\t\tReason not provided."
59
+ end
60
+ end
61
+ else
62
+ puts 'No disapproved ads found for ad group %d.' % ad_group_id
63
+ end
64
+ end
65
+
66
+ if __FILE__ == $0
67
+ API_VERSION = :v201601
68
+
69
+ begin
70
+ # ID of an ad group to get disapproved ads for.
71
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
72
+ get_all_disapproved_ads(ad_group_id)
73
+
74
+ # Authorization error.
75
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
76
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
77
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
78
+ "to retrieve and store OAuth2 tokens."
79
+ puts "See this wiki page for more details:\n\n " +
80
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
81
+
82
+ # HTTP errors.
83
+ rescue AdsCommon::Errors::HttpError => e
84
+ puts "HTTP Error: %s" % e
85
+
86
+ # API errors.
87
+ rescue AdwordsApi::Errors::ApiException => e
88
+ puts "Message: %s" % e.message
89
+ puts 'Errors:'
90
+ e.errors.each_with_index do |error, index|
91
+ puts "\tError [%d]:" % (index + 1)
92
+ error.each do |field, value|
93
+ puts "\t\t%s: %s" % [field, value]
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2012, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This example illustrates how to retrieve all the disapproved ads in a given
20
+ # ad group with AWQL. To add ads, run add_text_ads.rb.
21
+
22
+ require 'adwords_api'
23
+
24
+ def get_all_disapproved_ads_with_awql(ad_group_id)
25
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
26
+ # when called without parameters.
27
+ adwords = AdwordsApi::Api.new
28
+
29
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
30
+ # the configuration file or provide your own logger:
31
+ # adwords.logger = Logger.new('adwords_xml.log')
32
+
33
+ ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)
34
+
35
+ # Get all the disapproved ads for this campaign.
36
+ query = ('SELECT Id, AdGroupAdDisapprovalReasons ' +
37
+ 'WHERE AdGroupId = %d AND AdGroupCreativeApprovalStatus = DISAPPROVED ' +
38
+ 'ORDER BY Id') % ad_group_id
39
+
40
+ response = ad_group_ad_srv.query(query)
41
+ if response and response[:entries]
42
+ puts 'Ad group ID %d has %d disapproved ad(s).' %
43
+ [ad_group_id, response[:total_num_entries]]
44
+ response[:entries].each do |ad_group_ad|
45
+ puts ("\tAd with ID %d and type '%s' was disapproved for the following " +
46
+ 'reasons:') % [ad_group_ad[:ad][:id], ad_group_ad[:ad][:xsi_type]]
47
+ if ad_group_ad.include?(:disapproval_reasons)
48
+ ad_group_ad[:disapproval_reasons].each {|reason| puts "\t\t%s" % reason}
49
+ else
50
+ puts "\t\tReason not provided."
51
+ end
52
+ end
53
+ else
54
+ puts 'No disapproved ads found for ad group ID %d.' % ad_group_id
55
+ end
56
+ end
57
+
58
+ if __FILE__ == $0
59
+ API_VERSION = :v201601
60
+
61
+ begin
62
+ # ID of an ad group to get disapproved ads for.
63
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
64
+ get_all_disapproved_ads_with_awql(ad_group_id)
65
+
66
+ # Authorization error.
67
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
68
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
69
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
70
+ "to retrieve and store OAuth2 tokens."
71
+ puts "See this wiki page for more details:\n\n " +
72
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
73
+
74
+ # HTTP errors.
75
+ rescue AdsCommon::Errors::HttpError => e
76
+ puts 'HTTP Error: %s' % e
77
+
78
+ # API errors.
79
+ rescue AdwordsApi::Errors::ApiException => e
80
+ puts 'Message: %s' % e.message
81
+ puts 'Errors:'
82
+ e.errors.each_with_index do |error, index|
83
+ puts "\tError [%d]:" % (index + 1)
84
+ error.each do |field, value|
85
+ puts "\t\t%s: %s" % [field, value]
86
+ end
87
+ end
88
+ end
89
+ end