adapi 0.0.8 → 0.0.9
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.
- data/.gitignore +1 -1
- data/README.markdown +2 -1
- data/adapi.gemspec +11 -11
- data/examples/add_ad_group.rb +0 -0
- data/examples/add_bare_ad_group.rb +3 -1
- data/examples/add_bare_campaign.rb +6 -4
- data/examples/add_campaign.rb +10 -3
- data/examples/add_campaign_criteria.rb +5 -5
- data/examples/add_invalid_ad_group.rb +4 -6
- data/examples/add_invalid_keywords.rb +40 -0
- data/examples/add_invalid_text_ad.rb +6 -6
- data/examples/add_keywords.rb +0 -0
- data/examples/add_negative_campaign_criteria.rb +0 -0
- data/examples/add_text_ad.rb +5 -9
- data/examples/custom_settings.yml +8 -0
- data/examples/customize_configuration.rb +0 -0
- data/examples/delete_ad_group.rb +11 -0
- data/examples/delete_keyword.rb +0 -0
- data/examples/delete_text_ad.rb +13 -0
- data/examples/find_ad_group.rb +10 -0
- data/examples/find_all_campaigns.rb +0 -0
- data/examples/find_bare_campaign.rb +34 -0
- data/examples/find_campaign.rb +0 -0
- data/examples/find_campaign_ad_groups.rb +0 -0
- data/examples/find_campaign_criteria.rb +0 -0
- data/examples/find_locations.rb +0 -0
- data/examples/log_to_specific_account.rb +0 -0
- data/examples/rollback_campaign.rb +0 -0
- data/examples/test_diacritics.rb +0 -0
- data/examples/update_ad_group.rb +70 -0
- data/examples/update_campaign.rb +34 -9
- data/examples/update_campaign_ad_groups.rb +137 -0
- data/examples/update_campaign_criteria.rb +33 -0
- data/examples/update_complete_campaign.rb +177 -0
- data/examples/update_text_ad.rb +18 -0
- data/lib/adapi/ad/text_ad.rb +39 -49
- data/lib/adapi/ad.rb +30 -19
- data/lib/adapi/ad_group.rb +110 -30
- data/lib/adapi/api.rb +25 -28
- data/lib/adapi/campaign.rb +216 -70
- data/lib/adapi/campaign_criterion.rb +44 -5
- data/lib/adapi/config.rb +1 -4
- data/lib/adapi/constant_data/language.rb +11 -2
- data/lib/adapi/keyword.rb +60 -1
- data/lib/adapi/version.rb +11 -2
- data/lib/adapi.rb +10 -7
- data/test/{config/adapi.yml.template → fixtures/adapi.yml} +11 -2
- data/test/{config/adwords_api.yml.template → fixtures/adwords_api.yml} +6 -2
- data/test/integration/find_location_test.rb +1 -1
- data/test/unit/ad_group_test.rb +2 -2
- data/test/unit/config_test.rb +8 -27
- data/test/unit/constant_data/language_test.rb +34 -0
- metadata +52 -108
- data/examples/update_campaign_status.rb +0 -15
- data/lib/savon_monkeypatch.rb +0 -43
data/.gitignore
CHANGED
data/README.markdown
CHANGED
data/adapi.gemspec
CHANGED
@@ -18,26 +18,26 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
-
#
|
22
|
-
# AdWords API, and its dependecy, google-ads-common gem.
|
21
|
+
# google-adwords-api gem provides low-level interface to AdWords API
|
23
22
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
23
|
+
# its core dependency, google-ads-common gem, is also required
|
24
|
+
# (before google-adwords-api gem, so the clash of our version
|
25
|
+
# with version required by google-adwords api is less probable)
|
26
|
+
#
|
27
|
+
# versions of both gems are freezed, because both gems change a lot and
|
28
28
|
# automatic updates through '~>' can (and already did) break something
|
29
29
|
#
|
30
|
-
s.add_dependency "google-ads-common", "0.7.
|
31
|
-
s.add_dependency "google-adwords-api", "0.6.
|
30
|
+
s.add_dependency "google-ads-common", "0.7.3"
|
31
|
+
s.add_dependency "google-adwords-api", "0.6.2"
|
32
32
|
|
33
|
-
s.add_dependency "activemodel", "~> 3.
|
34
|
-
s.add_dependency "activesupport", "~> 3.
|
33
|
+
s.add_dependency "activemodel", "~> 3.0"
|
34
|
+
s.add_dependency "activesupport", "~> 3.0"
|
35
35
|
s.add_dependency "rake", "~> 0.9.2"
|
36
36
|
s.add_dependency "curb", "~> 0.8.0"
|
37
37
|
|
38
38
|
s.add_development_dependency "yard", "~> 0.7"
|
39
39
|
s.add_development_dependency "rcov", "~> 0.9"
|
40
|
-
s.add_development_dependency "turn", "0.
|
40
|
+
s.add_development_dependency "turn", "~> 0.9.6"
|
41
41
|
s.add_development_dependency "shoulda"
|
42
42
|
s.add_development_dependency "fakeweb"
|
43
43
|
s.add_development_dependency "factory_girl", "~> 3.3.0"
|
data/examples/add_ad_group.rb
CHANGED
File without changes
|
@@ -8,15 +8,17 @@ require 'adapi'
|
|
8
8
|
$campaign_data = {
|
9
9
|
:name => "Campaign #%d" % (Time.new.to_f * 1000).to_i,
|
10
10
|
:status => 'PAUSED',
|
11
|
-
|
12
|
-
|
11
|
+
:bidding_strategy => {
|
12
|
+
:xsi_type => 'BudgetOptimizer',
|
13
|
+
:bid_ceiling => 20
|
14
|
+
},
|
13
15
|
:budget => 50,
|
14
|
-
|
15
16
|
:network_setting => {
|
16
17
|
:target_google_search => true,
|
17
18
|
:target_search_network => true,
|
18
19
|
:target_content_network => false,
|
19
|
-
:target_content_contextual => false
|
20
|
+
:target_content_contextual => false,
|
21
|
+
:target_partner_search_network => false
|
20
22
|
}
|
21
23
|
}
|
22
24
|
|
data/examples/add_campaign.rb
CHANGED
@@ -20,7 +20,7 @@ campaign_data = {
|
|
20
20
|
},
|
21
21
|
|
22
22
|
# PS: :targets key is obsolete, this should be named :criteria, but it still works
|
23
|
-
:
|
23
|
+
:criteria => {
|
24
24
|
:language => [ :en, :cs ],
|
25
25
|
# TODO test together with city target
|
26
26
|
:geo => { :proximity => { :geo_point => '38.89859,-77.035971', :radius => '10 km' } }
|
@@ -49,5 +49,12 @@ campaign_data = {
|
|
49
49
|
|
50
50
|
$campaign = Adapi::Campaign.create(campaign_data)
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
$campaign = Adapi::Campaign.find($campaign.id)
|
53
|
+
|
54
|
+
p "\nCAMPAIGN #{$campaign.id} DATA:"
|
55
|
+
pp $campaign.attributes
|
56
|
+
|
57
|
+
$campaign_criterion = Adapi::CampaignCriterion.find( :campaign_id => $campaign.id )
|
58
|
+
|
59
|
+
p "\nCAMPAIGN CRITERIA:"
|
60
|
+
pp $campaign_criterion
|
@@ -6,14 +6,14 @@ require 'adapi'
|
|
6
6
|
require_relative 'add_bare_campaign'
|
7
7
|
|
8
8
|
$campaign_criterion = Adapi::CampaignCriterion.new(
|
9
|
-
:campaign_id => $campaign
|
9
|
+
:campaign_id => $campaign.id,
|
10
10
|
:targets => { # obsolete, use :criteria instead
|
11
11
|
:language => %w{ en cs },
|
12
12
|
|
13
13
|
:location => {
|
14
|
-
:id => 21137
|
14
|
+
# :id => 21137
|
15
15
|
# :name => { :city => 'Prague', :region => 'CZ-PR', :country => 'CZ' }
|
16
|
-
|
16
|
+
:proximity => { :geo_point => '50.083333,14.366667', :radius => '50 km' }
|
17
17
|
},
|
18
18
|
|
19
19
|
# add custom platform criteria
|
@@ -23,5 +23,5 @@ $campaign_criterion = Adapi::CampaignCriterion.new(
|
|
23
23
|
|
24
24
|
$campaign_criterion.create
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
$campaign_criterion = Adapi::CampaignCriterion.find( :campaign_id => $campaign.id)
|
27
|
+
pp $campaign_criterion
|
@@ -4,11 +4,8 @@
|
|
4
4
|
|
5
5
|
require 'adapi'
|
6
6
|
|
7
|
-
# create campaign
|
8
7
|
require_relative 'add_bare_campaign'
|
9
8
|
|
10
|
-
# create ad group
|
11
|
-
|
12
9
|
ad_group_data = {
|
13
10
|
:name => "AdGroup #%d" % (Time.new.to_f * 1000).to_i,
|
14
11
|
:status => 'ENABLED',
|
@@ -31,8 +28,9 @@ ad_group_data = {
|
|
31
28
|
$ad_group = Adapi::AdGroup.create(ad_group_data)
|
32
29
|
|
33
30
|
if $ad_group.errors.empty?
|
34
|
-
|
31
|
+
puts "OK"
|
32
|
+
pp $ad_group.attributes
|
35
33
|
else
|
36
|
-
|
37
|
-
|
34
|
+
puts "ERROR:"
|
35
|
+
puts $ad_group.errors.full_messages.join("\n")
|
38
36
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'adapi'
|
4
|
+
|
5
|
+
# Errors will appear only in production, not in sandbox
|
6
|
+
#
|
7
|
+
#Adapi::Config.load_settings
|
8
|
+
#Adapi::Config.set(:production_settings)
|
9
|
+
#
|
10
|
+
#pp "Running in #{Adapi::Config.read[:service][:environment]}"
|
11
|
+
|
12
|
+
# create ad group
|
13
|
+
require_relative 'add_bare_ad_group'
|
14
|
+
|
15
|
+
$keywords = Adapi::Keyword.new(
|
16
|
+
:ad_group_id => $ad_group[:id],
|
17
|
+
:keywords => [ 'lékárna', 'lekarna', 'leky' ]
|
18
|
+
)
|
19
|
+
|
20
|
+
$result = $keywords.create
|
21
|
+
|
22
|
+
if $keywords.errors.empty?
|
23
|
+
puts "OK"
|
24
|
+
|
25
|
+
# get array of keywords from Keyword instance
|
26
|
+
$google_keywords = Adapi::Keyword.find(:all, :ad_group_id => $ad_group[:id]).keywords
|
27
|
+
|
28
|
+
$params_keywords = Adapi::Keyword.parameterized($google_keywords)
|
29
|
+
|
30
|
+
$short_keywords = Adapi::Keyword.shortened($google_keywords)
|
31
|
+
|
32
|
+
puts "PARAMS:"
|
33
|
+
pp $params_keywords
|
34
|
+
|
35
|
+
puts "\nSHORT:"
|
36
|
+
pp $short_keywords
|
37
|
+
else
|
38
|
+
puts "ERROR"
|
39
|
+
puts $keywords.errors.full_messages.join("\n")
|
40
|
+
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
|
2
2
|
require 'adapi'
|
3
3
|
|
4
|
-
# PolicyViolations will
|
4
|
+
# PolicyViolations will appear only in production, not in sandbox
|
5
5
|
#
|
6
6
|
#Adapi::Config.load_settings
|
7
7
|
#Adapi::Config.set(:production_settings)
|
8
8
|
#
|
9
9
|
#pp "Running in #{Adapi::Config.read[:service][:environment]}"
|
10
10
|
|
11
|
-
# create ad group
|
12
11
|
require_relative 'add_bare_ad_group'
|
13
12
|
|
14
13
|
$ad = Adapi::Ad::TextAd.create(
|
@@ -22,9 +21,10 @@ $ad = Adapi::Ad::TextAd.create(
|
|
22
21
|
)
|
23
22
|
|
24
23
|
if $ad.errors.empty?
|
25
|
-
|
26
|
-
|
24
|
+
puts "OK"
|
25
|
+
$fresh_ad = Adapi::Ad::TextAd.find(:first, :id => $ad.id, :ad_group_id => $ad_group[:id])
|
26
|
+
pp $fresh_ad.attributes
|
27
27
|
else
|
28
|
-
|
29
|
-
|
28
|
+
puts "ERROR"
|
29
|
+
puts $ad.errors.full_messages.join("\n")
|
30
30
|
end
|
data/examples/add_keywords.rb
CHANGED
File without changes
|
File without changes
|
data/examples/add_text_ad.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
|
2
2
|
require 'adapi'
|
3
3
|
|
4
|
-
# create ad group
|
5
4
|
require_relative 'add_bare_ad_group'
|
6
5
|
|
7
|
-
ad = Adapi::Ad::TextAd.create(
|
6
|
+
$ad = Adapi::Ad::TextAd.create(
|
8
7
|
:ad_group_id => $ad_group[:id],
|
9
8
|
:headline => "Code like Neo",
|
10
9
|
:description1 => 'Need mad coding skills?',
|
@@ -14,10 +13,7 @@ ad = Adapi::Ad::TextAd.create(
|
|
14
13
|
:status => 'PAUSED'
|
15
14
|
)
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
p "ERROR"
|
22
|
-
p ad.errors.messages
|
23
|
-
end
|
16
|
+
$ad = Adapi::Ad::TextAd.find(:first, :ad_group_id => $ad_group.id, :id => $ad.id )
|
17
|
+
|
18
|
+
puts "\nCREATED (AND RELOADED) AD:"
|
19
|
+
pp $ad.attributes
|
@@ -9,6 +9,10 @@
|
|
9
9
|
:user_agent: My Adwords API Client
|
10
10
|
:service:
|
11
11
|
:environment: PRODUCTION
|
12
|
+
:library:
|
13
|
+
:log_level: WARN
|
14
|
+
:log_path: /tmp/adapi_production.log
|
15
|
+
# :log_pretty_format is set to :false by default
|
12
16
|
|
13
17
|
:sandbox:
|
14
18
|
:authentication:
|
@@ -20,3 +24,7 @@
|
|
20
24
|
:user_agent: Adwords API Test
|
21
25
|
:service:
|
22
26
|
:environment: SANDBOX
|
27
|
+
:library:
|
28
|
+
:log_level: DEBUG
|
29
|
+
:log_path: /tmp/adapi_sandbox.log
|
30
|
+
:log_pretty_format: true
|
File without changes
|
data/examples/delete_keyword.rb
CHANGED
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
require 'adapi'
|
3
|
+
|
4
|
+
# create ad group
|
5
|
+
require_relative 'add_text_ad'
|
6
|
+
|
7
|
+
$ad_id = $ad.id
|
8
|
+
|
9
|
+
puts "\nDELETED AD #{$ad_id}: " + ($ad.destroy ? "true" : "false")
|
10
|
+
|
11
|
+
$ad = Adapi::Ad::TextAd.find(:first, :ad_group_id => $ad_group.id, :id => $ad_id )
|
12
|
+
|
13
|
+
puts "TRYING TO FIND IT: " + ($ad.present? ? $ad.attributes : "nil")
|
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'adapi'
|
4
|
+
|
5
|
+
# create campaign
|
6
|
+
require_relative 'add_bare_campaign'
|
7
|
+
|
8
|
+
$campaign = Adapi::Campaign.find($campaign.id)
|
9
|
+
|
10
|
+
puts "Campaign data:"
|
11
|
+
%w{ id name status serving_status ad_serving_optimization_status start_date end_date }.each do |param_name|
|
12
|
+
puts " %s: %s" % [ param_name.to_s.humanize, $campaign[param_name] ]
|
13
|
+
end
|
14
|
+
|
15
|
+
puts "\nBudget:"
|
16
|
+
%w{ amount period delivery_method }.each do |param_name|
|
17
|
+
puts " %s: %s" % [ param_name.to_s.humanize, $campaign[:budget][param_name.to_sym] ]
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "\nBidding strategy:"
|
21
|
+
%w{ xsi_type bid_ceiling enhanced_cpc_enabled }.each do |param_name|
|
22
|
+
next unless $campaign[:bidding_strategy].has_key?(param_name.to_sym)
|
23
|
+
puts " %s: %s" % [ param_name.to_s.humanize, $campaign[:bidding_strategy][param_name.to_sym] ]
|
24
|
+
end
|
25
|
+
|
26
|
+
puts "\nCampaign stats:"
|
27
|
+
%w{ clicks impressions cost ctr }.each do |param_name|
|
28
|
+
puts " %s: %s" % [ param_name.to_s.humanize, $campaign[:campaign_stats][param_name.to_sym] ]
|
29
|
+
end
|
30
|
+
|
31
|
+
puts "\nNetwork setting:"
|
32
|
+
Adapi::Campaign::NETWORK_SETTING_KEYS.each do |param_name|
|
33
|
+
puts " %s: %s" % [ param_name.to_s.humanize, $campaign[:network_setting][param_name.to_sym] ]
|
34
|
+
end
|
data/examples/find_campaign.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
data/examples/find_locations.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
data/examples/test_diacritics.rb
CHANGED
File without changes
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'adapi'
|
4
|
+
|
5
|
+
# create campaign
|
6
|
+
require_relative 'add_bare_campaign'
|
7
|
+
|
8
|
+
$campaign_id = $campaign.id
|
9
|
+
|
10
|
+
$ad_group = Adapi::AdGroup.create(
|
11
|
+
:campaign_id => $campaign_id,
|
12
|
+
:name => "AdGroup #%d" % (Time.new.to_f * 1000).to_i,
|
13
|
+
:status => 'PAUSED',
|
14
|
+
|
15
|
+
:keywords => [ 'dem codez', 'trinity', 'morpheus', '"top coder"', "[-code]" ],
|
16
|
+
|
17
|
+
:ads => [
|
18
|
+
{
|
19
|
+
:headline => "Code like Trinity",
|
20
|
+
:description1 => 'The power of awesomeness?',
|
21
|
+
:description2 => 'Check out my new blog!',
|
22
|
+
:url => 'http://www.demcodez.com',
|
23
|
+
:display_url => 'http://www.demcodez.com'
|
24
|
+
},
|
25
|
+
|
26
|
+
{
|
27
|
+
:headline => "Code like Morpheus",
|
28
|
+
:description1 => 'Unleash the power of Matrix',
|
29
|
+
:description2 => 'Check out my new blog',
|
30
|
+
:url => 'http://www.demcodez.com',
|
31
|
+
:display_url => 'http://www.demcodez.com'
|
32
|
+
}
|
33
|
+
]
|
34
|
+
)
|
35
|
+
|
36
|
+
$ad_group_id = $ad_group.id
|
37
|
+
|
38
|
+
# fetch ids of ad_group and ads
|
39
|
+
$ad_group = Adapi::AdGroup.find(:first, :id => $ad_group_id, :campaign_id => $campaign_id)
|
40
|
+
|
41
|
+
p "CREATED ad_group #{$ad_group.id} for campaign #{$ad_group.campaign_id}"
|
42
|
+
pp $ad_group.attributes
|
43
|
+
|
44
|
+
result = $ad_group.update(
|
45
|
+
:name => "UPDATED #{$ad_group.name}",
|
46
|
+
:status => 'ENABLED',
|
47
|
+
|
48
|
+
:keywords => ['dem updatez', '"neo coder"', '[-trinity]', '[-morpheus]' ],
|
49
|
+
|
50
|
+
:ads => [
|
51
|
+
{
|
52
|
+
:headline => "Code like Neo",
|
53
|
+
:description1 => 'Need mad coding skills?',
|
54
|
+
:description2 => 'Check out my new blog!',
|
55
|
+
:url => 'http://www.demcodez.com',
|
56
|
+
:display_url => 'http://www.demcodez.com'
|
57
|
+
}
|
58
|
+
]
|
59
|
+
)
|
60
|
+
|
61
|
+
unless result
|
62
|
+
puts "ERRORS:"
|
63
|
+
puts $ad_group.errors.full_messages.join("\n")
|
64
|
+
else
|
65
|
+
# fetch ids of ad_group and ads
|
66
|
+
$ad_group = Adapi::AdGroup.find(:first, :id => $ad_group_id, :campaign_id => $campaign_id)
|
67
|
+
|
68
|
+
p "UPDATED ad_group #{$ad_group.id} for campaign #{$ad_group.campaign_id}"
|
69
|
+
pp $ad_group.attributes
|
70
|
+
end
|
data/examples/update_campaign.rb
CHANGED
@@ -1,22 +1,47 @@
|
|
1
1
|
require 'adapi'
|
2
2
|
|
3
|
-
# create campaign
|
4
|
-
require_relative '
|
3
|
+
# create campaign with criteria
|
4
|
+
require_relative 'add_campaign'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
$updated_campaign = Adapi::Campaign.update(
|
10
|
-
:id => $campaign[:id],
|
6
|
+
$campaign = Adapi::Campaign.update(
|
7
|
+
:id => $campaign.id,
|
11
8
|
:status => 'ACTIVE',
|
12
9
|
:name => "UPDATED_#{$campaign[:name]}",
|
10
|
+
:bidding_strategy => 'ManualCPC',
|
11
|
+
:budget => 75,
|
13
12
|
:network_setting => {
|
14
13
|
:target_google_search => false,
|
15
14
|
:target_search_network => false,
|
16
15
|
:target_content_network => true,
|
17
16
|
:target_content_contextual => true
|
17
|
+
# FIXME returns error which is not trapped:
|
18
|
+
# TargetError.CANNOT_TARGET_PARTNER_SEARCH_NETWORK
|
19
|
+
# :target_partner_search_network => true
|
20
|
+
},
|
21
|
+
|
22
|
+
# deletes all criteria (except :platform) and create these new ones
|
23
|
+
:criteria => {
|
24
|
+
:language => [ :sk ],
|
18
25
|
}
|
19
26
|
)
|
20
27
|
|
21
|
-
|
22
|
-
|
28
|
+
unless $campaign.errors.empty?
|
29
|
+
|
30
|
+
puts "ERROR WHEN UPDATING CAMPAIGN #{$campaign.id}:"
|
31
|
+
pp $campaign.errors.full_messages
|
32
|
+
|
33
|
+
else
|
34
|
+
|
35
|
+
puts "\nUPDATED CAMPAIGN #{$campaign.id}\n"
|
36
|
+
|
37
|
+
$campaign = Adapi::Campaign.find($campaign.id)
|
38
|
+
|
39
|
+
puts "\nCAMPAIGN DATA:"
|
40
|
+
pp $campaign.attributes
|
41
|
+
|
42
|
+
$campaign_criteria = Adapi::CampaignCriterion.find( :campaign_id => $campaign.id )
|
43
|
+
|
44
|
+
puts "\nCRITERIA:"
|
45
|
+
pp $campaign_criteria
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'adapi'
|
4
|
+
|
5
|
+
# create campaign by single command, with campaing targets, with ad_groups
|
6
|
+
# including keywords and ads
|
7
|
+
|
8
|
+
$ad_group_names = [
|
9
|
+
"AdGroup 01 #%d" % (Time.new.to_f * 1000).to_i,
|
10
|
+
"AdGroup 02 #%d" % (Time.new.to_f * 1000).to_i
|
11
|
+
]
|
12
|
+
|
13
|
+
campaign_data = {
|
14
|
+
:name => "Campaign #%d" % (Time.new.to_f * 1000).to_i,
|
15
|
+
:status => 'PAUSED',
|
16
|
+
:bidding_strategy => 'ManualCPC',
|
17
|
+
:budget => 50,
|
18
|
+
|
19
|
+
:ad_groups => [
|
20
|
+
{
|
21
|
+
:name => $ad_group_names[0],
|
22
|
+
:status => 'ENABLED',
|
23
|
+
|
24
|
+
:keywords => [ 'neo', 'dem codez', '"top coder"', "[-code]" ],
|
25
|
+
|
26
|
+
:ads => [
|
27
|
+
{
|
28
|
+
:headline => "Code like Neo",
|
29
|
+
:description1 => 'Need mad coding skills?',
|
30
|
+
:description2 => 'Check out my new blog!',
|
31
|
+
:url => 'http://www.demcodez.com',
|
32
|
+
:display_url => 'http://www.demcodez.com'
|
33
|
+
}
|
34
|
+
]
|
35
|
+
},
|
36
|
+
|
37
|
+
{
|
38
|
+
:name => $ad_group_names[1],
|
39
|
+
:status => 'PAUSED',
|
40
|
+
|
41
|
+
:keywords => [ 'dem codez', 'trinity', 'morpheus', '"top coder"', "[-code]" ],
|
42
|
+
|
43
|
+
:ads => [
|
44
|
+
{
|
45
|
+
:headline => "Code like Trinity",
|
46
|
+
:description1 => 'The power of awesomeness?',
|
47
|
+
:description2 => 'Check out my new blog!',
|
48
|
+
:url => 'http://www.demcodez.com',
|
49
|
+
:display_url => 'http://www.demcodez.com'
|
50
|
+
},
|
51
|
+
|
52
|
+
{
|
53
|
+
:headline => "Code like Morpheus",
|
54
|
+
:description1 => 'Unleash the power of Matrix',
|
55
|
+
:description2 => 'Check out my new blog',
|
56
|
+
:url => 'http://www.demcodez.com',
|
57
|
+
:display_url => 'http://www.demcodez.com'
|
58
|
+
}
|
59
|
+
]
|
60
|
+
}
|
61
|
+
]
|
62
|
+
|
63
|
+
}
|
64
|
+
|
65
|
+
$campaign = Adapi::Campaign.create(campaign_data)
|
66
|
+
p "Created campaign ID #{$campaign.id}"
|
67
|
+
|
68
|
+
# PS: changes in ad_groups:
|
69
|
+
# * delete first ad_group
|
70
|
+
# * change second ad_group
|
71
|
+
# * add new ad_group
|
72
|
+
|
73
|
+
$campaign.update_ad_groups!( [
|
74
|
+
# no match here for $ad_group_names[0], so it's going to be deleted
|
75
|
+
|
76
|
+
# this ad_group will be created
|
77
|
+
{
|
78
|
+
:name => "UPDATED " + $ad_group_names[0],
|
79
|
+
:status => 'ENABLED',
|
80
|
+
|
81
|
+
:keywords => [ 'neo update', 'dem codezzz', '"top coder"' ],
|
82
|
+
|
83
|
+
:ads => [
|
84
|
+
{
|
85
|
+
:headline => "Update like Neo",
|
86
|
+
:description1 => 'Need mad coding skills?',
|
87
|
+
:description2 => 'Check out my new blog!',
|
88
|
+
:url => 'http://www.demcodez.com',
|
89
|
+
:display_url => 'http://www.demcodez.com'
|
90
|
+
}
|
91
|
+
]
|
92
|
+
},
|
93
|
+
|
94
|
+
# this ad_group is going to be updated
|
95
|
+
{
|
96
|
+
:name => $ad_group_names[1],
|
97
|
+
:status => 'ENABLED', # from PAUSED
|
98
|
+
|
99
|
+
:keywords => [ 'dem updatez', 'update trinity', 'update morpheus' ],
|
100
|
+
|
101
|
+
:ads => [
|
102
|
+
{
|
103
|
+
:headline => "Update like Trinity",
|
104
|
+
:description1 => 'The power of updates?',
|
105
|
+
:description2 => 'Check out my new blog!',
|
106
|
+
:url => 'http://www.demcodez.com',
|
107
|
+
:display_url => 'http://www.demcodez.com'
|
108
|
+
},
|
109
|
+
|
110
|
+
{
|
111
|
+
:headline => "Update like Morpheus",
|
112
|
+
:description1 => 'Unleash the power of updates',
|
113
|
+
:description2 => 'Check out my new blog',
|
114
|
+
:url => 'http://www.demcodez.com',
|
115
|
+
:display_url => 'http://www.demcodez.com'
|
116
|
+
}
|
117
|
+
]
|
118
|
+
}
|
119
|
+
] )
|
120
|
+
|
121
|
+
unless $campaign.errors.empty?
|
122
|
+
|
123
|
+
puts "ERROR WHEN UPDATING AD GROUPS:"
|
124
|
+
puts $campaign.errors.full_messages.join("\n")
|
125
|
+
|
126
|
+
else
|
127
|
+
# reload ad groups
|
128
|
+
$ad_groups = Adapi::AdGroup.find(:all, :campaign_id => $campaign[:id])
|
129
|
+
|
130
|
+
puts "\nAD GROUPS UPDATED\n"
|
131
|
+
|
132
|
+
puts "\nAD GROUPS (#{$ad_groups.size}):"
|
133
|
+
$ad_groups.each_with_index do |ad_group, i|
|
134
|
+
puts "\nAD GROUP #{i + 1}:\n"
|
135
|
+
pp ad_group.attributes
|
136
|
+
end
|
137
|
+
end
|