google-adx-buyer-api 0.4.3 → 0.4.4

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 (40) hide show
  1. data/ChangeLog +4 -0
  2. data/README +3 -3
  3. data/examples/v201209/account_management/get_account_changes.rb +137 -0
  4. data/examples/v201209/basic_operations/add_ad_group.rb +88 -0
  5. data/examples/v201209/basic_operations/add_campaign.rb +105 -0
  6. data/examples/v201209/basic_operations/add_placements.rb +99 -0
  7. data/examples/v201209/basic_operations/add_thirdparty_redirect_ad.rb +126 -0
  8. data/examples/v201209/basic_operations/delete_ad.rb +80 -0
  9. data/examples/{v201206/reporting/download_defined_report.rb → v201209/basic_operations/delete_ad_group.rb} +21 -12
  10. data/examples/v201209/basic_operations/delete_campaign.rb +77 -0
  11. data/examples/v201209/basic_operations/delete_placement.rb +86 -0
  12. data/examples/v201209/basic_operations/get_ad_groups.rb +80 -0
  13. data/examples/v201209/basic_operations/get_campaigns.rb +77 -0
  14. data/examples/v201209/basic_operations/get_placements.rb +92 -0
  15. data/examples/v201209/basic_operations/get_thirdparty_redirect_ads.rb +100 -0
  16. data/examples/v201209/basic_operations/pause_ad.rb +81 -0
  17. data/examples/v201209/basic_operations/update_ad_group.rb +76 -0
  18. data/examples/v201209/basic_operations/update_campaign.rb +79 -0
  19. data/examples/v201209/basic_operations/update_placement.rb +94 -0
  20. data/examples/v201209/campaign_management/add_placements_in_bulk.rb +151 -0
  21. data/examples/v201209/campaign_management/get_all_disapproved_ads.rb +92 -0
  22. data/examples/v201209/error_handling/handle_captcha_challenge.rb +93 -0
  23. data/examples/v201209/error_handling/handle_partial_failures.rb +117 -0
  24. data/examples/v201209/error_handling/handle_policy_violation_error.rb +138 -0
  25. data/examples/v201209/error_handling/handle_two_factor_authorization_error.rb +87 -0
  26. data/examples/v201209/misc/get_all_images_and_videos.rb +101 -0
  27. data/examples/v201209/misc/upload_image.rb +87 -0
  28. data/examples/v201209/misc/use_oauth.rb +97 -0
  29. data/examples/v201209/optimization/get_placement_ideas.rb +106 -0
  30. data/examples/v201209/remarketing/add_audience.rb +111 -0
  31. data/examples/v201209/remarketing/add_conversion_tracker.rb +93 -0
  32. data/examples/v201209/reporting/download_criteria_report.rb +79 -0
  33. data/examples/v201209/reporting/get_campaign_stats.rb +105 -0
  34. data/examples/{v201206/reporting/get_defined_reports.rb → v201209/reporting/get_report_fields.rb} +13 -17
  35. data/examples/v201209/reporting/parallel_report_download.rb +159 -0
  36. data/examples/v201209/targeting/add_campaign_targeting_criteria.rb +110 -0
  37. data/examples/v201209/targeting/get_campaign_targeting_criteria.rb +104 -0
  38. data/examples/v201209/targeting/get_targetable_languages_and_carriers.rb +82 -0
  39. data/examples/v201209/targeting/lookup_location.rb +104 -0
  40. metadata +89 -34
@@ -18,14 +18,13 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
- # This example gets all report definitions. Adding new definitions is
22
- # deprecated, please use AdHoc reporting.
21
+ # This example gets the list of possible report fields for a report type.
23
22
  #
24
- # Tags: ReportDefinitionService.get
23
+ # Tags: ReportDefinitionService.getReportFields
25
24
 
26
25
  require 'adwords_api'
27
26
 
28
- def get_defined_reports()
27
+ def get_report_fields(report_type)
29
28
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
29
  # when called without parameters.
31
30
  adwords = AdwordsApi::Api.new
@@ -36,26 +35,23 @@ def get_defined_reports()
36
35
 
37
36
  report_def_srv = adwords.service(:ReportDefinitionService, API_VERSION)
38
37
 
39
- # Get all the report definitions.
40
- selector = {}
41
- response = report_def_srv.get(selector)
42
- if response and response[:entries]
43
- entries = response[:entries]
44
- puts "#{entries.length} report definition(s) found."
45
- entries.each do |entry|
46
- puts " Report definition id is #{entry[:id]} and name is " +
47
- "\"#{entry[:report_name]}\"."
38
+ # Get report fields.
39
+ fields = report_def_srv.get_report_fields(report_type)
40
+ if fields
41
+ puts "Report type '%s' contains the following fields:" % report_type
42
+ fields.each do |field|
43
+ puts ' - %s (%s)' % [field[:field_name], field[:field_type]]
44
+ puts ' := [%s]' % field[:enum_values].join(', ') if field[:enum_values]
48
45
  end
49
- else
50
- puts 'No report definitions found.'
51
46
  end
52
47
  end
53
48
 
54
49
  if __FILE__ == $0
55
- API_VERSION = :v201206
50
+ API_VERSION = :v201209
56
51
 
57
52
  begin
58
- get_defined_reports()
53
+ report_type = 'INSERT_REPORT_TYPE_HERE'
54
+ get_report_fields(report_type)
59
55
 
60
56
  # HTTP errors.
61
57
  rescue AdsCommon::Errors::HttpError => e
@@ -0,0 +1,159 @@
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 and downloads an Ad Hoc report from a XML report definition.
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 ServicedAccountService to get all IDs in hierarchy.
39
+
40
+ serviced_account_srv = adwords.service(:ServicedAccountService, API_VERSION)
41
+
42
+ # Get the account hierarchy for this account.
43
+ selector = {:enable_paging => false}
44
+
45
+ # Run the request at the MCC level.
46
+ graph = adwords.use_mcc() {serviced_account_srv.get(selector)}
47
+
48
+ # Using queue to balance load between threads.
49
+ queue = Queue.new()
50
+
51
+ if graph and graph[:accounts] and !graph[:accounts].empty?
52
+ graph[:accounts].each {|account| queue << account[:customer_id]}
53
+ else
54
+ raise StandardError, 'Can not retrieve any customer ID'
55
+ end
56
+
57
+ # Get report utilities for the version.
58
+ report_utils = adwords.report_utils(API_VERSION)
59
+
60
+ # Define report definition. You can also pass your own XML text as a string.
61
+ report_definition = {
62
+ :selector => {
63
+ :fields => ['CampaignId', 'Id', 'Impressions', 'Clicks', 'Cost'],
64
+ # Predicates are optional.
65
+ :predicates => {
66
+ :field => 'Status',
67
+ :operator => 'IN',
68
+ :values => ['ENABLED', 'PAUSED']
69
+ }
70
+ },
71
+ :report_name => 'Custom ADGROUP_PERFORMANCE_REPORT',
72
+ :report_type => 'ADGROUP_PERFORMANCE_REPORT',
73
+ :download_format => 'CSV',
74
+ :date_range_type => 'LAST_7_DAYS',
75
+ # Enable to get rows with zero impressions.
76
+ :include_zero_impressions => false
77
+ }
78
+
79
+ puts "Retrieving %d reports with %d threads:" % [queue.size, THREADS]
80
+
81
+ reports_succeeded = Queue.new()
82
+ reports_failed = Queue.new()
83
+
84
+ # Creating a mutex to control access to the queue.
85
+ queue_mutex = Mutex.new
86
+
87
+ # Start all the threads.
88
+ threads = (1..THREADS).map do |thread_id|
89
+ Thread.new(report_definition) do |local_def|
90
+ cid = nil
91
+ begin
92
+ cid = queue_mutex.synchronize {(queue.empty?) ? nil : queue.pop(true)}
93
+ if cid
94
+ retry_count = 0
95
+ file_name = "adgroup_%010d.csv" % cid
96
+ puts "[%2d/%d] Loading report for customer ID %s into '%s'..." %
97
+ [thread_id, retry_count,
98
+ AdwordsApi::Utils.format_id(cid), file_name]
99
+ begin
100
+ report_utils.download_report_as_file(local_def, file_name, cid)
101
+ reports_succeeded << {:cid => cid, :file_name => file_name}
102
+ rescue AdwordsApi::Errors::ReportError => e
103
+ if e.http_code == 500 && retry_count < MAX_RETRIES
104
+ retry_count += 1
105
+ sleep(retry_count * BACKOFF_FACTOR)
106
+ retry
107
+ else
108
+ puts(("Report failed for customer ID %s with code %d after %d " +
109
+ "retries.") % [cid, e.http_code, retry_count + 1])
110
+ reports_failed <<
111
+ {:cid => cid, :http_code => e.http_code, :message => e.message}
112
+ end
113
+ end
114
+ end
115
+ end while (cid != nil)
116
+ end
117
+ end
118
+
119
+ # Wait for all threads to finish.
120
+ threads.each { |aThread| aThread.join }
121
+
122
+ puts 'Download completed, results:'
123
+ puts 'Successful reports:'
124
+ while !reports_succeeded.empty? do
125
+ result = reports_succeeded.pop()
126
+ puts "\tClient ID %s => '%s'" %
127
+ [AdwordsApi::Utils.format_id(result[:cid]), result[:file_name]]
128
+ end
129
+ puts 'Failed reports:'
130
+ while !reports_failed.empty? do
131
+ result = reports_failed.pop()
132
+ puts "\tClient ID %s => Code: %d, Message: '%s'" %
133
+ [AdwordsApi::Utils.format_id(result[:cid]),
134
+ result[:http_code], result[:message]]
135
+ end
136
+ puts 'End of results.'
137
+ end
138
+
139
+ if __FILE__ == $0
140
+ API_VERSION = :v201209
141
+ # Number of parallel threads to spawn.
142
+ THREADS = 10
143
+ # Maximum number of retries for 500 errors.
144
+ MAX_RETRIES = 5
145
+ # Timeout between retries in seconds.
146
+ BACKOFF_FACTOR = 5
147
+
148
+ begin
149
+ parallel_report_download()
150
+
151
+ # HTTP errors.
152
+ rescue AdsCommon::Errors::HttpError => e
153
+ puts "HTTP Error: %s" % e
154
+
155
+ # API errors.
156
+ rescue AdwordsApi::Errors::ReportError => e
157
+ puts "Reporting Error: %s" % e.message
158
+ end
159
+ end
@@ -0,0 +1,110 @@
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 adds various types of targeting criteria to a campaign. To get
22
+ # campaigns list, run get_campaigns.rb.
23
+ #
24
+ # Tags: CampaignCriterionService.mutate
25
+
26
+ require 'adwords_api'
27
+
28
+ def add_campaign_targeting_criteria(campaign_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
+ campaign_criterion_srv =
38
+ adwords.service(:CampaignCriterionService, API_VERSION)
39
+
40
+ # Create campaign criteria.
41
+ campaign_criteria = [
42
+ # Location criteria. The IDs can be found in the documentation or retrieved
43
+ # with the LocationCriterionService.
44
+ {:xsi_type => 'Location', :id => 21137}, # California, USA
45
+ {:xsi_type => 'Location', :id => 2484}, # Mexico
46
+ # Language criteria. The IDs can be found in the documentation or retrieved
47
+ # with the ConstantDataService.
48
+ {:xsi_type => 'Language', :id => 1000}, # English
49
+ {:xsi_type => 'Language', :id => 1003}, # Spanish
50
+ # Platform criteria. The IDs can be found in the documentation.
51
+ {:xsi_type => 'Platform', :id => 30001}, # Mobile
52
+ {:xsi_type => 'Platform', :id => 30002} # Tablets
53
+ ]
54
+
55
+ # Create operations.
56
+ operations = campaign_criteria.map do |criterion|
57
+ {:operator => 'ADD',
58
+ :operand => {
59
+ :campaign_id => campaign_id,
60
+ :criterion => criterion}
61
+ }
62
+ end
63
+
64
+ # Create operation to add a negative campaign placement.
65
+ operations << {
66
+ :operator => 'ADD',
67
+ :operand => {
68
+ :xsi_type => 'NegativeCampaignCriterion',
69
+ :campaign_id => campaign_id,
70
+ :criterion => {
71
+ :xsi_type => 'Placement',
72
+ :url => 'http://mars.google.com'
73
+ }
74
+ }
75
+ }
76
+
77
+ response = campaign_criterion_srv.mutate(operations)
78
+
79
+ criteria = response[:value]
80
+ criteria.each do |campaign_criterion|
81
+ criterion = campaign_criterion[:criterion]
82
+ puts ("Campaign criterion with campaign ID %d, criterion ID %d and " +
83
+ "type '%s' was added.") % [campaign_criterion[:campaign_id],
84
+ criterion[:id], criterion[:criterion_type]]
85
+ end
86
+ end
87
+
88
+ if __FILE__ == $0
89
+ API_VERSION = :v201209
90
+
91
+ begin
92
+ campaign_id = 'INSERT_CAMPAIGN_ID_HERE'
93
+ add_campaign_targeting_criteria(campaign_id)
94
+
95
+ # HTTP errors.
96
+ rescue AdsCommon::Errors::HttpError => e
97
+ puts "HTTP Error: %s" % e
98
+
99
+ # API errors.
100
+ rescue AdwordsApi::Errors::ApiException => e
101
+ puts "Message: %s" % e.message
102
+ puts 'Errors:'
103
+ e.errors.each_with_index do |error, index|
104
+ puts "\tError [%d]:" % (index + 1)
105
+ error.each do |field, value|
106
+ puts "\t\t%s: %s" % [field, value]
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,104 @@
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 all the campaign targets. To set
22
+ # campaign targets, run add_campaign_targeting_criteria.rb.
23
+ #
24
+ # Tags: CampaignCriterionService.get
25
+
26
+ require 'adwords_api'
27
+
28
+ def get_campaign_targeting_criteria(campaign_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
+ campaign_criterion_srv =
38
+ adwords.service(:CampaignCriterionService, API_VERSION)
39
+
40
+ # Selector to get all the targeting for this campaign.
41
+ selector = {
42
+ :fields => ['Id', 'CriteriaType', 'PlacementUrl'],
43
+ :predicates => [
44
+ {:field => 'CampaignId', :operator => 'EQUALS', :values => [campaign_id]},
45
+ {
46
+ :field => 'CriteriaType',
47
+ :operator => 'EQUALS',
48
+ :values => ['PLACEMENT']
49
+ }
50
+ ],
51
+ :paging => {
52
+ :start_index => 0,
53
+ :number_results => PAGE_SIZE
54
+ }
55
+ }
56
+
57
+ # Set initial values.
58
+ offset, page = 0, {}
59
+
60
+ begin
61
+ page = campaign_criterion_srv.get(selector)
62
+ if page[:entries]
63
+ page[:entries].each do |criterion|
64
+ placement = criterion[:criterion]
65
+ puts "Placement with ID %d, type '%s' and URL '%s' was found." %
66
+ [placement[:id], placement[:type], placement[:url]]
67
+ end
68
+ # Increment values to request the next page.
69
+ offset += PAGE_SIZE
70
+ selector[:paging][:start_index] = offset
71
+ end
72
+ end while page[:total_num_entries] > offset
73
+
74
+ if page.include?(:total_num_entries)
75
+ puts "\tCampaign ID %d has %d placements." %
76
+ [campaign_id, page[:total_num_entries]]
77
+ end
78
+ end
79
+
80
+ if __FILE__ == $0
81
+ API_VERSION = :v201209
82
+ PAGE_SIZE = 500
83
+
84
+ begin
85
+ # Specify campaign ID to get targeting for.
86
+ campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
87
+ get_campaign_targeting_criteria(campaign_id)
88
+
89
+ # HTTP errors.
90
+ rescue AdsCommon::Errors::HttpError => e
91
+ puts "HTTP Error: %s" % e
92
+
93
+ # API errors.
94
+ rescue AdwordsApi::Errors::ApiException => e
95
+ puts "Message: %s" % e.message
96
+ puts 'Errors:'
97
+ e.errors.each_with_index do |error, index|
98
+ puts "\tError [%d]:" % (index + 1)
99
+ error.each do |field, value|
100
+ puts "\t\t%s: %s" % [field, value]
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,82 @@
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 all languages and carriers available
22
+ # for targeting.
23
+ #
24
+ # Tags: ConstantDataService.getLanguageCriterion
25
+ # Tags: ConstantDataService.getCarrierCriterion
26
+
27
+ require 'adwords_api'
28
+
29
+ def get_targetable_languages_and_carriers()
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
+ constant_data_srv = adwords.service(:ConstantDataService, API_VERSION)
39
+
40
+ # Get all languages from ConstantDataService.
41
+ languages = constant_data_srv.get_language_criterion()
42
+
43
+ if languages
44
+ languages.each do |language|
45
+ puts "Language name is '%s', ID is %d and code is '%s'." %
46
+ [language[:name], language[:id], language[:code]]
47
+ end
48
+ else
49
+ puts 'No languages were found.'
50
+ end
51
+
52
+ # Get all carriers from ConstantDataService.
53
+ carriers = constant_data_srv.get_carrier_criterion()
54
+
55
+ carriers.each do |carrier|
56
+ puts "Carrier name is '%s', ID is %d and country code is '%s'." %
57
+ [carrier[:name], carrier[:id], carrier[:country_code]]
58
+ end
59
+ end
60
+
61
+ if __FILE__ == $0
62
+ API_VERSION = :v201209
63
+
64
+ begin
65
+ get_targetable_languages_and_carriers()
66
+
67
+ # HTTP errors.
68
+ rescue AdsCommon::Errors::HttpError => e
69
+ puts "HTTP Error: %s" % e
70
+
71
+ # API errors.
72
+ rescue AdwordsApi::Errors::ApiException => e
73
+ puts "Message: %s" % e.message
74
+ puts 'Errors:'
75
+ e.errors.each_with_index do |error, index|
76
+ puts "\tError [%d]:" % (index + 1)
77
+ error.each do |field, value|
78
+ puts "\t\t%s: %s" % [field, value]
79
+ end
80
+ end
81
+ end
82
+ end