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
@@ -5,13 +5,14 @@ module PPC
5
5
  class Phone < Sm
6
6
  Service = 'NewCreative'
7
7
 
8
- @map =[
9
- [:id,:phoneId],
10
- [:group_id,:adgroupId],
11
- [:phone_num,:phoneNum],
12
- [:pause,:pause],
13
- ]
14
-
8
+ PhoneType = {
9
+ id: :phoneId,
10
+ group_id: :adgroupId,
11
+ phone_num: :phoneNum,
12
+ pause: :pause,
13
+ }
14
+ @map = PhoneType
15
+
15
16
  def self.update( auth, phones )
16
17
  '''
17
18
  根据实际使用情况,更新的时候creative title为必填选
@@ -21,7 +22,7 @@ module PPC
21
22
  process( response, 'phoneTypes' ){ |x| reverse_type(x) }
22
23
  end
23
24
 
24
- def self.search_id_by_group_id( auth, ids, getTemp = 0 )
25
+ def self.ids( auth, ids, getTemp = 0 )
25
26
  '''
26
27
  \'getPhoneIdByAdgroupId\'
27
28
  @ input: group ids
@@ -4,20 +4,26 @@ module PPC
4
4
  class Plan < Sm
5
5
  Service = 'campaign'
6
6
 
7
- @map = [
8
- [:id,:campaignId],
9
- [:name,:campaignName],
10
- [:budget,:budget],
11
- [:region,:regionTarget],
12
- [:ip,:excludeIp] ,
13
- [:negative,:negativeWords],
14
- [:exact_negative,:exactNegativeWords],
15
- [:schedule,:schedule],
16
- [:budget_offline_time,:budgetOfflineTime],
17
- [:show_prob,:showProb],
18
- [:pause,:pause],
19
- [:status,:status]
20
- ]
7
+ PlanType = {
8
+ id: :campaignId,
9
+ name: :campaignName,
10
+ budget: :budget,
11
+ region: :regionTarget,
12
+ ip: :excludeIp,
13
+ negative: :negativeWords,
14
+ exact_negative: :exactNegativeWords,
15
+ schedule: :schedule,
16
+ budget_offline_time: :budgetOfflineTime,
17
+ show_prob: :showProb,
18
+ pause: :pause,
19
+ status: :status,
20
+ }
21
+ @map = PlanType
22
+
23
+ def self.info( auth, ids )
24
+ response = request( auth, Service, 'getCampaignByCampaignId', {campaignIds: ids})
25
+ process( response, 'campaignTypes' ){ |x| reverse_type(x)[0] }
26
+ end
21
27
 
22
28
  def self.all( auth )
23
29
  response = request( auth, Service, 'getAllCampaign' )
@@ -30,32 +36,36 @@ module PPC
30
36
  end
31
37
 
32
38
  def self.get( auth, ids )
33
- ids = [ ids ] unless ids.is_a? Array
34
- body = { campaignIds: ids }
35
- response = request( auth, Service, 'getCampaignByCampaignId', body)
39
+ response = request( auth, Service, 'getCampaignByCampaignId', {campaignIds: ids})
36
40
  process( response, 'campaignTypes' ){ |x| reverse_type(x) }
37
41
  end
38
42
 
39
43
  def self.add( auth, plans )
40
- campaign_types = make_type( plans )
41
- body = { campaignTypes: campaign_types }
44
+ body = { campaignTypes: make_type( plans ) }
42
45
  response = request( auth, Service, 'addCampaign', body)
43
46
  process( response, 'campaignTypes' ){ |x| reverse_type(x) }
44
47
  end
45
48
 
46
- def self.update(auth,plans )
47
- campaign_types = make_type( plans )
48
- body = { campaignTypes: campaign_types }
49
+ def self.update( auth, plans )
50
+ body = { campaignTypes: make_type( plans ) }
49
51
  response = request( auth, Service, 'updateCampaign', body)
50
52
  process( response, 'campaignTypes' ){ |x| reverse_type(x) }
51
53
  end
52
54
 
53
- def self.delete(auth, ids )
54
- ids = [ ids ] unless ids.is_a? Array
55
- body = { campaignIds: ids }
56
- response = request( auth, Service, 'deleteCampaign', body, "delete")
55
+ def self.delete( auth, ids )
56
+ response = request( auth, Service, 'deleteCampaign', {campaignIds: ids}, "delete")
57
57
  process( response, 'result' ){ |x| x }
58
58
  end
59
+
60
+ def self.enable( auth, ids )
61
+ plans = ids.map{|id| {id: id, pause: false} }
62
+ self.update( auth, plans )
63
+ end
64
+
65
+ def self.pause( auth, ids )
66
+ plans = ids.map{|id| {id: id, pause: true} }
67
+ self.update( auth, plans )
68
+ end
59
69
 
60
70
  end # Service
61
71
  end # baidu
@@ -29,23 +29,17 @@ module PPC
29
29
  end
30
30
 
31
31
  def self.get_state( auth, id )
32
- '''
33
- input id should be string
34
- '''
35
- body = { taskId: id }
36
- response = request( auth, 'task' , 'getTaskState' ,body)
32
+ response = request( auth, 'task' , 'getTaskState' , {taskId: id} )
37
33
  process( response, 'status' ){ |x| x }
38
34
  end
39
35
 
40
36
  def self.get_fileId( auth, id )
41
- body = { taskId: id }
42
- response = request( auth, 'task' , 'getTaskState' ,body)
37
+ response = request( auth, 'task' , 'getTaskState' , {taskId: id} )
43
38
  process( response, 'fileId' ){ |x| x }
44
39
  end
45
40
 
46
41
  def self.get_file( auth, id )
47
- body = { fileId: id }
48
- response = request( auth, 'file' , 'download' ,body)
42
+ request( auth, 'file' , 'download' , {fileId: id} )
49
43
  end
50
44
 
51
45
  private
@@ -67,25 +61,12 @@ module PPC
67
61
  requesttype[:unitOfTime] = Unit_map[ param[:unit] ] if param[:unit]
68
62
  requesttype[:device] = Device_map[ param[:device] ] if param[:device]
69
63
  requesttype[:idOnly] = param[:id_only] || false
70
- requesttype[:startDate] = parse_date( param[:startDate] )
71
- requesttype[:endDate] = parse_date( param[:endDate] )
64
+ requesttype[:startDate] = Date.parse( param[:startDate] ) rescue Date.today
65
+ requesttype[:endDate] = Date.parse( param[:endDate] ) rescue Date.today
72
66
  requesttype[:statIds] = param[:statIds] if param[:type] == "keyword" && param[:range] != "account"
73
67
  return requesttype
74
68
  end
75
69
 
76
- private
77
- def self.parse_date( date )
78
- """
79
- Cast string to time:
80
- 'YYYYMMDD' => Time
81
- """
82
- if date
83
- date = Date.parse(date)
84
- else
85
- date = Date.today
86
- end
87
- end
88
-
89
70
  #################################
90
71
  # useful function for operation #
91
72
  #################################
@@ -54,64 +54,14 @@ module PPC
54
54
  into snake_case symbol inside the method
55
55
  '''
56
56
  result = {}
57
- result[:succ] = response[:header][:desc]=='success'? true : false
57
+ result[:succ] = response[:header][:desc] == 'success'
58
58
  result[:failure] = response[:header][:failures]
59
- result[:no_quota] = is_no_quota(response[:header][:failures], '18')
60
- unless response[:body].nil? or response[:body][key.snake_case.to_sym].nil?
61
- result[:result] = func[ response[:body][ key.snake_case.to_sym ] ]
62
- end
63
- return result
59
+ result[:no_quota] = (response[:header][:failures][:code] == '18') rescue false
60
+ result[:result] = func[ response[:body][ key.snake_case.to_sym ] ] rescue nil
61
+ result[:rquota] = response[:header][:rquota] if response[:header][:rquota]
62
+ result
64
63
  end
65
64
 
66
- # def self.make_type( params, map = @map)
67
- # '''
68
- # For more info visit ::PPC::API::sogou:make_type
69
- # '''
70
- # params = [ params ] unless params.is_a? Array
71
- #
72
- # types = []
73
- # params.each do |param|
74
- # type = {}
75
- #
76
- # map.each do |key|
77
- # value = param[ key[0] ]
78
- # type[ key[1] ] = value if value != nil
79
- # end
80
- #
81
- # types << type
82
- # end
83
- # return types
84
- # end
85
- def self.reverse_type( types, maps = @map )
86
- types = [ types ] unless types.is_a? Array
87
- types.map do |item|
88
- maps.each{|m| item.filter_and_replace_key(m[0],m[1].to_s.snake_case.to_sym)}
89
- item
90
- end
91
- end
92
-
93
- # def self.reverse_type( types, map = @map )
94
- # '''
95
- # For more info visit ::PPC::API::sogou:reverse_type
96
- # Here, the camel key will be turn into snake key
97
- # '''
98
- # types = [ types ] unless types.is_a? Array
99
- #
100
- # params = []
101
- # types.each do |type|
102
- # param = {}
103
- #
104
- # map.each do |key|
105
- # # 这里做两次转换并不是十分高效的方法,考虑maintain两张map
106
- # value = type[ key[1].to_s.snake_case.to_sym ]
107
- # param[ key[0] ] = value if value != nil
108
- # end
109
-
110
- # params << param
111
- # end
112
- # return params
113
- # end
114
-
115
65
  end
116
66
  end
117
67
  end
@@ -4,22 +4,23 @@ module PPC
4
4
  class Account < Sogou
5
5
  Service = 'Account'
6
6
 
7
- @map = [
8
- [:id,:accountid],
9
- [:balance,:balance],
10
- [:cost,:totalCost],
11
- [:payment,:totalPay],
12
- [:budget_type,:type],
13
- [:budget,:budget],
14
- [:region,:regions],
15
- [:exclude_ip,:excludeIps],
16
- [:open_domains,:domains],
17
- [:offline_time,:budgetOfflineTime],
18
- [:opt,:opt]
19
- ]
7
+ AccountType = {
8
+ id: :accountid,
9
+ balance: :balance,
10
+ cost: :total_cost,
11
+ payment: :total_pay,
12
+ budget_type: :type,
13
+ budget: :budget,
14
+ region: :regions,
15
+ exclude_ip: :excludeIps,
16
+ open_domains: :domains,
17
+ offline_time: :budgetOfflineTime,
18
+ opt: :opt,
19
+ }
20
+ @map = AccountType
20
21
 
21
- def self.info(auth)
22
- response = request(auth,Service,'getAccountInfo' )
22
+ def self.info( auth )
23
+ response = request(auth,Service,'getAccountInfo' )
23
24
  process( response, 'accountInfoType' ){ |x|reverse_type(x)[0] }
24
25
  end
25
26
 
@@ -30,8 +31,7 @@ module PPC
30
31
  @return : account info_type
31
32
  """
32
33
  # for account service, there is not bulk operation
33
- infoType = make_type( param )[0]
34
- body = { accountInfoType: infoType }
34
+ body = { accountInfoType: make_type( param )[0] }
35
35
  response = request(auth,Service,'updateAccountInfo', body)
36
36
  process( response, 'accountInfoType' ){ |x|reverse_type(x)[0] }
37
37
  end
@@ -5,25 +5,49 @@ module PPC
5
5
  class Creative< Sogou
6
6
  Service = 'CpcIdea'
7
7
 
8
- @map =[
9
- [:id,:cpcIdeaId],
10
- [:group_id,:cpcGrpId],
11
- [:title,:title],
12
- [:description1,:description1],
13
- [:description2,:description2],
14
- [:pc_destination,:visitUrl],
15
- [:pc_display,:showUrl],
16
- [:moile_destination,:mobileVisitUrl],
17
- [:mobile_display,:mobileShowUrl],
18
- [:pause,:pause],
19
- [:status,:status]
20
- ]
8
+ CreativeType = {
9
+ id: :cpcIdeaId,
10
+ group_id: :cpcGrpId,
11
+ title: :title,
12
+ description1: :description1,
13
+ description2: :description2,
14
+ pc_destination: :visitUrl,
15
+ pc_display: :showUrl,
16
+ moile_destination: :mobileVisitUrl,
17
+ mobile_display: :mobileShowUrl,
18
+ pause: :pause,
19
+ status: :status,
20
+ "group_id" => :cpc_grp_id,
21
+ "id" => :cpc_idea_id,
22
+ "pc_destination" => :visit_url,
23
+ "pc_display" => :show_url,
24
+ "mobile_display" => :mobile_show_url,
25
+ "creative_ids" => :cpc_idea_ids,
26
+ }
27
+ @map = CreativeType
21
28
 
22
- @status_map = [
23
- [:id,:cpcIdeaId],
24
- [:status,:status]
25
- ]
29
+ @status_map = {
30
+ id: :cpcIdeaId,
31
+ status: :status,
32
+ }
26
33
 
34
+ def self.info( auth, ids, getTemp = 0 )
35
+ body = { cpcIdeaIds: ids, getTemp: getTemp }
36
+ response = request( auth, Service, 'getCpcIdeaByCpcIdeaId', body )
37
+ process( response, 'cpcIdeaTypes' ){ |x| reverse_type(x)[0] }
38
+ end
39
+
40
+ def self.all( auth, ids, getTemp = 0 )
41
+ body = { cpcGrpIds: ids, getTemp: getTemp }
42
+ response = request( auth, Service, 'getCpcIdeaByCpcGrpId', body )
43
+ process( response, 'cpcGrpIdeas' ){ |x| ids.count == 1 ? reverse_type(x[:cpc_idea_types]) : x.map{|y| reverse_type(y[:cpc_idea_types])}.flatten }
44
+ end
45
+
46
+ def self.ids( auth, ids, getTemp = 0 )
47
+ body = { cpcGrpIds: ids, getTemp: getTemp }
48
+ response = request( auth, Service, 'getCpcIdeaIdByCpcGrpId', body )
49
+ process( response, 'cpcGrpIdeaIds' ){ |x| reverse_type( x ) }
50
+ end
27
51
 
28
52
  def self.add( auth, creatives )
29
53
  body = { cpcIdeaTypes: make_type( creatives ) }
@@ -32,83 +56,36 @@ module PPC
32
56
  end
33
57
 
34
58
  def self.get( auth, ids, getTemp = 0 )
35
- '''
36
- \'getCreativeByCreativeId\'
37
- @ input : creative ids
38
- @ output: creative informations
39
- '''
40
- ids = [ ids ] unless ids.is_a? Array
41
59
  body = { cpcIdeaIds: ids, getTemp: getTemp }
42
60
  response = request( auth, Service, 'getCpcIdeaByCpcIdeaId', body )
43
61
  process( response, 'cpcIdeaTypes' ){ |x| reverse_type(x) }
44
62
  end
45
63
 
46
64
  def self.update( auth, creatives )
47
- '''
48
- 根据实际使用情况,更新的时候creative title为必填选
49
- '''
50
65
  body = { cpcIdeaTypes: make_type( creatives ) }
51
66
  response = request( auth, Service, 'updateCpcIdea', body )
52
67
  process( response, 'cpcIdeaTypes' ){ |x| reverse_type(x) }
53
68
  end
54
69
 
55
70
  def self.delete( auth, ids )
56
- ids = [ ids ] unless ids.is_a? Array
57
- body = { cpcIdeaIds: ids }
58
- response = request( auth, Service, 'deleteCpcIdea', body )
71
+ response = request( auth, Service, 'deleteCpcIdea', { cpcIdeaIds: ids } )
59
72
  process( response, '' ){ |x| x }
60
73
  end
61
74
 
62
- def self.status( auth, ids, getTemp = 0 )
63
- ids = [ ids ] unless ids.is_a? Array
64
- body = { cpcIdeaIds: ids, getTemp: getTemp }
65
- response = request( auth, Service, 'getCpcIdeaByCpcIdeaId', body )
66
- process( response, 'cpcIdeaTypes' ){ |x| reverse_type(x, @status_map) }
75
+ def self.enable( auth, ids )
76
+ keywords = ids.map{|id| {id: id, pause: false} }
77
+ self.update( auth, keywords )
67
78
  end
68
79
 
69
- def self.search_id_by_group_id( auth, ids, getTemp = 0 )
70
- '''
71
- \'getCreativeIdByAdgroupId\'
72
- @ input: group ids
73
- @ output: groupCreativeIds
74
- '''
75
- ids = [ ids ] unless ids.is_a? Array
76
- body = { cpcGrpIds: ids, getTemp: getTemp }
77
- response = request( auth, Service, 'getCpcIdeaIdByCpcGrpId', body )
78
- process( response, 'cpcGrpIdeaIds' ){ |x| make_groupCreativeIds( x ) }
79
- end
80
-
81
- def self.search_by_group_id( auth, ids, getTemp = 0 )
82
- ids = [ ids ] unless ids.is_a? Array
83
- body = { cpcGrpIds: ids, getTemp: getTemp }
84
- response = request( auth, Service, 'getCpcIdeaByCpcGrpId', body )
85
- process( response, 'cpcGrpIdeas' ){ |x| make_groupCreatives( x ) }
80
+ def self.pause( auth, ids )
81
+ keywords = ids.map{|id| {id: id, pause: true} }
82
+ self.update( auth, keywords )
86
83
  end
87
84
 
88
- private
89
- def self.make_groupCreativeIds( cpcGrpIdeaIdTypes )
90
- cpcGrpIdeaIdTypes = [cpcGrpIdeaIdTypes] unless cpcGrpIdeaIdTypes.is_a? Array
91
- group_creative_ids = []
92
- cpcGrpIdeaIdTypes.each do |cpcGrpIdeaIdType|
93
- group_creative_id = { }
94
- group_creative_id[:group_id] = cpcGrpIdeaIdType[:cpc_grp_id]
95
- group_creative_id[:creative_ids] = cpcGrpIdeaIdType[:cpc_idea_ids]
96
- group_creative_ids << group_creative_id
97
- end
98
- return group_creative_ids
99
- end
100
-
101
- private
102
- def self.make_groupCreatives( cpcGrpIdeaTypes )
103
- cpcGrpIdeaTypes = [cpcGrpIdeaTypes] unless cpcGrpIdeaTypes.is_a? Array
104
- group_creatives = []
105
- cpcGrpIdeaTypes.each do |cpcGrpIdeaType|
106
- group_creative = {}
107
- group_creative[:group_id] = cpcGrpIdeaType[:cpc_grp_id]
108
- group_creative[:creatives] = reverse_type( cpcGrpIdeaType[:cpc_idea_types] )
109
- group_creatives << group_creative
110
- end
111
- return group_creatives
85
+ def self.status( auth, ids, getTemp = 0 )
86
+ body = { cpcIdeaIds: ids, getTemp: getTemp }
87
+ response = request( auth, Service, 'getCpcIdeaByCpcIdeaId', body )
88
+ process( response, 'cpcIdeaTypes' ){ |x| reverse_type(x, @status_map) }
112
89
  end
113
90
 
114
91
  end