google-adwords-api 0.5.1 → 0.5.2

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 (70) hide show
  1. data/ChangeLog +4 -0
  2. data/README +2 -1
  3. data/examples/v201109/account_management/create_account.rb +2 -2
  4. data/examples/v201109/account_management/get_account_alerts.rb +3 -3
  5. data/examples/v201109/account_management/get_account_changes.rb +2 -2
  6. data/examples/v201109/account_management/get_account_hierarchy.rb +2 -2
  7. data/examples/v201109/account_management/get_client_customer_id.rb +6 -8
  8. data/examples/v201109/account_management/get_client_unit_usage.rb +6 -7
  9. data/examples/v201109/basic_operations/add_ad_groups.rb +111 -0
  10. data/examples/v201109/basic_operations/add_campaigns.rb +125 -0
  11. data/examples/v201109/basic_operations/add_keywords.rb +16 -11
  12. data/examples/v201109/basic_operations/add_text_ads.rb +23 -19
  13. data/examples/v201109/basic_operations/delete_ad.rb +7 -7
  14. data/examples/v201109/basic_operations/delete_ad_group.rb +7 -7
  15. data/examples/v201109/basic_operations/delete_campaign.rb +7 -7
  16. data/examples/v201109/basic_operations/delete_keyword.rb +7 -7
  17. data/examples/v201109/basic_operations/get_ad_groups.rb +7 -7
  18. data/examples/v201109/basic_operations/get_campaigns.rb +3 -3
  19. data/examples/v201109/basic_operations/get_keywords.rb +7 -7
  20. data/examples/v201109/basic_operations/get_text_ads.rb +7 -7
  21. data/examples/v201109/basic_operations/pause_ad.rb +7 -7
  22. data/examples/v201109/basic_operations/update_ad_group.rb +6 -6
  23. data/examples/v201109/basic_operations/update_campaign.rb +6 -6
  24. data/examples/v201109/basic_operations/update_keyword.rb +7 -7
  25. data/examples/v201109/campaign_management/add_experiment.rb +14 -9
  26. data/examples/v201109/campaign_management/add_keywords_in_bulk.rb +5 -5
  27. data/examples/v201109/campaign_management/add_location_extension.rb +13 -7
  28. data/examples/v201109/campaign_management/add_location_extension_override.rb +7 -7
  29. data/examples/v201109/campaign_management/get_all_disapproved_ads.rb +6 -6
  30. data/examples/v201109/campaign_management/promote_experiment.rb +5 -6
  31. data/examples/v201109/campaign_management/set_ad_parameters.rb +8 -8
  32. data/examples/v201109/campaign_management/validate_text_ad.rb +7 -9
  33. data/examples/v201109/error_handling/handle_captcha_challenge.rb +3 -4
  34. data/examples/v201109/error_handling/handle_partial_failures.rb +5 -6
  35. data/examples/v201109/error_handling/handle_policy_violation_error.rb +5 -6
  36. data/examples/v201109/error_handling/handle_two_factor_authorization_error.rb +2 -2
  37. data/examples/v201109/misc/get_all_images_and_videos.rb +3 -3
  38. data/examples/v201109/misc/upload_image.rb +2 -2
  39. data/examples/v201109/misc/use_oauth.rb +3 -3
  40. data/examples/v201109/optimization/estimate_keyword_traffic.rb +2 -2
  41. data/examples/v201109/optimization/get_keyword_bid_simulations.rb +6 -7
  42. data/examples/v201109/optimization/get_keyword_ideas.rb +6 -7
  43. data/examples/v201109/optimization/get_placement_ideas.rb +6 -7
  44. data/examples/v201109/remarketing/add_audience.rb +5 -3
  45. data/examples/v201109/remarketing/add_conversion_tracker.rb +12 -3
  46. data/examples/v201109/reporting/download_criteria_report.rb +7 -8
  47. data/examples/v201109/reporting/download_defined_report.rb +6 -7
  48. data/examples/v201109/reporting/get_campaign_stats.rb +105 -0
  49. data/examples/v201109/reporting/get_defined_reports.rb +2 -2
  50. data/examples/v201109/reporting/get_report_fields.rb +6 -7
  51. data/examples/v201109/reporting/parallel_report_download.rb +8 -8
  52. data/examples/v201109/targeting/add_campaign_targeting_criteria.rb +5 -6
  53. data/examples/v201109/targeting/get_campaign_targeting_criteria.rb +7 -8
  54. data/examples/v201109/targeting/get_targetable_languages_and_carriers.rb +2 -2
  55. data/examples/v201109/targeting/lookup_location.rb +2 -2
  56. data/lib/adwords_api/version.rb +1 -1
  57. data/test/examples/v201109/test_account_management.rb +60 -0
  58. data/test/examples/v201109/test_basic_operations.rb +172 -0
  59. data/test/examples/v201109/test_campaign_management.rb +116 -0
  60. data/test/examples/v201109/test_error_handling.rb +63 -0
  61. data/test/examples/v201109/test_misc.rb +45 -0
  62. data/test/examples/v201109/test_optimization.rb +63 -0
  63. data/test/examples/v201109/test_remarketing.rb +39 -0
  64. data/test/examples/v201109/test_reporting.rb +89 -0
  65. data/test/examples/v201109/test_targeting.rb +60 -0
  66. data/test/examples/v201109/utils.rb +239 -0
  67. data/test/suite_exampletests.rb +31 -0
  68. metadata +18 -6
  69. data/examples/v201109/basic_operations/add_ad_group.rb +0 -89
  70. data/examples/v201109/basic_operations/add_campaign.rb +0 -99
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ 0.5.2:
2
+ - Rework on examples.
3
+ - Tests for all examples.
4
+
1
5
  0.5.1:
2
6
  - Require google-ads-common 0.6.3 or later from now on.
3
7
  - Support for CAPTCHA challenge handling.
data/README CHANGED
@@ -178,7 +178,8 @@ respond in gzipped format. All requests are sent uncompressed regardless.
178
178
  to regenerate the stubs if needed
179
179
 
180
180
  $ gem build google-adwords-api.gemspec
181
- to build the gem
181
+ $ gem build google-adx-buyer-api.gemspec
182
+ to build the gems
182
183
 
183
184
  $ rake test
184
185
  to run unit tests on the library
@@ -26,8 +26,6 @@
26
26
  require 'adwords_api'
27
27
  require 'adwords_api/utils'
28
28
 
29
- API_VERSION = :v201109
30
-
31
29
  def create_account()
32
30
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
33
31
  # when called without parameters.
@@ -59,6 +57,8 @@ def create_account()
59
57
  end
60
58
 
61
59
  if __FILE__ == $0
60
+ API_VERSION = :v201109
61
+
62
62
  begin
63
63
  create_account()
64
64
 
@@ -26,9 +26,6 @@
26
26
  require 'adwords_api'
27
27
  require 'adwords_api/utils'
28
28
 
29
- API_VERSION = :v201109
30
- PAGE_SIZE = 500
31
-
32
29
  def get_account_alerts()
33
30
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
34
31
  # when called without parameters.
@@ -90,6 +87,9 @@ def get_account_alerts()
90
87
  end
91
88
 
92
89
  if __FILE__ == $0
90
+ API_VERSION = :v201109
91
+ PAGE_SIZE = 500
92
+
93
93
  begin
94
94
  get_account_alerts()
95
95
 
@@ -27,8 +27,6 @@ require 'adwords_api'
27
27
  require 'date'
28
28
  require 'pp'
29
29
 
30
- API_VERSION = :v201109
31
-
32
30
  def get_account_changes()
33
31
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
34
32
  # when called without parameters.
@@ -116,6 +114,8 @@ def get_account_changes()
116
114
  end
117
115
 
118
116
  if __FILE__ == $0
117
+ API_VERSION = :v201109
118
+
119
119
  begin
120
120
  get_account_changes()
121
121
 
@@ -26,8 +26,6 @@
26
26
  require 'adwords_api'
27
27
  require 'adwords_api/utils'
28
28
 
29
- API_VERSION = :v201109
30
-
31
29
  def get_account_hierarchy()
32
30
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
33
31
  # when called without parameters.
@@ -72,6 +70,8 @@ def get_account_hierarchy()
72
70
  end
73
71
 
74
72
  if __FILE__ == $0
73
+ API_VERSION = :v201109
74
+
75
75
  begin
76
76
  get_account_hierarchy()
77
77
 
@@ -27,9 +27,7 @@
27
27
  require 'adwords_api'
28
28
  require 'adwords_api/utils'
29
29
 
30
- API_VERSION = :v201109
31
-
32
- def get_client_customer_id()
30
+ def get_client_customer_id(client_email)
33
31
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
34
32
  # when called without parameters.
35
33
  adwords = AdwordsApi::Api.new
@@ -40,11 +38,7 @@ def get_client_customer_id()
40
38
 
41
39
  info_srv = adwords.service(:InfoService, API_VERSION)
42
40
 
43
- # Email address to find ID for.
44
- client_email = 'INSERT_EMAIL_ADDRESS_HERE'
45
-
46
41
  today = Time.new.strftime('%Y%m%d')
47
-
48
42
  selector = {
49
43
  :client_emails => [client_email],
50
44
  :api_usage_type => 'UNIT_COUNT_FOR_CLIENTS',
@@ -66,8 +60,12 @@ def get_client_customer_id()
66
60
  end
67
61
 
68
62
  if __FILE__ == $0
63
+ API_VERSION = :v201109
64
+
69
65
  begin
70
- get_client_customer_id()
66
+ # Email address to find ID for.
67
+ client_email = 'INSERT_EMAIL_ADDRESS_HERE'
68
+ get_client_customer_id(client_email)
71
69
 
72
70
  # HTTP errors.
73
71
  rescue AdsCommon::Errors::HttpError => e
@@ -25,9 +25,7 @@
25
25
 
26
26
  require 'adwords_api'
27
27
 
28
- API_VERSION = :v201109
29
-
30
- def get_client_unit_usage()
28
+ def get_client_unit_usage(client_customer_id)
31
29
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
32
30
  # when called without parameters.
33
31
  adwords = AdwordsApi::Api.new
@@ -38,9 +36,6 @@ def get_client_unit_usage()
38
36
 
39
37
  info_srv = adwords.service(:InfoService, API_VERSION)
40
38
 
41
- # Specify client customer ID for the account to get usage for.
42
- client_customer_id = 'INSERT_CLIENT_CUSTOMER_ID_HERE'.to_i
43
-
44
39
  start_date = Time.now.strftime('%Y%m01')
45
40
  end_date = Time.now.strftime('%Y%m%d')
46
41
 
@@ -67,8 +62,12 @@ def get_client_unit_usage()
67
62
  end
68
63
 
69
64
  if __FILE__ == $0
65
+ API_VERSION = :v201109
66
+
70
67
  begin
71
- get_client_unit_usage()
68
+ # Specify client customer ID for the account to get usage for.
69
+ client_customer_id = 'INSERT_CLIENT_CUSTOMER_ID_HERE'.to_i
70
+ get_client_unit_usage(client_customer_id)
72
71
 
73
72
  # HTTP errors.
74
73
  rescue AdsCommon::Errors::HttpError => e
@@ -0,0 +1,111 @@
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 create ad groups. To get a list of existing
22
+ # campaigns run get_campaigns.rb.
23
+ #
24
+ # Tags: AdGroupService.mutate
25
+
26
+ require 'adwords_api'
27
+
28
+ def add_ad_groups(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
+ ad_group_srv = adwords.service(:AdGroupService, API_VERSION)
38
+
39
+ ad_groups = [
40
+ {:name => "Earth to Mars Cruises #%d" % (Time.new.to_f * 1000).to_i,
41
+ :status => 'ENABLED',
42
+ :campaign_id => campaign_id,
43
+ :bids => {
44
+ # The 'xsi_type' field allows you to specify the xsi:type of the object
45
+ # being created. It's only necessary when you must provide an explicit
46
+ # type that the client library can't infer.
47
+ :xsi_type => 'ManualCPCAdGroupBids',
48
+ :keyword_max_cpc => {
49
+ :amount => {
50
+ :micro_amount => 10000000
51
+ }
52
+ },
53
+ # Optional field.
54
+ :keyword_content_max_cpc => {:amount => {:micro_amount => 2000000}}
55
+ }},
56
+ {:name => "Earth to Pluto Cruises #%d" % (Time.new.to_f * 1000).to_i,
57
+ :status => 'ENABLED',
58
+ :campaign_id => campaign_id,
59
+ :bids => {
60
+ # The 'xsi_type' field allows you to specify the xsi:type of the object
61
+ # being created. It's only necessary when you must provide an explicit
62
+ # type that the client library can't infer.
63
+ :xsi_type => 'ManualCPCAdGroupBids',
64
+ :keyword_max_cpc => {
65
+ :amount => {
66
+ :micro_amount => 10000000
67
+ }
68
+ }
69
+ }}
70
+ ]
71
+
72
+ # Prepare operations for adding ad groups.
73
+ operations = ad_groups.map do |ad_group|
74
+ {:operator => 'ADD', :operand => ad_group}
75
+ end
76
+
77
+ # Add ad groups.
78
+ response = ad_group_srv.mutate(operations)
79
+ if response and response[:value]
80
+ response[:value].each do |ad_group|
81
+ puts "Ad group ID %d was successfully added." % ad_group[:id]
82
+ end
83
+ else
84
+ raise StandardError, 'No ad group was added'
85
+ end
86
+ end
87
+
88
+ if __FILE__ == $0
89
+ API_VERSION = :v201109
90
+
91
+ begin
92
+ # Campaign ID to add ad group to.
93
+ campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
94
+ add_ad_groups(campaign_id)
95
+
96
+ # HTTP errors.
97
+ rescue AdsCommon::Errors::HttpError => e
98
+ puts "HTTP Error: %s" % e
99
+
100
+ # API errors.
101
+ rescue AdwordsApi::Errors::ApiException => e
102
+ puts "Message: %s" % e.message
103
+ puts 'Errors:'
104
+ e.errors.each_with_index do |error, index|
105
+ puts "\tError [%d]:" % (index + 1)
106
+ error.each do |field, value|
107
+ puts "\t\t%s: %s" % [field, value]
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,125 @@
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 create campaigns.
22
+ #
23
+ # Tags: CampaignService.mutate
24
+
25
+ require 'adwords_api'
26
+ require 'date'
27
+
28
+ def add_campaigns()
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_srv = adwords.service(:CampaignService, API_VERSION)
38
+
39
+ campaigns = [
40
+ {:name => "Interplanetary Cruise #%d" % (Time.new.to_f * 1000).to_i,
41
+ :status => 'PAUSED',
42
+ :bidding_strategy => {
43
+ # The 'xsi_type' field allows you to specify the xsi:type of the object
44
+ # being created. It's only necessary when you must provide an explicit
45
+ # type that the client library can't infer.
46
+ :xsi_type => 'ManualCPC'
47
+ },
48
+ :budget => {
49
+ :period => 'DAILY',
50
+ :amount => {:micro_amount => 50000000},
51
+ :delivery_method => 'STANDARD'
52
+ },
53
+ # Set the campaign network options to Search and Search Network.
54
+ :network_setting => {
55
+ :target_google_search => true,
56
+ :target_search_network => true,
57
+ :target_content_network => false,
58
+ :target_content_contextual => false
59
+ },
60
+ # Optional fields:
61
+ :start_date =>
62
+ DateTime.parse((Date.today + 1).to_s).strftime('%Y%m%d'),
63
+ :ad_serving_optimization_status => 'ROTATE',
64
+ :frequency_cap => {
65
+ :impressions => '5',
66
+ :time_unit => 'DAY',
67
+ :level => 'ADGROUP'
68
+ }},
69
+ {:name => "Interplanetary Cruise banner #%d" % (Time.new.to_f * 1000).to_i,
70
+ :status => 'PAUSED',
71
+ :bidding_strategy => {
72
+ :xsi_type => 'ManualCPM'
73
+ },
74
+ :budget => {
75
+ :period => 'DAILY',
76
+ :amount => {:micro_amount => 150000000},
77
+ :delivery_method => 'STANDARD'
78
+ },
79
+ :network_setting => {
80
+ :target_google_search => false,
81
+ :target_search_network => false,
82
+ :target_content_network => true,
83
+ :target_content_contextual => false
84
+ }}
85
+ ]
86
+
87
+ # Prepare for adding campaign.
88
+ operations = campaigns.map do |campaign|
89
+ {:operator => 'ADD', :operand => campaign}
90
+ end
91
+
92
+ # Add campaign.
93
+ response = campaign_srv.mutate(operations)
94
+ if response and response[:value]
95
+ response[:value].each do |campaign|
96
+ puts "Campaign with name '%s' and ID %d was added." %
97
+ [campaign[:name], campaign[:id]]
98
+ end
99
+ else
100
+ raise new StandardError, 'No campaigns were added.'
101
+ end
102
+ end
103
+
104
+ if __FILE__ == $0
105
+ API_VERSION = :v201109
106
+
107
+ begin
108
+ add_campaigns()
109
+
110
+ # HTTP errors.
111
+ rescue AdsCommon::Errors::HttpError => e
112
+ puts "HTTP Error: %s" % e
113
+
114
+ # API errors.
115
+ rescue AdwordsApi::Errors::ApiException => e
116
+ puts "Message: %s" % e.message
117
+ puts 'Errors:'
118
+ e.errors.each_with_index do |error, index|
119
+ puts "\tError [%d]:" % (index + 1)
120
+ error.each do |field, value|
121
+ puts "\t\t%s: %s" % [field, value]
122
+ end
123
+ end
124
+ end
125
+ end
@@ -25,9 +25,7 @@
25
25
 
26
26
  require 'adwords_api'
27
27
 
28
- API_VERSION = :v201109
29
-
30
- def add_keywords()
28
+ def add_keywords(ad_group_id)
31
29
  # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
32
30
  # when called without parameters.
33
31
  adwords = AdwordsApi::Api.new
@@ -39,8 +37,6 @@ def add_keywords()
39
37
  ad_group_criterion_srv =
40
38
  adwords.service(:AdGroupCriterionService, API_VERSION)
41
39
 
42
- ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
43
-
44
40
  # Create keywords.
45
41
  # The 'xsi_type' field allows you to specify the xsi:type of the object
46
42
  # being created. It's only necessary when you must provide an explicit
@@ -51,7 +47,12 @@ def add_keywords()
51
47
  :criterion => {
52
48
  :xsi_type => 'Keyword',
53
49
  :text => 'mars cruise',
54
- :match_type => 'BROAD'}},
50
+ :match_type => 'BROAD'
51
+ },
52
+ # Optional fields:
53
+ :user_status => 'PAUSED',
54
+ :destination_url => 'http://example.com/mars'
55
+ },
55
56
  {:xsi_type => 'BiddableAdGroupCriterion',
56
57
  :ad_group_id => ad_group_id,
57
58
  :criterion => {
@@ -65,25 +66,29 @@ def add_keywords()
65
66
  {:operator => 'ADD', :operand => keyword}
66
67
  end
67
68
 
68
- # Add criteria.
69
+ # Add keywords.
69
70
  response = ad_group_criterion_srv.mutate(operations)
70
71
  if response and response[:value]
71
72
  ad_group_criteria = response[:value]
72
- puts "Added %d criteria to ad group ID %d:" %
73
+ puts "Added %d keywords to ad group ID %d:" %
73
74
  [ad_group_criteria.length, ad_group_id]
74
75
  ad_group_criteria.each do |ad_group_criterion|
75
- puts "\tCriterion ID is %d and type is '%s'" %
76
+ puts "\tKeyword ID is %d and type is '%s'" %
76
77
  [ad_group_criterion[:criterion][:id],
77
78
  ad_group_criterion[:criterion][:type]]
78
79
  end
79
80
  else
80
- puts 'No criteria were added.'
81
+ raise StandardError, 'No keywords were added.'
81
82
  end
82
83
  end
83
84
 
84
85
  if __FILE__ == $0
86
+ API_VERSION = :v201109
87
+
85
88
  begin
86
- add_keywords()
89
+ # Ad group ID to add keywords to.
90
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
91
+ add_keywords(ad_group_id)
87
92
 
88
93
  # HTTP errors.
89
94
  rescue AdsCommon::Errors::HttpError => e