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
@@ -0,0 +1,138 @@
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 demonstrates how to handle policy violation errors. To create
22
+ # an ad group, run add_ad_group.rb.
23
+ #
24
+ # Tags: AdGroupAdService.mutate
25
+
26
+ require 'adwords_api'
27
+ require 'adwords_api/utils'
28
+
29
+ def handle_policy_violation_error(ad_group_id)
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
+ ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)
39
+
40
+ # Create third party ad that violates a policy.
41
+ text_ad_operation = {
42
+ :operator => 'ADD',
43
+ :operand => {
44
+ :ad_group_id => ad_group_id,
45
+ :ad => {
46
+ :xsi_type => 'ThirdPartyRedirectAd',
47
+ :name => 'Policy violation demo ad %d' % (Time.new.to_f * 1000).to_i,
48
+ :url => 'gopher://gopher.google.com',
49
+ :dimensions => {
50
+ :height => 250,
51
+ :width => 300
52
+ },
53
+ :snippet =>
54
+ '<img src="https://sandbox.google.com/sandboximages/image.jpg"/>',
55
+ :impression_beacon_url => 'http://www.examples.com/beacon',
56
+ :certified_vendor_format_id => 119,
57
+ :is_cookie_targeted => false,
58
+ :is_user_interest_targeted => false,
59
+ :is_tagged => false
60
+ }
61
+ }
62
+ }
63
+
64
+ operations = [text_ad_operation]
65
+
66
+ # Validate ad.
67
+ begin
68
+ # Enable "validate only" for the length of this block
69
+ adwords.validate_only do
70
+ ad_group_ad_srv.mutate(operations)
71
+ end
72
+ raise StandardError, 'Validation successful, no errors returned.'
73
+ rescue AdwordsApi::Errors::ApiException => e
74
+ e.errors.each do |error|
75
+ if error[:xsi_type] == 'PolicyViolationError'
76
+ operation_index = AdwordsApi::Utils.operation_index_for_error(error)
77
+ operation = operations[operation_index]
78
+ puts "Ad with URL '%s' violated %s policy '%s'." %
79
+ [operation[:operand][:ad][:url],
80
+ error[:is_exemptable] ? 'exemptable' : 'non-exemptable',
81
+ error[:external_policy_name]]
82
+ if error[:is_exemptable]
83
+ # Add exemption request to the operation.
84
+ puts "Adding exemption request for policy name '%s' on text '%s'." %
85
+ [error[:key][:policy_name], error[:key][:violating_text]]
86
+ unless operation[:exemption_requests]
87
+ operation[:exemption_requests] = []
88
+ end
89
+ operation[:exemption_requests] << {
90
+ :key => error[:key]
91
+ }
92
+ else
93
+ # Remove non-exemptable operation
94
+ puts 'Removing the operation from the request.'
95
+ operations.delete(operation)
96
+ end
97
+ else
98
+ # Non-policy error returned, re-throw exception.
99
+ raise e
100
+ end
101
+ end
102
+ end
103
+
104
+ # Add ads.
105
+ if operations.size > 0
106
+ response = ad_group_ad_srv.mutate(operations)
107
+ ads = response[:value]
108
+ puts "Added %d ad(s) to ad group ID %d." % [ads.length, ad_group_id]
109
+ ads.each do |ad|
110
+ puts "\tAd ID is %d, type is '%s' and status is '%s'." %
111
+ [ad[:ad][:id], ad[:ad][:xsi_type], ad[:status]]
112
+ end
113
+ end
114
+ end
115
+
116
+ if __FILE__ == $0
117
+ API_VERSION = :v201209
118
+
119
+ begin
120
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
121
+ handle_policy_violation_error(ad_group_id)
122
+
123
+ # HTTP errors.
124
+ rescue AdsCommon::Errors::HttpError => e
125
+ puts "HTTP Error: %s" % e
126
+
127
+ # API errors.
128
+ rescue AdwordsApi::Errors::ApiException => e
129
+ puts "Message: %s" % e.message
130
+ puts 'Errors:'
131
+ e.errors.each_with_index do |error, index|
132
+ puts "\tError [%d]:" % (index + 1)
133
+ error.each do |field, value|
134
+ puts "\t\t%s: %s" % [field, value]
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,87 @@
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 handle 'two factor' authorization error.
22
+
23
+ require 'adwords_api'
24
+
25
+ def handle_two_factor_authorization_error()
26
+ # Set up credentials with an account that has 2Factor enabled.
27
+ config = {
28
+ :authentication => {
29
+ :method => 'ClientLogin',
30
+ :email => '2steptester@gmail.com',
31
+ :password => 'testaccount',
32
+ :user_agent => 'Ruby 2 Factor Sample'
33
+ },
34
+ :service => {
35
+ :environment => 'PRODUCTION'
36
+ }
37
+ }
38
+ adwords = AdwordsApi::Api.new(config)
39
+
40
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
41
+ # the configuration file or provide your own logger:
42
+ # adwords.logger = Logger.new('adwords_xml.log')
43
+
44
+ begin
45
+ # Forcing library to request authorization token.
46
+ auth_token = adwords.authorize()
47
+ puts 'Successfully retrieved the token.'
48
+
49
+ # Second factor error is one of AuthErrors.
50
+ rescue AdsCommon::Errors::AuthError => e
51
+ puts "Authorization failed with message:"
52
+ puts "\t%s" % e.message
53
+ # Checking 'Info' field for particular auth error type.
54
+ if e.info and e.info.casecmp('InvalidSecondFactor') == 0
55
+ puts "The user has enabled two factor authentication in this account." +
56
+ " Please use OAuth authentication method or have the user generate an" +
57
+ " application-specific password to make calls against the AdWords" +
58
+ " API. See \n" +
59
+ " http://adwordsapi.blogspot.com/2011/02/authentication-changes-with" +
60
+ "-2-step.html\n" +
61
+ "for more details."
62
+ end
63
+ end
64
+ end
65
+
66
+ if __FILE__ == $0
67
+ API_VERSION = :v201209
68
+
69
+ begin
70
+ handle_two_factor_authorization_error()
71
+
72
+ # HTTP errors.
73
+ rescue AdsCommon::Errors::HttpError => e
74
+ puts "HTTP Error: %s" % e
75
+
76
+ # API errors.
77
+ rescue AdwordsApi::Errors::ApiException => e
78
+ puts "Message: %s" % e.message
79
+ puts 'Errors:'
80
+ e.errors.each_with_index do |error, index|
81
+ puts "\tError [%d]:" % (index + 1)
82
+ error.each do |field, value|
83
+ puts "\t\t%s: %s" % [field, value]
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,101 @@
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 images and videos. To upload an
22
+ # image, run upload_image.rb. To upload video, see:
23
+ # http://adwords.google.com/support/aw/bin/answer.py?hl=en&answer=39454.
24
+ #
25
+ # Tags: MediaService.get
26
+
27
+ require 'adwords_api'
28
+ require 'adwords_api/utils'
29
+
30
+ def get_all_images_and_videos()
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
+ media_srv = adwords.service(:MediaService, API_VERSION)
40
+
41
+ # Get all the images and videos.
42
+ selector = {
43
+ :fields => ['MediaId', 'Height', 'Width', 'MimeType', 'Urls'],
44
+ :ordering => [
45
+ {:field => 'MediaId', :sort_order => 'ASCENDING'}
46
+ ],
47
+ :predicates => [
48
+ {:field => 'Type', :operator => 'IN', :values => ['IMAGE', 'VIDEO']}
49
+ ],
50
+ :paging => {
51
+ :start_index => 0,
52
+ :number_results => PAGE_SIZE
53
+ }
54
+ }
55
+
56
+ # Set initial values.
57
+ offset, page = 0, {}
58
+
59
+ begin
60
+ page = media_srv.get(selector)
61
+ if page[:entries]
62
+ page[:entries].each do |entry|
63
+ dimensions = AdwordsApi::Utils.map(entry[:dimensions])
64
+ puts "Entry ID %d with dimensions %dx%d and MIME type is '%s'" %
65
+ [entry[:media_id], dimensions['FULL'][:height],
66
+ dimensions['FULL'][:width], entry[:mime_type]]
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 "\tFound %d entries." % page[:total_num_entries]
76
+ end
77
+ end
78
+
79
+ if __FILE__ == $0
80
+ API_VERSION = :v201209
81
+ PAGE_SIZE = 500
82
+
83
+ begin
84
+ get_all_images_and_videos()
85
+
86
+ # HTTP errors.
87
+ rescue AdsCommon::Errors::HttpError => e
88
+ puts "HTTP Error: %s" % e
89
+
90
+ # API errors.
91
+ rescue AdwordsApi::Errors::ApiException => e
92
+ puts "Message: %s" % e.message
93
+ puts 'Errors:'
94
+ e.errors.each_with_index do |error, index|
95
+ puts "\tError [%d]:" % (index + 1)
96
+ error.each do |field, value|
97
+ puts "\t\t%s: %s" % [field, value]
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.sgomes@gmail.com (Sérgio Gomes)
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 uploads an image. To get images, run
22
+ # get_all_images_and_videos.rb.
23
+ #
24
+ # Tags: MediaService.upload
25
+
26
+ require 'adwords_api'
27
+ require 'adwords_api/utils'
28
+ require 'base64'
29
+
30
+ def upload_image()
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
+ media_srv = adwords.service(:MediaService, API_VERSION)
40
+
41
+ # Create image.
42
+ image_url =
43
+ 'http://www.google.com/intl/en/adwords/select/images/samples/inline.jpg'
44
+ # This utility method retrieves the contents of a URL using all of the config
45
+ # options provided to the Api object.
46
+ image_data = AdsCommon::Http.get(image_url, adwords.config)
47
+ base64_image_data = Base64.encode64(image_data)
48
+ image = {
49
+ # The 'xsi_type' field allows you to specify the xsi:type of the object
50
+ # being created. It's only necessary when you must provide an explicit
51
+ # type that the client library can't infer.
52
+ :xsi_type => 'Image',
53
+ :data => base64_image_data,
54
+ :type => 'IMAGE'
55
+ }
56
+
57
+ # Upload image.
58
+ response = media_srv.upload([image])
59
+ ret_image = response.first
60
+ dimensions = AdwordsApi::Utils.map(ret_image[:dimensions])
61
+ puts "Image with id #{ret_image[:media_id]}, dimensions " +
62
+ "#{dimensions['FULL'][:height]}x#{dimensions['FULL'][:width]} " +
63
+ "and MIME type \"#{ret_image[:mime_type]}\" uploaded successfully."
64
+ end
65
+
66
+ if __FILE__ == $0
67
+ API_VERSION = :v201209
68
+
69
+ begin
70
+ upload_image()
71
+
72
+ # HTTP errors.
73
+ rescue AdsCommon::Errors::HttpError => e
74
+ puts "HTTP Error: %s" % e
75
+
76
+ # API errors.
77
+ rescue AdwordsApi::Errors::ApiException => e
78
+ puts "Message: %s" % e.message
79
+ puts 'Errors:'
80
+ e.errors.each_with_index do |error, index|
81
+ puts "\tError [%d]:" % (index + 1)
82
+ error.each do |field, value|
83
+ puts "\t\t%s: %s" % [field, value]
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,97 @@
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 use OAuth authentication method.
22
+ #
23
+ # Tags: CampaignService.get
24
+
25
+ require 'adwords_api'
26
+
27
+ def use_oauth()
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
+ campaign_srv = adwords.service(:CampaignService, API_VERSION)
37
+
38
+ # Get all the campaigns for this account; empty selector.
39
+ selector = {
40
+ :fields => ['Id', 'Name', 'Status'],
41
+ :ordering => [
42
+ {:field => 'Name', :sort_order => 'ASCENDING'}
43
+ ]
44
+ }
45
+
46
+ retry_count = 0
47
+
48
+ begin
49
+ response = campaign_srv.get(selector)
50
+ rescue AdsCommon::Errors::OAuthVerificationRequired => e
51
+ if retry_count < MAX_RETRIES
52
+ puts "Hit Auth error, please navigate to URL:\n\t%s" % e.oauth_url
53
+ print 'log in and type the verification code: '
54
+ verification_code = gets.chomp
55
+ adwords.credential_handler.set_credential(
56
+ :oauth_verification_code, verification_code)
57
+ retry_count += 1
58
+ retry
59
+ else
60
+ raise AdsCommon::Errors::AuthError, 'Failed to authenticate.'
61
+ end
62
+ end
63
+
64
+ if response and response[:entries]
65
+ campaigns = response[:entries]
66
+ campaigns.each do |campaign|
67
+ puts "Campaign ID %d, name '%s' and status '%s'" %
68
+ [campaign[:id], campaign[:name], campaign[:status]]
69
+ end
70
+ else
71
+ puts 'No campaigns were found.'
72
+ end
73
+ end
74
+
75
+ if __FILE__ == $0
76
+ API_VERSION = :v201209
77
+ MAX_RETRIES = 3
78
+
79
+ begin
80
+ use_oauth()
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