google-adwords-api 0.17.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +5 -13
  2. data/ChangeLog +5 -0
  3. data/README.md +3 -3
  4. data/adwords_api.yml +3 -0
  5. data/examples/v201509/{campaign_management → advanced_operations}/add_complete_campaigns_using_batch_job.rb +10 -16
  6. data/examples/v201509/advanced_operations/add_keywords_using_incremental_batch_job.rb +179 -0
  7. data/examples/v201509/reporting/stream_criteria_report_results.rb +97 -0
  8. data/lib/adwords_api/api_config.rb +0 -86
  9. data/lib/adwords_api/batch_job_utils.rb +124 -51
  10. data/lib/adwords_api/incremental_upload_helper.rb +71 -0
  11. data/lib/adwords_api/report_header_handler.rb +1 -1
  12. data/lib/adwords_api/report_stream.rb +64 -0
  13. data/lib/adwords_api/report_utils.rb +88 -8
  14. data/lib/adwords_api/version.rb +1 -1
  15. data/test/adwords_api/test_batch_job_utils.rb +15 -0
  16. metadata +18 -168
  17. data/examples/v201502/account_management/create_account.rb +0 -88
  18. data/examples/v201502/account_management/get_account_changes.rb +0 -139
  19. data/examples/v201502/account_management/get_account_hierarchy.rb +0 -94
  20. data/examples/v201502/advanced_operations/add_ad_customizers.rb +0 -184
  21. data/examples/v201502/advanced_operations/add_ad_group_bid_modifier.rb +0 -101
  22. data/examples/v201502/advanced_operations/add_click_to_download_ad.rb +0 -133
  23. data/examples/v201502/advanced_operations/add_text_ad_with_upgraded_urls.rb +0 -134
  24. data/examples/v201502/advanced_operations/create_and_attach_shared_keyword_set.rb +0 -133
  25. data/examples/v201502/advanced_operations/find_and_remove_criteria_from_shared_set.rb +0 -166
  26. data/examples/v201502/advanced_operations/get_ad_group_bid_modifiers.rb +0 -102
  27. data/examples/v201502/advanced_operations/upload_offline_conversions.rb +0 -113
  28. data/examples/v201502/advanced_operations/use_shared_bidding_strategy.rb +0 -147
  29. data/examples/v201502/basic_operations/add_ad_groups.rb +0 -140
  30. data/examples/v201502/basic_operations/add_campaigns.rb +0 -139
  31. data/examples/v201502/basic_operations/add_keywords.rb +0 -114
  32. data/examples/v201502/basic_operations/add_text_ads.rb +0 -109
  33. data/examples/v201502/basic_operations/get_ad_groups.rb +0 -102
  34. data/examples/v201502/basic_operations/get_campaigns.rb +0 -97
  35. data/examples/v201502/basic_operations/get_campaigns_with_awql.rb +0 -89
  36. data/examples/v201502/basic_operations/get_keywords.rb +0 -108
  37. data/examples/v201502/basic_operations/get_text_ads.rb +0 -110
  38. data/examples/v201502/basic_operations/pause_ad.rb +0 -88
  39. data/examples/v201502/basic_operations/remove_ad.rb +0 -89
  40. data/examples/v201502/basic_operations/remove_ad_group.rb +0 -85
  41. data/examples/v201502/basic_operations/remove_campaign.rb +0 -87
  42. data/examples/v201502/basic_operations/remove_keyword.rb +0 -94
  43. data/examples/v201502/basic_operations/update_ad_group.rb +0 -85
  44. data/examples/v201502/basic_operations/update_campaign.rb +0 -86
  45. data/examples/v201502/basic_operations/update_keyword.rb +0 -106
  46. data/examples/v201502/campaign_management/add_campaign_labels.rb +0 -82
  47. data/examples/v201502/campaign_management/add_experiment.rb +0 -162
  48. data/examples/v201502/campaign_management/add_keywords_in_bulk.rb +0 -153
  49. data/examples/v201502/campaign_management/get_all_disapproved_ads.rb +0 -97
  50. data/examples/v201502/campaign_management/get_all_disapproved_ads_with_awql.rb +0 -89
  51. data/examples/v201502/campaign_management/get_campaigns_by_label.rb +0 -108
  52. data/examples/v201502/campaign_management/promote_experiment.rb +0 -81
  53. data/examples/v201502/campaign_management/set_ad_parameters.rb +0 -118
  54. data/examples/v201502/campaign_management/set_criterion_bid_modifier.rb +0 -104
  55. data/examples/v201502/campaign_management/validate_text_ad.rb +0 -110
  56. data/examples/v201502/error_handling/handle_partial_failures.rb +0 -130
  57. data/examples/v201502/error_handling/handle_policy_violation_error.rb +0 -141
  58. data/examples/v201502/extensions/add_google_my_business_location_extensions.rb +0 -179
  59. data/examples/v201502/extensions/add_site_links.rb +0 -164
  60. data/examples/v201502/extensions/add_site_links_using_feeds.rb +0 -271
  61. data/examples/v201502/migration/migrate_to_extension_settings.rb +0 -386
  62. data/examples/v201502/migration/upgrade_ad_url.rb +0 -93
  63. data/examples/v201502/misc/create_ad_words_session_without_properties_file.rb +0 -92
  64. data/examples/v201502/misc/get_all_images_and_videos.rb +0 -104
  65. data/examples/v201502/misc/setup_oauth2.rb +0 -84
  66. data/examples/v201502/misc/upload_image.rb +0 -93
  67. data/examples/v201502/misc/use_oauth2_jwt.rb +0 -93
  68. data/examples/v201502/optimization/estimate_keyword_traffic.rb +0 -146
  69. data/examples/v201502/optimization/get_keyword_bid_simulations.rb +0 -95
  70. data/examples/v201502/optimization/get_keyword_ideas.rb +0 -126
  71. data/examples/v201502/remarketing/add_audience.rb +0 -118
  72. data/examples/v201502/remarketing/add_conversion_tracker.rb +0 -100
  73. data/examples/v201502/remarketing/add_rule_based_user_lists.rb +0 -167
  74. data/examples/v201502/reporting/download_criteria_report.rb +0 -85
  75. data/examples/v201502/reporting/download_criteria_report_with_awql.rb +0 -84
  76. data/examples/v201502/reporting/get_report_fields.rb +0 -75
  77. data/examples/v201502/reporting/parallel_report_download.rb +0 -166
  78. data/examples/v201502/shopping_campaigns/add_product_partition_tree.rb +0 -267
  79. data/examples/v201502/shopping_campaigns/add_product_scope.rb +0 -129
  80. data/examples/v201502/shopping_campaigns/add_shopping_campaign.rb +0 -129
  81. data/examples/v201502/shopping_campaigns/get_product_category_taxonomy.rb +0 -115
  82. data/examples/v201502/targeting/add_campaign_targeting_criteria.rb +0 -169
  83. data/examples/v201502/targeting/add_demographic_targeting_criteria.rb +0 -112
  84. data/examples/v201502/targeting/get_campaign_targeting_criteria.rb +0 -106
  85. data/examples/v201502/targeting/get_targetable_languages_and_carriers.rb +0 -89
  86. data/examples/v201502/targeting/lookup_location.rb +0 -108
  87. data/lib/adwords_api/v201502/account_label_service.rb +0 -46
  88. data/lib/adwords_api/v201502/account_label_service_registry.rb +0 -46
  89. data/lib/adwords_api/v201502/ad_customizer_feed_service.rb +0 -46
  90. data/lib/adwords_api/v201502/ad_customizer_feed_service_registry.rb +0 -46
  91. data/lib/adwords_api/v201502/ad_group_ad_service.rb +0 -70
  92. data/lib/adwords_api/v201502/ad_group_ad_service_registry.rb +0 -46
  93. data/lib/adwords_api/v201502/ad_group_bid_modifier_service.rb +0 -54
  94. data/lib/adwords_api/v201502/ad_group_bid_modifier_service_registry.rb +0 -46
  95. data/lib/adwords_api/v201502/ad_group_criterion_service.rb +0 -62
  96. data/lib/adwords_api/v201502/ad_group_criterion_service_registry.rb +0 -46
  97. data/lib/adwords_api/v201502/ad_group_extension_setting_service.rb +0 -54
  98. data/lib/adwords_api/v201502/ad_group_extension_setting_service_registry.rb +0 -46
  99. data/lib/adwords_api/v201502/ad_group_feed_service.rb +0 -54
  100. data/lib/adwords_api/v201502/ad_group_feed_service_registry.rb +0 -46
  101. data/lib/adwords_api/v201502/ad_group_service.rb +0 -62
  102. data/lib/adwords_api/v201502/ad_group_service_registry.rb +0 -46
  103. data/lib/adwords_api/v201502/ad_param_service.rb +0 -46
  104. data/lib/adwords_api/v201502/ad_param_service_registry.rb +0 -46
  105. data/lib/adwords_api/v201502/adwords_user_list_service.rb +0 -46
  106. data/lib/adwords_api/v201502/adwords_user_list_service_registry.rb +0 -46
  107. data/lib/adwords_api/v201502/bidding_strategy_service.rb +0 -54
  108. data/lib/adwords_api/v201502/bidding_strategy_service_registry.rb +0 -46
  109. data/lib/adwords_api/v201502/budget_order_service.rb +0 -54
  110. data/lib/adwords_api/v201502/budget_order_service_registry.rb +0 -46
  111. data/lib/adwords_api/v201502/budget_service.rb +0 -54
  112. data/lib/adwords_api/v201502/budget_service_registry.rb +0 -46
  113. data/lib/adwords_api/v201502/campaign_criterion_service.rb +0 -54
  114. data/lib/adwords_api/v201502/campaign_criterion_service_registry.rb +0 -46
  115. data/lib/adwords_api/v201502/campaign_extension_setting_service.rb +0 -54
  116. data/lib/adwords_api/v201502/campaign_extension_setting_service_registry.rb +0 -46
  117. data/lib/adwords_api/v201502/campaign_feed_service.rb +0 -54
  118. data/lib/adwords_api/v201502/campaign_feed_service_registry.rb +0 -46
  119. data/lib/adwords_api/v201502/campaign_service.rb +0 -62
  120. data/lib/adwords_api/v201502/campaign_service_registry.rb +0 -46
  121. data/lib/adwords_api/v201502/campaign_shared_set_service.rb +0 -46
  122. data/lib/adwords_api/v201502/campaign_shared_set_service_registry.rb +0 -46
  123. data/lib/adwords_api/v201502/constant_data_service.rb +0 -102
  124. data/lib/adwords_api/v201502/constant_data_service_registry.rb +0 -46
  125. data/lib/adwords_api/v201502/conversion_tracker_service.rb +0 -54
  126. data/lib/adwords_api/v201502/conversion_tracker_service_registry.rb +0 -46
  127. data/lib/adwords_api/v201502/customer_extension_setting_service.rb +0 -54
  128. data/lib/adwords_api/v201502/customer_extension_setting_service_registry.rb +0 -46
  129. data/lib/adwords_api/v201502/customer_feed_service.rb +0 -54
  130. data/lib/adwords_api/v201502/customer_feed_service_registry.rb +0 -46
  131. data/lib/adwords_api/v201502/customer_service.rb +0 -46
  132. data/lib/adwords_api/v201502/customer_service_registry.rb +0 -46
  133. data/lib/adwords_api/v201502/customer_sync_service.rb +0 -38
  134. data/lib/adwords_api/v201502/customer_sync_service_registry.rb +0 -47
  135. data/lib/adwords_api/v201502/data_service.rb +0 -78
  136. data/lib/adwords_api/v201502/data_service_registry.rb +0 -46
  137. data/lib/adwords_api/v201502/experiment_service.rb +0 -46
  138. data/lib/adwords_api/v201502/experiment_service_registry.rb +0 -46
  139. data/lib/adwords_api/v201502/feed_item_service.rb +0 -54
  140. data/lib/adwords_api/v201502/feed_item_service_registry.rb +0 -46
  141. data/lib/adwords_api/v201502/feed_mapping_service.rb +0 -54
  142. data/lib/adwords_api/v201502/feed_mapping_service_registry.rb +0 -46
  143. data/lib/adwords_api/v201502/feed_service.rb +0 -54
  144. data/lib/adwords_api/v201502/feed_service_registry.rb +0 -46
  145. data/lib/adwords_api/v201502/geo_location_service.rb +0 -38
  146. data/lib/adwords_api/v201502/geo_location_service_registry.rb +0 -46
  147. data/lib/adwords_api/v201502/label_service.rb +0 -54
  148. data/lib/adwords_api/v201502/label_service_registry.rb +0 -46
  149. data/lib/adwords_api/v201502/location_criterion_service.rb +0 -46
  150. data/lib/adwords_api/v201502/location_criterion_service_registry.rb +0 -46
  151. data/lib/adwords_api/v201502/managed_customer_service.rb +0 -78
  152. data/lib/adwords_api/v201502/managed_customer_service_registry.rb +0 -46
  153. data/lib/adwords_api/v201502/media_service.rb +0 -54
  154. data/lib/adwords_api/v201502/media_service_registry.rb +0 -46
  155. data/lib/adwords_api/v201502/mutate_job_service.rb +0 -54
  156. data/lib/adwords_api/v201502/mutate_job_service_registry.rb +0 -46
  157. data/lib/adwords_api/v201502/offline_conversion_feed_service.rb +0 -38
  158. data/lib/adwords_api/v201502/offline_conversion_feed_service_registry.rb +0 -46
  159. data/lib/adwords_api/v201502/report_definition_service.rb +0 -38
  160. data/lib/adwords_api/v201502/report_definition_service_registry.rb +0 -46
  161. data/lib/adwords_api/v201502/shared_criterion_service.rb +0 -46
  162. data/lib/adwords_api/v201502/shared_criterion_service_registry.rb +0 -46
  163. data/lib/adwords_api/v201502/shared_set_service.rb +0 -46
  164. data/lib/adwords_api/v201502/shared_set_service_registry.rb +0 -46
  165. data/lib/adwords_api/v201502/targeting_idea_service.rb +0 -38
  166. data/lib/adwords_api/v201502/targeting_idea_service_registry.rb +0 -46
  167. data/lib/adwords_api/v201502/traffic_estimator_service.rb +0 -38
  168. data/lib/adwords_api/v201502/traffic_estimator_service_registry.rb +0 -46
  169. data/test/templates/v201502/basic_operations_get_campaigns.def +0 -116
  170. data/test/templates/v201502/misc_use_oauth2_service_account.def +0 -131
@@ -1,84 +0,0 @@
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 gets an Ad Hoc report using AdWords Query Language.
20
- # See AWQL guide for more details:
21
- # https://developers.google.com/adwords/api/docs/guides/awql
22
-
23
- require 'date'
24
-
25
- require 'adwords_api'
26
-
27
- def download_criteria_report_with_awql(file_name, report_format)
28
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
29
- # when called without parameters.
30
- adwords = AdwordsApi::Api.new
31
-
32
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
33
- # the configuration file or provide your own logger:
34
- # adwords.logger = Logger.new('adwords_xml.log')
35
-
36
- # Get report utilities for the version.
37
- report_utils = adwords.report_utils(API_VERSION)
38
-
39
- # Prepare a date range for the last week. Instead you can use 'LAST_7_DAYS'.
40
- date_range = '%s,%s' % [
41
- DateTime.parse((Date.today - 7).to_s).strftime('%Y%m%d'),
42
- DateTime.parse((Date.today - 1).to_s).strftime('%Y%m%d')
43
- ]
44
-
45
- # Define report definition. You can also pass your own XML text as a string.
46
- report_query = 'SELECT CampaignId, AdGroupId, Id, Criteria, CriteriaType, ' +
47
- 'Impressions, Clicks, Cost FROM CRITERIA_PERFORMANCE_REPORT ' +
48
- 'WHERE Status IN [ENABLED, PAUSED] ' +
49
- 'DURING %s' % date_range
50
-
51
- # Download report, using "download_report_as_file_with_awql" utility method.
52
- # To retrieve the report as return value, use "download_report_with_awql"
53
- # method.
54
- report_utils.download_report_as_file_with_awql(report_query, report_format,
55
- file_name)
56
- puts "Report was downloaded to '%s'." % file_name
57
- end
58
-
59
- if __FILE__ == $0
60
- API_VERSION = :v201502
61
-
62
- begin
63
- # File name to write report to.
64
- file_name = 'INSERT_OUTPUT_FILE_NAME_HERE'
65
- report_format = 'CSV'
66
- download_criteria_report_with_awql(file_name, report_format)
67
-
68
- # Authorization error.
69
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
70
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
71
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
72
- "to retrieve and store OAuth2 tokens."
73
- puts "See this wiki page for more details:\n\n " +
74
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
75
-
76
- # HTTP errors.
77
- rescue AdsCommon::Errors::HttpError => e
78
- puts 'HTTP Error: %s' % e
79
-
80
- # API errors.
81
- rescue AdwordsApi::Errors::ReportError => e
82
- puts 'Reporting Error: %s' % e.message
83
- end
84
- end
@@ -1,75 +0,0 @@
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 gets the list of possible report fields for a report type.
20
-
21
- require 'adwords_api'
22
-
23
- def get_report_fields(report_type)
24
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
25
- # when called without parameters.
26
- adwords = AdwordsApi::Api.new
27
-
28
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
29
- # the configuration file or provide your own logger:
30
- # adwords.logger = Logger.new('adwords_xml.log')
31
-
32
- report_def_srv = adwords.service(:ReportDefinitionService, API_VERSION)
33
-
34
- # Get report fields.
35
- fields = report_def_srv.get_report_fields(report_type)
36
- if fields
37
- puts "Report type '%s' contains the following fields:" % report_type
38
- fields.each do |field|
39
- puts ' - %s (%s)' % [field[:field_name], field[:field_type]]
40
- puts ' := [%s]' % field[:enum_values].join(', ') if field[:enum_values]
41
- end
42
- end
43
- end
44
-
45
- if __FILE__ == $0
46
- API_VERSION = :v201502
47
-
48
- begin
49
- report_type = 'INSERT_REPORT_TYPE_HERE'
50
- get_report_fields(report_type)
51
-
52
- # Authorization error.
53
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
54
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
55
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
56
- "to retrieve and store OAuth2 tokens."
57
- puts "See this wiki page for more details:\n\n " +
58
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
59
-
60
- # HTTP errors.
61
- rescue AdsCommon::Errors::HttpError => e
62
- puts "HTTP Error: %s" % e
63
-
64
- # API errors.
65
- rescue AdwordsApi::Errors::ApiException => e
66
- puts "Message: %s" % e.message
67
- puts 'Errors:'
68
- e.errors.each_with_index do |error, index|
69
- puts "\tError [%d]:" % (index + 1)
70
- error.each do |field, value|
71
- puts "\t\t%s: %s" % [field, value]
72
- end
73
- end
74
- end
75
- end
@@ -1,166 +0,0 @@
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 gets and downloads an Ad Hoc report from a XML report definition
20
- # for all accounts in hierarchy in multiple parallel threads. This example
21
- # needs to be run against an AdWords manager account.
22
-
23
- require 'thread'
24
-
25
- require 'adwords_api'
26
- require 'adwords_api/utils'
27
-
28
- def parallel_report_download()
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
- # Determine list of customer IDs to retrieve report for. For this example we
38
- # will use ManagedCustomerService to get all IDs in hierarchy.
39
-
40
- managed_customer_srv = adwords.service(:ManagedCustomerService, API_VERSION)
41
-
42
- # Get the account hierarchy for this account.
43
- selector = {:fields => ['CustomerId']}
44
-
45
- graph = managed_customer_srv.get(selector)
46
-
47
- # Using queue to balance load between threads.
48
- queue = Queue.new()
49
-
50
- if graph and graph[:entries] and !graph[:entries].empty?
51
- graph[:entries].each {|account| queue << account[:customer_id]}
52
- else
53
- raise StandardError, 'Can not retrieve any customer ID'
54
- end
55
-
56
- # Get report utilities for the version.
57
- report_utils = adwords.report_utils(API_VERSION)
58
-
59
- # Define report definition. You can also pass your own XML text as a string.
60
- report_definition = {
61
- :selector => {
62
- :fields => ['CampaignId', 'AdGroupId', 'Impressions', 'Clicks', 'Cost'],
63
- # Predicates are optional.
64
- :predicates => {
65
- :field => 'AdGroupStatus',
66
- :operator => 'IN',
67
- :values => ['ENABLED', 'PAUSED']
68
- }
69
- },
70
- :report_name => 'Custom ADGROUP_PERFORMANCE_REPORT',
71
- :report_type => 'ADGROUP_PERFORMANCE_REPORT',
72
- :download_format => 'CSV',
73
- :date_range_type => 'LAST_7_DAYS',
74
- # Enable to get rows with zero impressions.
75
- :include_zero_impressions => false
76
- }
77
-
78
- puts 'Retrieving %d reports with %d threads:' % [queue.size, THREADS]
79
-
80
- reports_succeeded = Queue.new()
81
- reports_failed = Queue.new()
82
-
83
- # Creating a mutex to control access to the queue.
84
- queue_mutex = Mutex.new
85
-
86
- # Start all the threads.
87
- threads = (1..THREADS).map do |thread_id|
88
- Thread.new(report_definition) do |local_def|
89
- cid = nil
90
- begin
91
- cid = queue_mutex.synchronize {(queue.empty?) ? nil : queue.pop(true)}
92
- if cid
93
- retry_count = 0
94
- file_name = 'adgroup_%010d.csv' % cid
95
- puts "[%2d/%d] Loading report for customer ID %s into '%s'..." %
96
- [thread_id, retry_count,
97
- AdwordsApi::Utils.format_id(cid), file_name]
98
- begin
99
- report_utils.download_report_as_file(local_def, file_name, cid)
100
- reports_succeeded << {:cid => cid, :file_name => file_name}
101
- rescue AdwordsApi::Errors::ReportError => e
102
- if e.http_code == 500 && retry_count < MAX_RETRIES
103
- retry_count += 1
104
- sleep(retry_count * BACKOFF_FACTOR)
105
- retry
106
- else
107
- puts(('Report failed for customer ID %s with code %d after %d ' +
108
- 'retries.') % [cid, e.http_code, retry_count + 1])
109
- reports_failed <<
110
- {:cid => cid, :http_code => e.http_code, :message => e.message}
111
- end
112
- end
113
- end
114
- end while (cid != nil)
115
- end
116
- end
117
-
118
- # Wait for all threads to finish.
119
- threads.each { |aThread| aThread.join }
120
-
121
- puts 'Download completed, results:'
122
- puts 'Successful reports:'
123
- while !reports_succeeded.empty? do
124
- result = reports_succeeded.pop()
125
- puts "\tClient ID %s => '%s'" %
126
- [AdwordsApi::Utils.format_id(result[:cid]), result[:file_name]]
127
- end
128
- puts 'Failed reports:'
129
- while !reports_failed.empty? do
130
- result = reports_failed.pop()
131
- puts "\tClient ID %s => Code: %d, Message: '%s'" %
132
- [AdwordsApi::Utils.format_id(result[:cid]),
133
- result[:http_code], result[:message]]
134
- end
135
- puts 'End of results.'
136
- end
137
-
138
- if __FILE__ == $0
139
- API_VERSION = :v201502
140
- # Number of parallel threads to spawn.
141
- THREADS = 10
142
- # Maximum number of retries for 500 errors.
143
- MAX_RETRIES = 5
144
- # Timeout between retries in seconds.
145
- BACKOFF_FACTOR = 5
146
-
147
- begin
148
- parallel_report_download()
149
-
150
- # Authorization error.
151
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
152
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
153
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
154
- "to retrieve and store OAuth2 tokens."
155
- puts "See this wiki page for more details:\n\n " +
156
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
157
-
158
- # HTTP errors.
159
- rescue AdsCommon::Errors::HttpError => e
160
- puts 'HTTP Error: %s' % e
161
-
162
- # API errors.
163
- rescue AdwordsApi::Errors::ReportError => e
164
- puts 'Reporting Error: %s' % e.message
165
- end
166
- end
@@ -1,267 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Encoding: utf-8
3
- #
4
- # Copyright:: Copyright 2014, 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 a ProductPartition tree.
20
-
21
- require 'adwords_api'
22
-
23
- class ProductPartitionHelper
24
- attr_reader :operations
25
-
26
- def initialize(ad_group_id)
27
- # The next temporary criterion ID to be used.
28
- #
29
- # When creating our tree we need to specify the parent-child relationships
30
- # between nodes. However, until a criterion has been created on the server
31
- # we do not have a criterionId with which to refer to it.
32
- #
33
- # Instead we can specify temporary IDs that are specific to a single mutate
34
- # request. Once the criteria have been created they are assigned an ID as
35
- # normal and the temporary ID will no longer refer to it.
36
- #
37
- # A valid temporary ID is any negative integer.
38
- @next_id = -1
39
-
40
- # The set of mutate operations needed to create the current tree.
41
- @operations = []
42
-
43
- # The ID of the AdGroup that we wish to attach the partition tree to.
44
- @ad_group_id = ad_group_id
45
- end
46
-
47
- def create_subdivision(parent = nil, value = nil)
48
- division = {
49
- :xsi_type => 'ProductPartition',
50
- :partition_type => 'SUBDIVISION',
51
- :id => @next_id
52
- }
53
-
54
- @next_id -= 1
55
-
56
- unless parent.nil? || value.nil?
57
- division[:parent_criterion_id] = parent[:id]
58
- division[:case_value] = value
59
- end
60
-
61
- ad_group_criterion = {
62
- :xsi_type => 'BiddableAdGroupCriterion',
63
- :ad_group_id => @ad_group_id,
64
- :criterion => division
65
- }
66
-
67
- create_add_operation(ad_group_criterion)
68
-
69
- return division
70
- end
71
-
72
- def create_unit(parent = nil, value = nil, bid_amount = nil)
73
- unit = {
74
- :xsi_type => 'ProductPartition',
75
- :partition_type => 'UNIT'
76
- }
77
-
78
- unless parent.nil? || value.nil?
79
- unit[:parent_criterion_id] = parent[:id]
80
- unit[:case_value] = value
81
- end
82
-
83
- ad_group_criterion = {}
84
- if bid_amount && bid_amount > 0
85
- bidding_strategy_configuration = {
86
- :bids => [{
87
- :xsi_type => 'CpcBid',
88
- :bid => {
89
- :xsi_type => 'Money',
90
- :micro_amount => bid_amount
91
- }
92
- }]
93
- }
94
- ad_group_criterion[:xsi_type] = 'BiddableAdGroupCriterion'
95
- ad_group_criterion[:bidding_strategy_configuration] =
96
- bidding_strategy_configuration
97
- else
98
- ad_group_criterion[:xsi_type] = 'NegativeAdGroupCriterion'
99
- end
100
- ad_group_criterion[:ad_group_id] = @ad_group_id
101
- ad_group_criterion[:criterion] = unit
102
-
103
- create_add_operation(ad_group_criterion)
104
-
105
- return unit
106
- end
107
-
108
- private
109
-
110
- def create_add_operation(ad_group_criterion)
111
- operation = {
112
- :operator => 'ADD',
113
- :operand => ad_group_criterion
114
- }
115
-
116
- @operations << operation
117
- end
118
- end
119
-
120
- def display_tree(node, children, level = 0)
121
- value = ''
122
- type = ''
123
-
124
- if node[:case_value]
125
- type = node[:case_value][:product_dimension_type]
126
-
127
- value = case type
128
- when 'ProductCanonicalCondition'
129
- node[:case_value][:condition]
130
- when 'ProductBiddingCategory'
131
- "%s(%s)" % [node[:case_value][:type], node[:case_value][:value]]
132
- else
133
- node[:case_value][:value]
134
- end
135
- end
136
-
137
- puts "%sid: %s, type: %s, value: %s" %
138
- [' ' * level, node[:id], type, value]
139
-
140
- children[node[:id]].each do |child_node|
141
- display_tree(child_node, children, level + 1)
142
- end
143
- end
144
-
145
- def add_product_partition_tree(ad_group_id)
146
- # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
147
- # when called without parameters.
148
- adwords = AdwordsApi::Api.new
149
-
150
- # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
151
- # the configuration file or provide your own logger:
152
- # adwords.logger = Logger.new('adwords_xml.log')
153
-
154
- ad_group_criterion_srv =
155
- adwords.service(:AdGroupCriterionService, API_VERSION)
156
-
157
- helper = ProductPartitionHelper.new(ad_group_id)
158
-
159
- root = helper.create_subdivision()
160
-
161
- new_product_canonical_condition = {
162
- :xsi_type => 'ProductCanonicalCondition',
163
- :condition => 'NEW'
164
- }
165
-
166
- used_product_canonical_condition = {
167
- :xsi_type => 'ProductCanonicalCondition',
168
- :condition => 'USED'
169
- }
170
-
171
- other_product_canonical_condition = {
172
- :xsi_type => 'ProductCanonicalCondition'
173
- }
174
-
175
- helper.create_unit(root, new_product_canonical_condition, 200000)
176
- helper.create_unit(root, used_product_canonical_condition, 100000)
177
- other_condition =
178
- helper.create_subdivision(root, other_product_canonical_condition)
179
-
180
- cool_product_brand = {
181
- :xsi_type => 'ProductBrand',
182
- :value => 'CoolBrand'
183
- }
184
-
185
- cheap_product_brand = {
186
- :xsi_type => 'ProductBrand',
187
- :value => 'CheapBrand'
188
- }
189
-
190
- other_product_brand = {
191
- :xsi_type => 'ProductBrand'
192
- }
193
-
194
- helper.create_unit(other_condition, cool_product_brand, 900000)
195
- helper.create_unit(other_condition, cheap_product_brand, 10000)
196
- other_brand = helper.create_subdivision(other_condition, other_product_brand)
197
-
198
- # The value for the bidding category is a fixed ID for the 'Luggage & Bags'
199
- # category. You can retrieve IDs for categories from the ConstantDataService.
200
- # See the get_product_taxonomy example for more details.
201
- luggage_category = {
202
- :xsi_type => 'ProductBiddingCategory',
203
- :type => 'BIDDING_CATEGORY_L1',
204
- :value => '-5914235892932915235'
205
- }
206
-
207
- generic_category = {
208
- :xsi_type => 'ProductBiddingCategory',
209
- :type => 'BIDDING_CATEGORY_L1'
210
- }
211
-
212
- helper.create_unit(other_brand, luggage_category, 750000)
213
- helper.create_unit(other_brand, generic_category, 110000)
214
-
215
- # Make the mutate request.
216
- result = ad_group_criterion_srv.mutate(helper.operations)
217
-
218
- children = {}
219
- root_node = nil
220
- # For each criterion, make an array containing each of its children.
221
- # We always create the parent before the child, so we can rely on that here.
222
- result[:value].each do |criterion|
223
- children[criterion[:criterion][:id]] = []
224
-
225
- if criterion[:criterion][:parent_criterion_id]
226
- children[criterion[:criterion][:parent_criterion_id]] <<
227
- criterion[:criterion]
228
- else
229
- root_node = criterion[:criterion]
230
- end
231
- end
232
-
233
- display_tree(root_node, children)
234
- end
235
-
236
- if __FILE__ == $0
237
- API_VERSION = :v201502
238
-
239
- begin
240
- ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
241
-
242
- add_product_partition_tree(ad_group_id)
243
-
244
- # Authorization error.
245
- rescue AdsCommon::Errors::OAuth2VerificationRequired => e
246
- puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
247
- "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
248
- "to retrieve and store OAuth2 tokens."
249
- puts "See this wiki page for more details:\n\n " +
250
- 'http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2'
251
-
252
- # HTTP errors.
253
- rescue AdsCommon::Errors::HttpError => e
254
- puts "HTTP Error: %s" % e
255
-
256
- # API errors.
257
- rescue AdwordsApi::Errors::ApiException => e
258
- puts "Message: %s" % e.message
259
- puts 'Errors:'
260
- e.errors.each_with_index do |error, index|
261
- puts "\tError [%d]:" % (index + 1)
262
- error.each do |field, value|
263
- puts "\t\t%s: %s" % [field, value]
264
- end
265
- end
266
- end
267
- end