ppc 1.3.2 → 2.0.0

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -339
  3. data/README.md +46 -28
  4. data/Rakefile +1 -0
  5. data/lib/ppc.rb +1 -1
  6. data/lib/ppc/api.rb +18 -14
  7. data/lib/ppc/api/baidu.rb +5 -14
  8. data/lib/ppc/api/baidu/account.rb +28 -23
  9. data/lib/ppc/api/baidu/bulk.rb +1 -1
  10. data/lib/ppc/api/baidu/creative.rb +47 -86
  11. data/lib/ppc/api/baidu/group.rb +43 -74
  12. data/lib/ppc/api/baidu/keyword.rb +73 -166
  13. data/lib/ppc/api/baidu/phone_new_creative.rb +8 -7
  14. data/lib/ppc/api/baidu/plan.rb +51 -34
  15. data/lib/ppc/api/baidu/report.rb +9 -29
  16. data/lib/ppc/api/qihu.rb +7 -111
  17. data/lib/ppc/api/qihu/account.rb +31 -25
  18. data/lib/ppc/api/qihu/bulk.rb +1 -2
  19. data/lib/ppc/api/qihu/creative.rb +57 -74
  20. data/lib/ppc/api/qihu/group.rb +40 -63
  21. data/lib/ppc/api/qihu/keyword.rb +58 -74
  22. data/lib/ppc/api/qihu/plan.rb +52 -32
  23. data/lib/ppc/api/qihu/rank.rb +11 -10
  24. data/lib/ppc/api/qihu/report.rb +41 -94
  25. data/lib/ppc/api/qihu/sublink.rb +44 -41
  26. data/lib/ppc/api/sm.rb +3 -12
  27. data/lib/ppc/api/sm/account.rb +20 -19
  28. data/lib/ppc/api/sm/creative.rb +36 -50
  29. data/lib/ppc/api/sm/group.rb +40 -61
  30. data/lib/ppc/api/sm/keyword.rb +44 -102
  31. data/lib/ppc/api/sm/phone_new_creative.rb +9 -8
  32. data/lib/ppc/api/sm/plan.rb +36 -26
  33. data/lib/ppc/api/sm/report.rb +5 -24
  34. data/lib/ppc/api/sogou.rb +5 -55
  35. data/lib/ppc/api/sogou/account.rb +17 -17
  36. data/lib/ppc/api/sogou/creative.rb +52 -75
  37. data/lib/ppc/api/sogou/group.rb +44 -91
  38. data/lib/ppc/api/sogou/keyword.rb +60 -143
  39. data/lib/ppc/api/sogou/plan.rb +37 -23
  40. data/lib/ppc/api/sogou/report.rb +2 -19
  41. data/lib/ppc/ext.rb +0 -8
  42. data/lib/ppc/operation.rb +60 -83
  43. data/lib/ppc/operation/account.rb +13 -19
  44. data/lib/ppc/operation/creative.rb +0 -20
  45. data/lib/ppc/operation/group.rb +18 -27
  46. data/lib/ppc/operation/keyword.rb +0 -27
  47. data/lib/ppc/operation/plan.rb +34 -22
  48. data/lib/ppc/operation/report.rb +4 -4
  49. data/lib/ppc/operation/sublink.rb +8 -0
  50. data/ppc.gemspec +5 -5
  51. metadata +16 -10
  52. data/lib/ppc/api/shenma.rb +0 -64
  53. data/lib/ppc/api/shenma/report.rb +0 -135
@@ -55,28 +55,11 @@ module PPC
55
55
  requesttype[:unitOfTime] = Unit_map[ param[:unit] ] if param[:unit]
56
56
  requesttype[:platform] = Device_map[ param[:device] ] if param[:device]
57
57
  requesttype[:idOnly] = param[:id_only] if param[:id_only]!=nil
58
- requesttype[:startDate] = parse_date( param[:startDate] )
59
- requesttype[:endDate] = parse_date( param[:endDate] )
58
+ requesttype[:startDate] = (Time.parse( param[:startDate] ) rescue Time.now - 86400).utc.iso8601
59
+ requesttype[:endDate] = (Time.parse( param[:endDate] ) rescue Time.now - 86400).utc.iso8601
60
60
  return requesttype
61
61
  end
62
62
 
63
- private
64
- def self.parse_date( date )
65
- """
66
- Cast string to time:
67
- 'YYYYMMDD' => Time
68
- """
69
- if date
70
- y = date[0..3]
71
- m = date[4..5]
72
- d = date[6..7]
73
- date = Time.new( y, m, d )
74
- else
75
- date = (Time.now - 24*3600)
76
- end
77
- date.utc.iso8601
78
- end
79
-
80
63
  ###########################
81
64
  # intreface for Operation #
82
65
  ###########################
@@ -7,11 +7,3 @@ class String
7
7
  downcase
8
8
  end
9
9
  end
10
- class Hash
11
- def filter_and_replace_key(key_new, key_old)
12
- return self if key_new == key_old
13
- value = self.delete(key_old)
14
- self[key_new] = value unless value.nil?
15
- self
16
- end
17
- end
@@ -4,12 +4,9 @@ module PPC
4
4
  attr_accessor :id
5
5
 
6
6
  def initialize( params )
7
-
8
- if params[:se] == nil
9
- raise 'please specific a search engine'
10
- else
11
- @se = params[:se]
12
- end
7
+ raise 'please specific a search engine' if params[:se].nil?
8
+
9
+ @se = params[:se]
13
10
  @id = params[:id]
14
11
  @auth = {
15
12
  username: params[:username],
@@ -20,13 +17,11 @@ module PPC
20
17
  }
21
18
  # add support for qihu360
22
19
  if @se == 'qihu'
23
- raise "you are using qihu service, please enter api_key" if params[:api_key].nil?
24
- @auth[:api_key] = params[:api_key]
25
- end
26
- if @se == 'qihu' && params[:token].nil?
20
+ raise "you are using qihu service, please enter api_key" if params[:api_key].nil?
27
21
  raise "you are using qihu service, please enter api_secret" if params[:api_secret].nil?
28
- @auth[:api_secret] = params[:api_secret]
29
- @auth[:token] = qihu_refresh_token
22
+ @auth[:api_key] = params[:api_key]
23
+ @auth[:api_secret] = params[:api_secret]
24
+ @auth[:token] = qihu_refresh_token if params[:token].nil?
30
25
  end
31
26
  end
32
27
 
@@ -35,7 +30,7 @@ module PPC
35
30
  cipher_aes.encrypt
36
31
  cipher_aes.key = @auth[:api_secret][0,16]
37
32
  cipher_aes.iv = @auth[:api_secret][16,16]
38
- encrypted = (cipher_aes.update(Digest::MD5.hexdigest(@auth[:password])) + cipher_aes.final).unpack('H*').join
33
+ encrypted = (cipher_aes.update(Digest::MD5.hexdigest( @auth[:password])) + cipher_aes.final).unpack('H*').join
39
34
  url = "https://api.e.360.cn/account/clientLogin"
40
35
  response = HTTParty.post(url,
41
36
  :body => {
@@ -59,104 +54,86 @@ module PPC
59
54
  eval "::PPC::API::#{@se.capitalize}::#{service.capitalize}"
60
55
  end
61
56
 
62
- # ++++++++ #
63
- # Lazy Code #
64
- # ++++++++ #
65
-
66
- # helper fucntion
67
- def get_obj( ids, service )
68
- '''
69
- Return service object.
70
- Providing single id, return single object.
71
- Providing multiple ids, return Array of objects
72
- '''
73
- class_obj = eval "::PPC::Opeartion::#{service.capitalize}"
74
- param = @auth
75
- param[:se] = @se
76
- objs = []
77
-
78
- ids.each do |id|
79
- param[:id] = id
80
- objs << class_obj.new( param )
81
- end
82
-
83
- return objs.length == 1 ? objs[0] : objs
57
+ def method_missing(method_name, *args, &block)
58
+ method = method_name.to_s
59
+ unit = self.class.to_s.downcase[/(account|plan|group|keyword|creative|sublink)/]
60
+ case method
61
+ when "info"
62
+ unit == "account" ? call( unit ).send( method, @auth ) : call( unit ).send( method, @auth, [@id].flatten )
63
+ when "get", "delete", "enable", "pause", "status", "quality"
64
+ call( unit ).send( method, @auth, [@id].flatten )
65
+ when "update"
66
+ call( unit ).send( method, @auth, [args[0].merge(id: @id)].flatten )
67
+ when "activate"
68
+ call( unit ).enable( @auth, [@id].flatten )
69
+ else
70
+ super
71
+ end
84
72
  end
85
73
 
86
74
  # +++++ Plan opeartion funcitons +++++ #
87
75
  module Plan_operation
88
- def get_plan( ids )
89
- ::PPC::Opeartion::get_obj( ids, 'plan')
90
- end
91
76
 
92
- def add_plan( plans )
93
- call('plan').add(@auth,plans)
94
- end
95
-
96
- def update_plan( plans )
97
- call('plan').update(@auth,plans)
77
+ def method_missing(method_name, *args, &block)
78
+ if method_name.to_s[/_plan$/]
79
+ call( "plan" ).send(method_name.to_s[/^(get|add|update|delete|enable|pause)/], @auth, [args].flatten )
80
+ else
81
+ super
82
+ end
98
83
  end
99
84
 
100
- def delete_plan( ids )
101
- call('plan').delete(@auth,ids)
102
- end
103
85
  end
104
86
 
105
87
  # +++++ Group opeartion funcitons +++++ #
106
88
  module Group_operation
107
- def get_group( ids )
108
- ::PPC::Opeartion::get_obj( ids, 'group')
109
- end
110
89
 
111
- def add_group( groups )
112
- call('group').add(@auth,groups )
113
- end
114
-
115
- def update_group( groups )
116
- call('group').update( @auth, groups )
90
+ def method_missing(method_name, *args, &block)
91
+ if method_name.to_s[/_group$/]
92
+ call( "group" ).send(method_name.to_s[/^(get|add|update|delete|enable|pause)/], @auth, [args].flatten )
93
+ else
94
+ super
95
+ end
117
96
  end
118
97
 
119
- def delete_group( ids )
120
- call('group').delete( @auth, ids )
121
- end
122
98
  end
123
99
 
124
100
  # +++++ Keyword opeartion funcitons +++++ #
125
101
  module Keyword_operation
126
- def get_keyword( ids )
127
- ::PPC::Opeartion::get_obj( ids, 'keyword')
128
- end
129
-
130
- def add_keyword( keywords )
131
- call('keyword').add( @auth, keywords )
132
- end
133
102
 
134
- def update_keyword( keywords)
135
- call('keyword').update( @auth, keywords )
103
+ def method_missing(method_name, *args, &block)
104
+ if method_name.to_s[/_keyword$/]
105
+ call( "keyword" ).send(method_name.to_s[/^(get|add|update|delete|enable|pause)/], @auth, [args].flatten )
106
+ else
107
+ super
108
+ end
136
109
  end
137
110
 
138
- def delete_keyword( ids )
139
- call('keyword').delete( @auth, ids )
140
- end
141
111
  end
142
112
 
143
113
  # +++++ Creative opeartion funcitons +++++ #
144
114
  module Creative_operation
145
- def get_creative( ids )
146
- ::PPC::Opeartion::get_obj( ids, 'creative')
147
- end
148
-
149
- def add_creative( creatives )
150
- call('creative').add( @auth, creatives )
151
- end
152
115
 
153
- def update_creative( creatives )
154
- call('creative').update( @auth, creatives )
116
+ def method_missing(method_name, *args, &block)
117
+ if method_name.to_s[/_creative$/]
118
+ call( "creative" ).send(method_name.to_s[/^(get|add|update|delete|enable|pause)/], @auth, [args].flatten )
119
+ else
120
+ super
121
+ end
155
122
  end
156
123
 
157
- def delete_creative( ids )
158
- call('creative').delete( @auth, ids )
124
+ end
125
+
126
+ # +++++ Sublink opeartion funcitons +++++ #
127
+ module Sublink_operation
128
+
129
+ def method_missing(method_name, *args, &block)
130
+ if method_name.to_s[/_sublink$/]
131
+ call( "sublink" ).send(method_name.to_s[/^(get|add|update|delete|enable|pause)/], @auth, [args].flatten )
132
+ else
133
+ super
134
+ end
159
135
  end
136
+
160
137
  end
161
138
 
162
139
  end # Opeartion
@@ -172,4 +149,4 @@ require 'ppc/operation/group'
172
149
  require 'ppc/operation/plan'
173
150
  require 'ppc/operation/keyword'
174
151
  require 'ppc/operation/creative'
175
-
152
+ require 'ppc/operation/sublink'
@@ -3,33 +3,24 @@ module PPC
3
3
  class Account
4
4
  include ::PPC::Operation
5
5
 
6
- # self operations
7
- def info
8
- info = call('account').info(@auth)
9
- @id = info[:result][:id] if @id == nil
10
- return info
11
- end
12
-
13
- def update(account)
14
- call('account').update(@auth,account)
15
- end
16
-
17
- # subobject(plan) operations
18
6
  def plans
19
- call('plan').all(@auth)
7
+ call( "plan" ).all( @auth )
20
8
  end
21
9
 
22
10
  def plan_ids
23
- call('plan').ids(@auth)
11
+ call( "plan" ).ids( @auth )
24
12
  end
25
13
 
26
- # some useful keyword operations
27
- def keywords(group_id)
28
- call( 'keyword' ).search_by_group_id( @auth, group_id )
14
+ def keywords( group_id )
15
+ call( "keyword" ).all( @auth, group_id )
29
16
  end
30
17
 
31
- def keyword_ids(group_id)
32
- call( 'keyword' ).search_id_by_group_id( @auth, group_id )
18
+ def keyword_ids( group_id )
19
+ call( "keyword" ).ids( @auth, group_id )
20
+ end
21
+
22
+ def get_rank( region, keyword )
23
+ call( "rank" ).getRank( @auth, region, keyword )
33
24
  end
34
25
 
35
26
  # plan operations
@@ -44,6 +35,9 @@ module PPC
44
35
  # creative opeartions
45
36
  include ::PPC::Operation::Creative_operation
46
37
 
38
+ # sublink opeartion
39
+ include ::PPC::Operation::Sublink_operation
40
+
47
41
  # report operations
48
42
  include ::PPC::Operation::Report
49
43
 
@@ -3,26 +3,6 @@ module PPC
3
3
  class Creative
4
4
  include ::PPC::Operation
5
5
 
6
- def info()
7
- call( 'creative' ).get( @auth, @id )
8
- end
9
-
10
- def update( type )
11
- call( 'creative' ).update( @auth, type.merge( id:@id) )
12
- end
13
-
14
- def activate()
15
- call( 'creative' ).activate( @auth, @id )
16
- end
17
-
18
- def status()
19
- call( 'creative' ).status( @auth, @id )
20
- end
21
-
22
- def delete()
23
- call( 'creative' ).delete( @auth, @id )
24
- end
25
-
26
6
  end
27
7
  end
28
8
  end
@@ -2,31 +2,29 @@ module PPC
2
2
  module Operation
3
3
  class Group
4
4
  include ::PPC::Operation
5
-
6
- def info()
7
- call('group').get(@auth, @id)
5
+
6
+ def keywords
7
+ call( "keyword" ).all( @auth, [@id].flatten )
8
8
  end
9
9
 
10
- def update( info )
11
- info[:id] = @id if (info.is_a? Hash) && info[:id].nil?
12
- call('group').update(@auth, info)
10
+ def keyword_ids
11
+ call( "keyword" ).ids( @auth, [@id].flatten )
13
12
  end
14
13
 
15
- # =============================== #
16
- def keywords()
17
- call( 'keyword' ).search_by_group_id( @auth, @id )
14
+ def creatives
15
+ call( "creative" ).all( @auth, [@id].flatten )
18
16
  end
19
17
 
20
- def keyword_ids()
21
- call( 'keyword' ).search_id_by_group_id( @auth, @id )
18
+ def creative_ids
19
+ call( "creative" ).ids( @auth, [@id].flatten )
22
20
  end
23
21
 
24
- def creatives()
25
- call( 'creative' ).search_by_group_id( @auth, @id )
22
+ def sublinks
23
+ call( "sublink" ).all( @auth, [@id].flatten )
26
24
  end
27
25
 
28
- def creative_ids()
29
- call( 'creative' ).search_id_by_group_id( @auth, @id )
26
+ def sublink_ids
27
+ call( "sublink" ).ids( @auth, [@id].flatten )
30
28
  end
31
29
 
32
30
  # keyword opeartion
@@ -35,25 +33,18 @@ module PPC
35
33
  # creative opeartion
36
34
  include ::PPC::Operation::Creative_operation
37
35
 
36
+ # sublink opeartion
37
+ include ::PPC::Operation::Sublink_operation
38
+
38
39
  # Overwrite add method to provide more function
39
40
  def add_keyword( keywords )
40
- call('keyword').add( @auth, add_group_id( keywords ) )
41
+ call( "keyword" ).add( @auth, keywords.map{|keyword| keyword.merge(group_id: @id)} )
41
42
  end
42
43
 
43
44
  def add_creative( creatives )
44
- call('creative').add( @auth, add_group_id( creatives ) )
45
+ call( "creative" ).add( @auth, creatives.map{|creative| creative.merge(group_id: @id)} )
45
46
  end
46
47
 
47
- # Auxilary function
48
- private
49
- def add_group_id( types )
50
- types = [types] unless types.is_a? Array
51
- types.each do |type|
52
- type.merge!( {group_id:@id} )
53
- end
54
- return types
55
- end
56
-
57
48
  end # Group
58
49
  end # Operation
59
50
  end # PPC
@@ -3,33 +3,6 @@ module PPC
3
3
  class Keyword
4
4
  include ::PPC::Operation
5
5
 
6
- def info()
7
- call( 'keyword' ).get( @auth, @id )
8
- end
9
-
10
- def update( type )
11
- type.merge(id: @id) if type.is_a? Hash
12
- call( 'keyword' ).update( @auth, type )
13
- end
14
-
15
- # Todo: Implement Activate method in Sogou API
16
- def activate()
17
- call( 'keyword' ).activate( @auth, @id )
18
- end
19
-
20
- def status()
21
- call( 'keyword' ).status( @auth, @id )
22
- end
23
-
24
- def quality()
25
- call( 'keyword' ).quality( @auth, @id )
26
- end
27
-
28
- def delete( ids = nil )
29
- ids ||= @id
30
- call( 'keyword' ).delete( @auth, ids )
31
- end
32
-
33
6
  end
34
7
  end
35
8
  end
@@ -4,43 +4,55 @@ module PPC
4
4
  class Plan
5
5
  include ::PPC::Operation
6
6
 
7
- def info
8
- call('plan').get(@auth,@id)
7
+ def groups
8
+ call( "group" ).all( @auth, [@id].flatten )
9
9
  end
10
10
 
11
- def update( plan )
12
- call('plan').update( @auth, plan.merge( id:@id ) )
11
+ def group_ids
12
+ call( "group" ).ids( @auth, [@id].flatten )
13
13
  end
14
14
 
15
- def groups()
16
- result = call('group').search_by_plan_id(@auth, @id)
17
- result[:result] = result[:result][0][:groups]
18
- return result
15
+ def keywords( group_ids )
16
+ call( "keyword" ).all( @auth, [group_ids].flatten )
19
17
  end
20
18
 
21
- def group_ids()
22
- result = call('group').search_id_by_plan_id(@auth, @id)
23
- result[:result] = result[:result][0][:group_ids]
24
- return result
19
+ def keyword_ids( group_ids )
20
+ call( "keyword" ).ids( @auth, [group_ids].flatten )
21
+ end
22
+
23
+ def creatives( group_ids )
24
+ call( "creative" ).all( @auth, [group_ids].flatten )
25
+ end
26
+
27
+ def creative_ids( group_ids )
28
+ call( "creative" ).ids( @auth, [group_ids].flatten )
29
+ end
30
+
31
+ def sublinks( group_ids )
32
+ call( "sublink" ).all( @auth, [group_ids].flatten )
33
+ end
34
+
35
+ def sublink_ids( group_ids )
36
+ call( "sublink" ).ids( @auth, [group_ids].flatten )
25
37
  end
26
38
 
27
39
  # group opeartion
28
40
  include ::PPC::Operation::Group_operation
29
41
 
42
+ # keyword opeartion
43
+ include ::PPC::Operation::Keyword_operation
44
+
45
+ # creative opeartion
46
+ include ::PPC::Operation::Creative_operation
47
+
48
+ # sublink opeartion
49
+ include ::PPC::Operation::Sublink_operation
50
+
30
51
  # Overwirte add_group method to provide more function
31
52
  def add_group( groups )
32
- call('group').add( @auth, add_plan_id( groups ) )
53
+ call( "group" ).add( @auth, groups.map{|group| group.merge(plan_id: @id)} )
33
54
  end
34
55
 
35
- # Auxilary function
36
- private
37
- def add_plan_id( types )
38
- types = [types] unless types.is_a? Array
39
- types.each do |type|
40
- type.merge!({plan_id:@id})
41
- end
42
- return types
43
- end
44
56
 
45
57
  end # class plan
46
58
  end # mudole Opeartion