google-adwords-api 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/ChangeLog +3 -0
  2. data/README +33 -22
  3. data/adwords_api.yml +5 -5
  4. data/examples/v201302/adwords_for_video/add_video_call_to_action.rb +94 -0
  5. data/examples/v201302/adwords_for_video/add_video_campaign.rb +103 -0
  6. data/examples/v201302/adwords_for_video/find_videos.rb +92 -0
  7. data/examples/v201302/adwords_for_video/get_keyword_criteria.rb +101 -0
  8. data/examples/v201302/adwords_for_video/get_targeting_groups.rb +93 -0
  9. data/examples/v201302/adwords_for_video/get_video_campaign_criteria.rb +99 -0
  10. data/examples/v201302/adwords_for_video/get_video_campaign_stats.rb +126 -0
  11. data/examples/v201302/adwords_for_video/get_video_campaigns.rb +94 -0
  12. data/lib/adwords_api.rb +5 -5
  13. data/lib/adwords_api/api_config.rb +16 -2
  14. data/lib/adwords_api/v201302/video_ad_service.rb +38 -0
  15. data/lib/adwords_api/v201302/video_ad_service_registry.rb +46 -0
  16. data/lib/adwords_api/v201302/video_campaign_criterion_service.rb +38 -0
  17. data/lib/adwords_api/v201302/video_campaign_criterion_service_registry.rb +47 -0
  18. data/lib/adwords_api/v201302/video_campaign_service.rb +38 -0
  19. data/lib/adwords_api/v201302/video_campaign_service_registry.rb +46 -0
  20. data/lib/adwords_api/v201302/video_service.rb +42 -0
  21. data/lib/adwords_api/v201302/video_service_registry.rb +46 -0
  22. data/lib/adwords_api/v201302/video_targeting_group_criterion_service.rb +38 -0
  23. data/lib/adwords_api/v201302/video_targeting_group_criterion_service_registry.rb +46 -0
  24. data/lib/adwords_api/v201302/video_targeting_group_service.rb +38 -0
  25. data/lib/adwords_api/v201302/video_targeting_group_service_registry.rb +46 -0
  26. data/lib/adwords_api/version.rb +1 -1
  27. data/test/adwords_api/test_adwords_api.rb +23 -0
  28. data/test/templates/v201209/basic_operations_get_campaigns.def +1 -1
  29. data/test/templates/v201302/basic_operations_get_campaigns.def +1 -1
  30. data/test/templates/v201302/misc_use_oauth2_jwt.def +1 -1
  31. metadata +22 -2
data/ChangeLog CHANGED
@@ -1,3 +1,6 @@
1
+ 0.9.2:
2
+ - AdWords for Video API v201302 support and examples (beta feature).
3
+
1
4
  0.9.1:
2
5
  - Support and examples for AdGroupBidModifierService.
3
6
 
data/README CHANGED
@@ -45,19 +45,24 @@ There is an example configuration file shipped with these libraries.
45
45
  You can also pass API a manually constructed config hash like:
46
46
  adwords = AdwordsApi::Api.new({
47
47
  :authentication => {
48
- :method => 'ClientLogin',
48
+ :method => 'OAuth2',
49
+ :oauth2_client_id: 'INSERT_OAUTH2_CLIENT_ID_HERE'
50
+ :oauth2_client_secret: 'INSERT_OAUTH2_CLIENT_SECRET_HERE'
49
51
  :developer_token => 'DEVELOPER_TOKEN',
50
- :user_agent => 'Ruby Sample',
51
- :password => 'PASSWORD',
52
- :email => 'user@domain.com',
53
- :client_customer_id => '012-345-6789'
52
+ :client_customer_id => '012-345-6789',
53
+ :user_agent => 'Ruby Sample'
54
54
  },
55
55
  :service => {
56
56
  :environment => 'PRODUCTION'
57
57
  }
58
58
  })
59
59
 
60
- Then, just specify which service you're looking to use, and which version:
60
+ To obtain OAuth2 client credentials, follow instructions on the wiki:
61
+
62
+ http://code.google.com/p/google-api-ads-ruby/wiki/OAuth2
63
+
64
+ Once the library instance is create, specify which service you're looking to
65
+ use, and which version:
61
66
  campaign_srv = adwords.service(:CampaignService, :v201302)
62
67
 
63
68
  and you should now be able to just use the API methods in the object you were
@@ -91,14 +96,12 @@ In order to make things more Ruby-like for our Ruby developers, we've renamed
91
96
  API objects and methods to more closely match Ruby conventions. This means using
92
97
  snake_case for methods and parameters, and UpperCamelCase for class names.
93
98
 
94
- For example, the 'getReportFields' method of the ReportDefinitionService is
95
- named 'get_report_fields' in the client library. You invoke it by doing:
96
- response = report_def_srv.get_report_fields(report_type)
99
+ For example, the 'startDate' field of the Campaign object is named 'start_date'
100
+ in the client library. The 'get' method, returns a CampaignPage object which has
101
+ an 'entries' and a 'total_num_entries' field. So, to access the return
102
+ values, you would do this:
97
103
 
98
- The 'get' method, on the other hand, returns a ReportDefinitionPage object which
99
- has an 'entries' and a 'total_num_entries' field. So, to access the return
100
- values, you would do:
101
- response = report_def_srv.get(selector)
104
+ response = campaign_srv.get(selector)
102
105
  num_entries = response[:total_num_entries]
103
106
 
104
107
  Essentially, all you have to do is follow Ruby conventions, and the library will
@@ -142,20 +145,23 @@ Request details and units spend are logged at the INFO log level, while raw HTTP
142
145
  headers and XML dumps are logged at the DEBUG log level. For more details on
143
146
  using Logger refer to the Ruby Logger documentation.
144
147
 
145
- === 2.4 - Calculating unit spend:
148
+ === 2.4 - Calculating operations usage
149
+
150
+ Each AdWords API operation performed consumes a certain number of operations as
151
+ described in the rate sheet:
146
152
 
147
- Each AdWords API operation performed consumes a certain number of API units, as
148
- specified in the rate sheet:
149
- http://code.google.com/apis/adwords/docs/ratesheet.html
153
+ https://developers.google.com/adwords/api/docs/ratesheet
150
154
 
151
- The amount of units spent is returned in the header part of the SOAP response.
152
- This information can be obtained by passing a user block during method call:
153
- response = report_def_srv.get(selector) do |header|
154
- puts "Units spent: %d" % header[:units]
155
+ The amount of operations consumed is returned in the header part of the SOAP
156
+ response. This information can be obtained by passing a user block during the
157
+ method call:
158
+
159
+ response = campaign_srv.get(selector) do |header|
160
+ puts "Operations consumed: %d" % header[:operations]
155
161
  end
156
162
 
157
163
  You can also retrieve the response body as the second block parameter:
158
- report_def_srv.get(selector) {|header, body| ... }
164
+ campaign_srv.get(selector) {|header, body| ... }
159
165
 
160
166
  === 2.5 - GZip compression
161
167
 
@@ -195,6 +201,11 @@ Questions can be asked on forum
195
201
 
196
202
  http://groups.google.com/group/adwords-api
197
203
 
204
+ Make sure to subscribe to our Google Plus page for API change announcements and
205
+ other news:
206
+
207
+ https://plus.google.com/+GoogleAdsDevelopers
208
+
198
209
 
199
210
  = Copyright/License Info
200
211
 
data/adwords_api.yml CHANGED
@@ -4,14 +4,14 @@
4
4
  :authentication:
5
5
  # Authentication method, methods currently supported: OAUTH2, OAUTH2_JWT,
6
6
  # ClientLogin.
7
- :method: ClientLogin
7
+ :method: OAuth2
8
8
 
9
9
  # Auth parameters for OAUTH2 method.
10
10
  # Set the OAuth2 client id and secret. Register your application here to
11
11
  # obtain these values:
12
12
  # https://code.google.com/apis/console#access
13
- #:oauth2_client_id: INSERT_OAUTH2_CLIENT_ID_HERE
14
- #:oauth2_client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
13
+ :oauth2_client_id: INSERT_OAUTH2_CLIENT_ID_HERE
14
+ :oauth2_client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
15
15
  # Optional, see: https://developers.google.com/accounts/docs/OAuth2WebServer
16
16
  #:oauth2_callback: INSERT_OAUTH2_CALLBACK_URL_HERE
17
17
  #:oauth2_state: INSERT_OAUTH2_STATE_HERE
@@ -30,8 +30,8 @@
30
30
 
31
31
  # Auth parameters for ClientLogin method.
32
32
  # NOTE: ClientLogin method is deprecated, use OAuth2.0 instead.
33
- :password: INSERT_YOUR_PASSWORD_HERE
34
- :email: INSERT_YOUR_LOGIN_EMAIL_HERE
33
+ #:password: INSERT_YOUR_PASSWORD_HERE
34
+ #:email: INSERT_YOUR_LOGIN_EMAIL_HERE
35
35
  # To manage your auth tokens manually, use the 'auth_token' property.
36
36
  #:auth_token: INSERT_AUTH_TOKEN_HERE
37
37
 
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
7
+ #
8
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ # This example illustrates how to create a video call to action overlay.
22
+ #
23
+ # Note: AdWords for Video API is a Beta feature.
24
+ #
25
+ # Tags: VideoService.mutateCallToAction
26
+
27
+ require 'adwords_api'
28
+
29
+ def add_video_call_to_action(video_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
+ video_srv = adwords.service(:VideoService, API_VERSION)
39
+
40
+ # Create VideoCallToAction locally.
41
+ video_call_to_action = {
42
+ :id => video_id,
43
+ :call_to_action => {
44
+ :creative => {
45
+ :headline => 'Mars cruises',
46
+ :description_line1 => 'Astonishing views',
47
+ :description_line2 => 'Mild climate',
48
+ :display_url => 'www.example.com/mars',
49
+ :destination_url => 'www.example.com/mars'
50
+ }
51
+ }
52
+ }
53
+
54
+ # Run a mutate request with ADD operator.
55
+ response = video_srv.mutate_call_to_action([
56
+ {:operator => 'SET', :operand => video_call_to_action}
57
+ ])
58
+
59
+ if response and response[:value]
60
+ response[:value].each do |video_call_to_action|
61
+ puts "CallToAction overlay was added to video ID '%s', headline '%s'." %
62
+ [video_call_to_action[:id],
63
+ video_call_to_action[:call_to_action][:creative][:headline]]
64
+ end
65
+ else
66
+ raise new StandardError, 'No call to action overlays were added.'
67
+ end
68
+ end
69
+
70
+ if __FILE__ == $0
71
+ API_VERSION = :v201302
72
+
73
+ begin
74
+ # Video ID to add call to action to.
75
+ video_id = 'INSERT_VIDEO_ID_HERE'
76
+
77
+ add_video_call_to_action(video_id)
78
+
79
+ # HTTP errors.
80
+ rescue AdsCommon::Errors::HttpError => e
81
+ puts "HTTP Error: %s" % e
82
+
83
+ # API errors.
84
+ rescue AdwordsApi::Errors::ApiException => e
85
+ puts "Message: %s" % e.message
86
+ puts 'Errors:'
87
+ e.errors.each_with_index do |error, index|
88
+ puts "\tError [%d]:" % (index + 1)
89
+ error.each do |field, value|
90
+ puts "\t\t%s: %s" % [field, value]
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
7
+ #
8
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ # This example illustrates how to create a video campaign.
22
+ #
23
+ # Note: AdWords for Video API is a Beta feature.
24
+ #
25
+ # Tags: VideoCampaignService.mutate, BudgetService.mutate
26
+
27
+ require 'adwords_api'
28
+ require 'date'
29
+
30
+ def add_video_campaign()
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
+ budget_srv = adwords.service(:BudgetService, API_VERSION)
40
+ video_campaign_srv = adwords.service(:VideoCampaignService, API_VERSION)
41
+
42
+ # Create a budget, which can be shared by multiple campaigns.
43
+ budget = {
44
+ :name => 'Video budget #%d' % (Time.new.to_f * 1000).to_i,
45
+ :amount => {:micro_amount => 50000000},
46
+ :delivery_method => 'STANDARD',
47
+ :period => 'DAILY'
48
+ }
49
+ budget_operation = {:operator => 'ADD', :operand => budget}
50
+
51
+ # Add budget.
52
+ return_budget = budget_srv.mutate([budget_operation])
53
+ budget_id = return_budget[:value].first[:budget_id]
54
+
55
+ # Create video campaign.
56
+ campaigns = [{
57
+ :name => "Interplanetary Video #%d" % (Time.new.to_f * 1000).to_i,
58
+ :status => 'PAUSED',
59
+ :budget_id => budget_id,
60
+ # Optional fields:
61
+ :start_date =>
62
+ DateTime.parse((Date.today + 1).to_s).strftime('%Y%m%d'),
63
+ }]
64
+
65
+ # Prepare for adding campaign.
66
+ operations = campaigns.map do |campaign|
67
+ {:operator => 'ADD', :operand => campaign}
68
+ end
69
+
70
+ # Add video campaign.
71
+ response = video_campaign_srv.mutate(operations)
72
+ if response and response[:value]
73
+ response[:value].each do |campaign|
74
+ puts "Campaign with name '%s' and ID %d was added." %
75
+ [campaign[:name], campaign[:id]]
76
+ end
77
+ else
78
+ raise new StandardError, 'No campaigns were added.'
79
+ end
80
+ end
81
+
82
+ if __FILE__ == $0
83
+ API_VERSION = :v201302
84
+
85
+ begin
86
+ add_video_campaign()
87
+
88
+ # HTTP errors.
89
+ rescue AdsCommon::Errors::HttpError => e
90
+ puts "HTTP Error: %s" % e
91
+
92
+ # API errors.
93
+ rescue AdwordsApi::Errors::ApiException => e
94
+ puts "Message: %s" % e.message
95
+ puts 'Errors:'
96
+ e.errors.each_with_index do |error, index|
97
+ puts "\tError [%d]:" % (index + 1)
98
+ error.each do |field, value|
99
+ puts "\t\t%s: %s" % [field, value]
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2013, 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 find YouTube videos by a search string. It
22
+ # retrieve details for the first 100 matching videos.
23
+ #
24
+ # Note: AdWords for Video API is a Beta feature.
25
+ #
26
+ # Tags: VideoService.search
27
+
28
+ require 'adwords_api'
29
+
30
+ def find_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
+ video_srv = adwords.service(:VideoService, API_VERSION)
40
+
41
+ # Search string to use.
42
+ query_str = 'AdWords API with Ruby'
43
+
44
+ # Create a selector.
45
+ selector = {
46
+ :search_type => 'VIDEO',
47
+ :query => query_str,
48
+ :paging => {
49
+ :start_index => 0,
50
+ :number_results => PAGE_SIZE
51
+ }
52
+ }
53
+
54
+ # Run the query.
55
+ page = video_srv.search(selector)
56
+
57
+ if page[:entries]
58
+ page[:entries].each do |video|
59
+ puts "YouTube video ID '%s' with title '%s' found." %
60
+ [video[:id], video[:title]]
61
+ end
62
+ if page.include?(:total_num_entries)
63
+ puts "\tTotal number of matching videos: %d." % [page[:total_num_entries]]
64
+ end
65
+ else
66
+ puts "No videos matching '%s' were found." % query_str
67
+ end
68
+ end
69
+
70
+ if __FILE__ == $0
71
+ API_VERSION = :v201302
72
+ PAGE_SIZE = 100
73
+
74
+ begin
75
+ find_videos()
76
+
77
+ # HTTP errors.
78
+ rescue AdsCommon::Errors::HttpError => e
79
+ puts "HTTP Error: %s" % e
80
+
81
+ # API errors.
82
+ rescue AdwordsApi::Errors::ApiException => e
83
+ puts "Message: %s" % e.message
84
+ puts 'Errors:'
85
+ e.errors.each_with_index do |error, index|
86
+ puts "\tError [%d]:" % (index + 1)
87
+ error.each do |field, value|
88
+ puts "\t\t%s: %s" % [field, value]
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2013, 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 show how to retrieve all keywords for a video campaign. To get
22
+ # a list with all campaigns, run get_video_campaigns.rb.
23
+ #
24
+ # Note: AdWords for Video API is a Beta feature.
25
+ #
26
+ # Tags: VideoTargetingGroupCriterionService.get
27
+
28
+ require 'adwords_api'
29
+
30
+ def get_keyword_criteria(campaign_id)
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
+ vtgc_srv =
40
+ adwords.service(:VideoTargetingGroupCriterionService, API_VERSION)
41
+
42
+ # Get all the keywords for the campaign.
43
+ selector = {
44
+ :campaign_ids => [campaign_id],
45
+ :criterion_types => ['SEARCH_KEYWORD'],
46
+ :paging => {
47
+ :start_index => 0,
48
+ :number_results => PAGE_SIZE
49
+ }
50
+ }
51
+
52
+ # Set initial values.
53
+ offset, page = 0, {}
54
+
55
+ begin
56
+ page = vtgc_srv.get(selector)
57
+ if page[:entries]
58
+ page[:entries].each do |keyword|
59
+ negative_string =
60
+ ('NegativeTargetingGroupCriterion'.eql?(keyword[:xsi_type])) ?
61
+ ' (negative)' : ''
62
+ puts "Criterion%s ID %d, targeting group ID %d and text '%s'" %
63
+ [negative_string, keyword[:criterion][:id],
64
+ keyword[:targeting_group_id], keyword[:criterion][:text]]
65
+ end
66
+ # Increment values to request the next page.
67
+ offset += PAGE_SIZE
68
+ selector[:paging][:start_index] = offset
69
+ end
70
+ end while page[:total_num_entries] > offset
71
+
72
+ if page.include?(:total_num_entries)
73
+ puts "\tTotal number of keywords found: %d." % [page[:total_num_entries]]
74
+ end
75
+ end
76
+
77
+ if __FILE__ == $0
78
+ API_VERSION = :v201302
79
+ PAGE_SIZE = 500
80
+
81
+ begin
82
+ # Campaign ID to get criteria for.
83
+ campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
84
+ get_keyword_criteria(campaign_id)
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