baidu 1.2.10 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +82 -0
- data/Rakefile +1 -0
- data/baidu.gemspec +26 -0
- data/lib/baidu.rb +46 -468
- data/lib/baidu/auth.rb +5 -0
- data/lib/baidu/map.rb +66 -0
- data/lib/baidu/rank.rb +5 -0
- data/lib/baidu/sem.rb +14 -0
- data/lib/baidu/sem/account.rb +31 -0
- data/lib/baidu/sem/adgroup.rb +55 -0
- data/lib/baidu/sem/base.rb +96 -0
- data/lib/baidu/sem/bulk.rb +75 -0
- data/lib/baidu/sem/campaign.rb +96 -0
- data/lib/baidu/sem/creative.rb +33 -0
- data/lib/baidu/sem/enum.rb +70 -0
- data/lib/baidu/sem/keyword.rb +35 -0
- data/lib/baidu/sem/kr.rb +9 -0
- data/lib/baidu/sem/new_creative.rb +32 -0
- data/lib/baidu/sem/report.rb +107 -0
- data/lib/baidu/sem/search.rb +79 -0
- data/lib/baidu/version.rb +3 -0
- data/lib/ext.rb +46 -0
- data/spec/map_spec.rb +77 -0
- data/spec/sem_adgroup_spec.rb +119 -0
- data/spec/sem_api_response_spec.rb +97 -0
- data/spec/sem_bulk_spec.rb +89 -0
- data/spec/sem_campaign_spec.rb +94 -0
- data/spec/sem_creative_spec.rb +79 -0
- data/spec/sem_keyword_spec.rb +48 -0
- data/spec/sem_report_spec.rb +52 -0
- data/spec/sem_search_spec.rb +80 -0
- data/spec/spec_helper.rb +356 -0
- metadata +87 -15
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe Baidu::SEM::KeywordService do
|
3
|
+
subject{Baidu::SEM::KeywordService.new($auth)}
|
4
|
+
let(:keyword_sample){'XJK测试关键词LZJ'}
|
5
|
+
it "#addKeyword #updateKeyword #getKeywordByKeywordId #deleteKeyword " do
|
6
|
+
#addKeyword
|
7
|
+
# puts $adgroup_id
|
8
|
+
keywordType = {:adgroupId => $adgroup_id,:keyword=>keyword_sample,:matchType => 1,:price => 1}
|
9
|
+
response = subject.addKeyword({:keywordTypes => [keywordType]})
|
10
|
+
response.status.should == 0
|
11
|
+
response.desc.should == 'success'
|
12
|
+
response.quota.should == 2
|
13
|
+
response.rquota.should > 0
|
14
|
+
keyword_id = response.body[:keyword_types][:keyword_id]
|
15
|
+
|
16
|
+
#updateKeyword
|
17
|
+
keywordType = {:keywordId=> keyword_id,:price => 2}
|
18
|
+
response = subject.updateKeyword({:keywordTypes=>[keywordType]})
|
19
|
+
response.status.should == 0
|
20
|
+
response.desc.should == 'success'
|
21
|
+
response.quota.should == 2
|
22
|
+
response.rquota.should > 0
|
23
|
+
# ap response.body
|
24
|
+
|
25
|
+
#getKeywordByKeywordId
|
26
|
+
sleep 3
|
27
|
+
response = subject.getKeywordByKeywordId({:keywordIds => [keyword_id]})
|
28
|
+
response.status.should == 0
|
29
|
+
response.desc.should == 'success'
|
30
|
+
response.quota.should == 2
|
31
|
+
response.rquota.should > 0
|
32
|
+
# ap response.body
|
33
|
+
keyword = response.body[:keyword_types]
|
34
|
+
(keyword.is_a?Hash).should == true
|
35
|
+
keyword[:keyword_id].should == keyword_id
|
36
|
+
keyword[:adgroup_id].should == $adgroup_id
|
37
|
+
keyword[:keyword].should == keyword_sample
|
38
|
+
keyword[:price].should == "2.0"
|
39
|
+
|
40
|
+
#deleteKeyword
|
41
|
+
response = subject.deleteKeyword({:keywordIds => [keyword_id]})
|
42
|
+
response.status.should == 0
|
43
|
+
response.desc.should == 'success'
|
44
|
+
response.quota.should == 2
|
45
|
+
response.rquota.should > 0
|
46
|
+
response.body[:result].should == '1'
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe Baidu::SEM::ReportService do
|
3
|
+
subject{Baidu::SEM::ReportService.new($auth)}
|
4
|
+
before :each do
|
5
|
+
@options = {}
|
6
|
+
@options[:performanceData] = [Baidu::SEM::PerformanceData::IMPRESSION, Baidu::SEM::PerformanceData::CLICK, Baidu::SEM::PerformanceData::CPC]
|
7
|
+
@options[:startDate] = (Time.now - 24*3600).utc.iso8601
|
8
|
+
@options[:endDate] = Time.now.utc.iso8601
|
9
|
+
@options[:statIds] = $campaign_ids
|
10
|
+
@options[:levelOfDetails] = Baidu::SEM::LevelOfDetails::CAMPAIGN
|
11
|
+
@options[:reportType] = Baidu::SEM::ReportType::CAMPAIGN
|
12
|
+
end
|
13
|
+
|
14
|
+
# describe "ReportService#getProfessionalReportId" do
|
15
|
+
# @report_id = nil
|
16
|
+
it "返回的id必须是32位数字和小写字母组合" do
|
17
|
+
pending('need to rewrite')
|
18
|
+
response = subject.getProfessionalReportId({:reportRequestType => @options}).body
|
19
|
+
expect{ApiResponse.verify(response)}.not_to raise_error
|
20
|
+
# report_id.class.should == String
|
21
|
+
# report_id.should =~ /^[a-z0-9]{32}$/
|
22
|
+
end
|
23
|
+
|
24
|
+
it "处理未过期有效id(1小时内产生的)应返回ReportState中的枚举值" do
|
25
|
+
pending('need to rewrite')
|
26
|
+
response = subject.getProfessionalReportId({:reportRequestType => @options}).body
|
27
|
+
report_id = response[:report_id]
|
28
|
+
response = subject.getReportState({:reportId=>report_id}).body
|
29
|
+
expect{ApiResponse.verify(response)}.not_to raise_error
|
30
|
+
# report_state = response[:report_state]
|
31
|
+
# [Baidu::SEM::ReportState::PENDING,ReportState::DOING,ReportState::DONE].should include report_state
|
32
|
+
end
|
33
|
+
|
34
|
+
it "处理过期/无效id,应返回false" do
|
35
|
+
expect{subject.getReportState({:reportId=>'7da8438bc705c9e6e747959fafce91f2'}).body}.to raise_error
|
36
|
+
expect{subject.getReportState({:reportId=>'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'}).body}.to raise_error
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# describe "ReportService#getReportState" do
|
42
|
+
#
|
43
|
+
|
44
|
+
# end
|
45
|
+
# describe "" do
|
46
|
+
# end
|
47
|
+
# describe "ReportService#getRealTimeQueryData" do
|
48
|
+
# end
|
49
|
+
# describe "ReportService#getRealTimePairData" do
|
50
|
+
# end
|
51
|
+
# describe "ReportService#getRealTimeData" do
|
52
|
+
# end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe Baidu::SEM::SearchService do
|
3
|
+
subject{Baidu::SEM::SearchService.new($auth)}
|
4
|
+
describe '#getKeywordBySearch' do
|
5
|
+
it "cannot get any results when search for something that does't exists" do
|
6
|
+
respsonse = subject.getKeywordBySearch({:searchWord=>'things_that_not_exist!@$@%',:searchType=>0})
|
7
|
+
respsonse.status.should == 0
|
8
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
9
|
+
#@TODO
|
10
|
+
# ap respsonse
|
11
|
+
# res.more.should == 0
|
12
|
+
# res.results.should == nil
|
13
|
+
|
14
|
+
respsonse = subject.getKeywordBySearch({:searchWord=>'things_that_not_exist!@$@%',:searchType=>1})
|
15
|
+
#@TODO
|
16
|
+
# res.more.should == 0
|
17
|
+
# res.results.should == nil
|
18
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
19
|
+
# ap respsonse
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should get some results when search for #{$searchWord}" do
|
23
|
+
respsonse = subject.getKeywordBySearch({:searchWord=>$searchWord,:searchType=>0})
|
24
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
25
|
+
|
26
|
+
# [0,1].should include res.more
|
27
|
+
# res.results.class.should == Array
|
28
|
+
# res.results.first.class.should == Hash
|
29
|
+
# res.results.first.keys.sort.should == [:keyword_id, :keyword, :adgroup_id,:adgroup_name, :campaign_id, :campaign_name].sort
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#getAdgroupBySearch' do
|
34
|
+
it "cannot get any adgroups when search for something that does't exists" do
|
35
|
+
options = {:adgroupName => 'things_that_not_exist!@#$',:searchType => 0}
|
36
|
+
respsonse = subject.getAdgroupBySearch(options)
|
37
|
+
# ap respsonse.body
|
38
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
39
|
+
# res.more.should == 0
|
40
|
+
|
41
|
+
options = {:adgroupName => 'things_that_not_exist!@#$',:searchType => 1}
|
42
|
+
respsonse = subject.getAdgroupBySearch(options)
|
43
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
44
|
+
|
45
|
+
# res.more.should == 0
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should get some results when search for #{$searchAdgroup}" do
|
49
|
+
options = {:adgroupName => 'brand_e_air$',:searchType => 0}
|
50
|
+
respsonse = subject.getAdgroupBySearch(options)
|
51
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
52
|
+
# [0,1].should include res.more
|
53
|
+
# res.results.class.should == Hash
|
54
|
+
# res.results.keys.sort.should == [:adgroup_id, :adgroup_name, :campaign_id, :campaign_name].sort
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#getCampaignBySearch' do
|
59
|
+
it "cannot get any campaign when search for something that does't exists" do
|
60
|
+
options = {:campaignName => 'things_that_not_exist!@#$',:searchType => 0}
|
61
|
+
respsonse = subject.getCampaignBySearch(options)
|
62
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
63
|
+
# res.more.should == 0
|
64
|
+
|
65
|
+
options = {:campaignName => 'things_that_not_exist!@#$',:searchType => 1}
|
66
|
+
respsonse = subject.getCampaignBySearch(options)
|
67
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
68
|
+
# res.more.should == 0
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should get some results when search for #{$searchCampaign}" do
|
72
|
+
options = {:campaignName => $searchCampaignName,:searchType => 0}
|
73
|
+
respsonse = subject.getCampaignBySearch(options)
|
74
|
+
expect{ApiResponse.verify(respsonse.body)}.not_to raise_error
|
75
|
+
# [0,1].should include res.more
|
76
|
+
# res.results.class.should == Hash
|
77
|
+
# res.results.keys.sort.should == [:campaign_id, :campaign_name].sort
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,356 @@
|
|
1
|
+
require 'baidu'
|
2
|
+
require 'time'
|
3
|
+
#请根据自己实际情况填写
|
4
|
+
BAIDU_MAP_KEY = '' #百度地图TOKEN
|
5
|
+
$searchWord = '' #根据Word查已投放关键词
|
6
|
+
$searchAdgroupName = '' #根据Adgroup查已投放的单元
|
7
|
+
$searchCampaignName = '' #根据Campaign查已投放的计划
|
8
|
+
$username = '' #账户 id=13
|
9
|
+
$password = '' #密码
|
10
|
+
$token = '' #token
|
11
|
+
$auth = Baidu::Auth.new
|
12
|
+
$auth.username = $username
|
13
|
+
$auth.password = $password
|
14
|
+
$auth.token = $token
|
15
|
+
$startDate = (Time.now - 24*3600).utc.iso8601
|
16
|
+
$endDate = Time.now.utc.iso8601
|
17
|
+
$pcDestinationUrl = 'http://www.elong.com/'
|
18
|
+
$mobileDestinationUrl = 'http://www.elong.com/'
|
19
|
+
|
20
|
+
|
21
|
+
cs = Baidu::SEM::CampaignService.new($auth)
|
22
|
+
campaigns = cs.getAllCampaign
|
23
|
+
campaign = campaigns.body[:campaign_types].first
|
24
|
+
$campaign_id = campaign[:campaign_id]
|
25
|
+
$campaign_name = campaign[:campaign_name]
|
26
|
+
|
27
|
+
ac = Baidu::SEM::AdgroupService.new($auth)
|
28
|
+
adgroups = ac.getAdgroupIdByCampaignId({:campaignIds=>[$campaign_id]})
|
29
|
+
$adgroup_id = adgroups.body[:campaign_adgroup_ids][:adgroup_ids].first
|
30
|
+
|
31
|
+
class ApiResponse
|
32
|
+
class << self
|
33
|
+
def verify(hash)
|
34
|
+
hash.each do |k,v|
|
35
|
+
k = k.to_s
|
36
|
+
next if k.start_with?'@xmlns'
|
37
|
+
send(k,v)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
def changed_creative_ids(changed_creative_ids)
|
41
|
+
end
|
42
|
+
def creative_types(creative_types)
|
43
|
+
end
|
44
|
+
def result(result)
|
45
|
+
end
|
46
|
+
|
47
|
+
def campaign_types(campaign_types)
|
48
|
+
end
|
49
|
+
def money(money)
|
50
|
+
raise "money:#{money}" unless money =~ /\d+\.\d{2}/
|
51
|
+
end
|
52
|
+
alias :balance :money
|
53
|
+
alias :cost :money
|
54
|
+
alias :payment :money
|
55
|
+
|
56
|
+
def budget(budget)
|
57
|
+
end
|
58
|
+
|
59
|
+
alias :budget_type :budget
|
60
|
+
|
61
|
+
def region_target(region_target)
|
62
|
+
end
|
63
|
+
|
64
|
+
def open_domains(open_domains)
|
65
|
+
end
|
66
|
+
|
67
|
+
def reg_domain(reg_domain)
|
68
|
+
end
|
69
|
+
|
70
|
+
def account_info_type(account_info_type)
|
71
|
+
raise "account_info_type:#{account_info_type}" if %w(userid balance cost payment budget_type budget region_target open_domains reg_domain).any?{|key|!account_info_type.has_key?key.to_sym}
|
72
|
+
verify(account_info_type)
|
73
|
+
end
|
74
|
+
|
75
|
+
def scale(scale)
|
76
|
+
raise "scale:#{scale}" unless scale.size == 2 and scale.is_a?Array
|
77
|
+
end
|
78
|
+
alias :changed_campaign_scale :scale
|
79
|
+
alias :changed_adgroup_scale :scale
|
80
|
+
alias :changed_keyword_scale :scale
|
81
|
+
alias :changed_creative_scale :scale
|
82
|
+
|
83
|
+
def campaign_infos(campaign_infos)
|
84
|
+
if campaign_infos.is_a?Hash
|
85
|
+
raise "campaign_infos#{campaign_infos}" if %w(campaign_id campaign_name).any?{|key|!campaign_infos.has_key?key.to_sym}
|
86
|
+
verify(campaign_infos)
|
87
|
+
else
|
88
|
+
raise "campaign_infos#{campaign_infos}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def campaign_adgroups(campaign_adgroups)
|
93
|
+
if campaign_adgroups.is_a?Array
|
94
|
+
campaign_adgroups.each do |campaign_adgroup|
|
95
|
+
campaign_adgroup(campaign_adgroup)
|
96
|
+
end
|
97
|
+
elsif campaign_adgroups.is_a?Hash
|
98
|
+
verify(campaign_adgroups)
|
99
|
+
else
|
100
|
+
raise "campaign_adgroups:#{campaign_adgroups}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def campaign_adgroup(campaign_adgroup)
|
105
|
+
raise 'campaign_adgroup' if %w(campaign_id adgroup_types).any?{|key|!campaign_adgroup.has_key?key.to_sym}
|
106
|
+
verify(campaign_adgroup)
|
107
|
+
end
|
108
|
+
|
109
|
+
def exact_negative_words(exact_negative_words)
|
110
|
+
raise "exact_negative_words:#{exact_negative_words}" unless exact_negative_words.is_a?Array or exact_negative_words.is_a?String
|
111
|
+
end
|
112
|
+
|
113
|
+
def negative_words(negative_words)
|
114
|
+
raise "negative_words:#{negative_words}" unless negative_words.is_a?Array or negative_words.is_a?String
|
115
|
+
end
|
116
|
+
|
117
|
+
def adgroup_types(adgroup_types)
|
118
|
+
if adgroup_types.is_a?Array #multiple adgroup_types
|
119
|
+
adgroup_types.each do |adgroup_type|
|
120
|
+
adgroup_type(adgroup_type)
|
121
|
+
end
|
122
|
+
elsif adgroup_types.is_a?Hash #single adgroup_type
|
123
|
+
adgroup_type(adgroup_types)
|
124
|
+
else
|
125
|
+
raise "adgroup_types:#{adgroup_types}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def campaign_adgroup_ids(campaign_adgroup_ids)
|
130
|
+
if campaign_adgroup_ids.is_a?Array
|
131
|
+
campaign_adgroup_ids.each do |campaign_adgroup_id|
|
132
|
+
campaign_adgroup_id(campaign_adgroup_id)
|
133
|
+
end
|
134
|
+
elsif campaign_adgroup_ids.is_a?Hash
|
135
|
+
campaign_adgroup_id(campaign_adgroup_ids)
|
136
|
+
else
|
137
|
+
raise "campaign_adgroup_ids:#{campaign_adgroup_ids}"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def campaign_adgroup_id(campaign_adgroup_id)
|
142
|
+
raise "campaign_adgroup_id:#{campaign_adgroup_id}" if %w(campaign_id adgroup_ids).any?{|key|!campaign_adgroup_id.has_key?key.to_sym}
|
143
|
+
verify(campaign_adgroup_id)
|
144
|
+
end
|
145
|
+
|
146
|
+
def adgroup_type(adgroup_type)
|
147
|
+
raise "adgroup_type:#{adgroup_type}" if %w(adgroup_id campaign_id adgroup_name max_price pause status).any?{|key|!adgroup_type.has_key?key.to_sym}
|
148
|
+
verify(adgroup_type)
|
149
|
+
end
|
150
|
+
|
151
|
+
def adgroup_ids(adgroup_ids)
|
152
|
+
if adgroup_ids.is_a? String
|
153
|
+
adgroup_id(adgroup_ids)
|
154
|
+
elsif adgroup_ids.is_a?Array
|
155
|
+
adgroup_ids.each do |adgroup_id|
|
156
|
+
adgroup_id(adgroup_id)
|
157
|
+
end
|
158
|
+
else
|
159
|
+
raise "adgroup_ids:#{adgroup_ids}"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def adgroup_infos(adgroup_infos)
|
164
|
+
if adgroup_infos.is_a?Array
|
165
|
+
adgroup_infos.each do |adgroup_info|
|
166
|
+
adgroup_info(adgroup_info)
|
167
|
+
end
|
168
|
+
elsif adgroup_infos.is_a?Hash
|
169
|
+
adgroup_info(adgroup_infos)
|
170
|
+
else
|
171
|
+
raise "adgroup_infos:#{adgroup_infos}"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def adgroup_info(adgroup_info)
|
176
|
+
raise "adgroup_info:#{adgroup_info}" if %w(adgroup_id adgroup_name campaign_id campaign_name).any?{|key|!adgroup_info.has_key?key.to_sym}
|
177
|
+
verify(adgroup_info)
|
178
|
+
end
|
179
|
+
|
180
|
+
def keyword_infos(keyword_infos)
|
181
|
+
if keyword_infos.is_a?Array
|
182
|
+
keyword_infos.each do |keyword_info|
|
183
|
+
keyword_info(keyword_info)
|
184
|
+
end
|
185
|
+
elsif keyword_infos.is_a?Hash
|
186
|
+
keyword_info(keyword_info)
|
187
|
+
else
|
188
|
+
raise "keyword_infos:#{keyword_infos}"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def keyword_info(keyword_info)
|
193
|
+
raise "keyword_info:#{keyword_info}" if %w(keyword_id keyword adgroup_id adgroup_name campaign_id campaign_name).any?{|key|!keyword_info.has_key?key.to_sym}
|
194
|
+
verify(keyword_info)
|
195
|
+
end
|
196
|
+
|
197
|
+
def id(id)
|
198
|
+
raise "id:#{id}" unless id =~ /\d+/
|
199
|
+
end
|
200
|
+
alias :campaign_id :id
|
201
|
+
alias :adgroup_id :id
|
202
|
+
alias :keyword_id :id
|
203
|
+
alias :item_id :id
|
204
|
+
alias :userid :id
|
205
|
+
|
206
|
+
def name(name)
|
207
|
+
raise "name:#{name}" unless name =~ /.+/
|
208
|
+
end
|
209
|
+
|
210
|
+
alias :campaign_name :name
|
211
|
+
alias :adgroup_name :name
|
212
|
+
|
213
|
+
|
214
|
+
def keyword(keyword)
|
215
|
+
raise "keyword:#{keyword}" unless keyword =~ /.+/
|
216
|
+
end
|
217
|
+
|
218
|
+
def more(more)
|
219
|
+
raise "more:#{more}" unless more == '1' or more == '0'
|
220
|
+
end
|
221
|
+
|
222
|
+
alias :more_word :more
|
223
|
+
alias :more_campaign :more
|
224
|
+
alias :more_adgroup :more
|
225
|
+
|
226
|
+
def max_price(max_price)
|
227
|
+
raise "max_price:#{max_price}" unless max_price.to_f.to_s == max_price
|
228
|
+
end
|
229
|
+
|
230
|
+
def pause(pause)
|
231
|
+
raise "pause:#{pause}" unless !!pause == pause
|
232
|
+
end
|
233
|
+
|
234
|
+
def status(status)
|
235
|
+
raise "status:#{status}" unless status =~ /\d+/
|
236
|
+
end
|
237
|
+
|
238
|
+
def file_id(file_id)
|
239
|
+
raise "file_id:#{file_id}" unless file_id =~ /[0-9a-z]{32}/
|
240
|
+
end
|
241
|
+
alias :report_id :file_id
|
242
|
+
|
243
|
+
def file_paths(file_paths)
|
244
|
+
if file_paths.is_a?Array
|
245
|
+
file_paths.each do |file_path|
|
246
|
+
file_path(file_path)
|
247
|
+
end
|
248
|
+
else
|
249
|
+
raise "file_paths:#{file_paths}"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def file_path(file_path)
|
254
|
+
raise "file_path:#{file_path}" unless URI.parse(file_path)
|
255
|
+
end
|
256
|
+
|
257
|
+
alias :account_file_path :file_path
|
258
|
+
alias :campaign_file_path :file_path
|
259
|
+
alias :adgroup_file_path :file_path
|
260
|
+
alias :keyword_file_path :file_path
|
261
|
+
alias :creative_file_path :file_path
|
262
|
+
|
263
|
+
def file_md5(file_md5)
|
264
|
+
raise "file_md5:#{file_md5}" unless file_md5 =~ /[0-9a-z]{32}/
|
265
|
+
end
|
266
|
+
alias :account_file_md5 :file_md5
|
267
|
+
alias :campaign_file_md5 :file_md5
|
268
|
+
alias :adgroup_file_md5 :file_md5
|
269
|
+
alias :keyword_file_md5 :file_md5
|
270
|
+
alias :creative_file_md5 :file_md5
|
271
|
+
|
272
|
+
def is_generated(is_generated)
|
273
|
+
raise "is_generated:#{is_generated}" unless is_generated =~ /\d+/
|
274
|
+
end
|
275
|
+
|
276
|
+
def end_time(end_time)
|
277
|
+
end_time.is_a?DateTime
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
def changed_campaign_ids(changed_campaign_ids)
|
282
|
+
if changed_campaign_ids.is_a?Array
|
283
|
+
changed_campaign_ids.each do |changed_campaign_id|
|
284
|
+
changed_campaign_id(changed_campaign_id)
|
285
|
+
end
|
286
|
+
elsif changed_campaign_ids.is_a?Hash
|
287
|
+
changed_campaign_id(changed_campaign_ids)
|
288
|
+
else
|
289
|
+
raise "changed_campaign_ids:#{changed_campaign_ids}"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
def changed_campaign_id(changed_campaign_id)
|
294
|
+
raise "changed_campaign_id:#{changed_campaign_id}" unless changed_campaign_id.has_key?(:campaign_id) and changed_campaign_id.has_key?(:operator)
|
295
|
+
verify(changed_campaign_id)
|
296
|
+
end
|
297
|
+
|
298
|
+
def changed_adgroup_ids(changed_adgroup_ids)
|
299
|
+
if changed_adgroup_ids.is_a?Array
|
300
|
+
changed_adgroup_ids.each do |changed_adgroup_id|
|
301
|
+
changed_adgroup_id(changed_adgroup_id)
|
302
|
+
end
|
303
|
+
elsif changed_adgroup_ids.is_a?Hash
|
304
|
+
changed_adgroup_id(changed_adgroup_ids)
|
305
|
+
else
|
306
|
+
raise "changed_adgroup_ids:#{changed_adgroup_ids}"
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def changed_adgroup_id(changed_adgroup_id)
|
311
|
+
raise "changed_adgroup_id:#{changed_adgroup_id}" unless changed_adgroup_id.has_key?(:adgroup_id) and changed_adgroup_id.has_key?(:operator)
|
312
|
+
verify(changed_adgroup_id)
|
313
|
+
end
|
314
|
+
|
315
|
+
def changed_keyword_ids(changed_keyword_ids)
|
316
|
+
if changed_keyword_ids.is_a?Array
|
317
|
+
changed_keyword_ids.each do |changed_keyword_id|
|
318
|
+
changed_keyword_id(changed_keyword_id)
|
319
|
+
end
|
320
|
+
elsif changed_keyword_ids.is_a?Hash
|
321
|
+
# p changed_keyword_ids
|
322
|
+
changed_keyword_id(changed_keyword_ids)
|
323
|
+
else
|
324
|
+
raise "changed_keyword_ids:#{changed_keyword_ids}"
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
def changed_keyword_id(changed_keyword_id)
|
329
|
+
raise "changed_keyword_id:#{changed_keyword_id}" if [:operator, :item_id, :campaign_id, :adgroup_id].any?{|key|!changed_keyword_id.has_key?key}
|
330
|
+
verify(changed_keyword_id)
|
331
|
+
end
|
332
|
+
|
333
|
+
def operator(operator)
|
334
|
+
raise "operator:#{operator}" unless operator =~ /\d+/
|
335
|
+
end
|
336
|
+
|
337
|
+
def response(response)
|
338
|
+
raise "response:#{response}" unless response == 'placeholder'
|
339
|
+
end
|
340
|
+
end
|
341
|
+
# def account_file_md5(file_md5)
|
342
|
+
# file_md5(file_md5)
|
343
|
+
# end
|
344
|
+
# def campaign_file_md5(file_md5)
|
345
|
+
# file_md5(file_md5)
|
346
|
+
# end
|
347
|
+
# def adgroup_file_md5(file_md5)
|
348
|
+
# file_md5(file_md5)
|
349
|
+
# end
|
350
|
+
# def keyword_file_md5(file_md5)
|
351
|
+
# file_md5(file_md5)
|
352
|
+
# end
|
353
|
+
# def creative_file_md5(file_md5)
|
354
|
+
# file_md5(file_md5)
|
355
|
+
# end
|
356
|
+
end
|