ppc 0.3.0 → 1.0.1

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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/.autotest +25 -0
  3. data/.gemtest +0 -0
  4. data/History.txt +6 -0
  5. data/Manifest.txt +8 -0
  6. data/README.txt +80 -0
  7. data/Rakefile +19 -0
  8. data/bin/ppc +3 -0
  9. data/lib/ppc.rb +6 -15
  10. data/test/test_ppc.rb +0 -0
  11. metadata +41 -130
  12. data/.gitignore +0 -37
  13. data/.rspec +0 -2
  14. data/LICENSE +0 -339
  15. data/README.md +0 -78
  16. data/lib/ppc/api.rb +0 -10
  17. data/lib/ppc/api/baidu.rb +0 -138
  18. data/lib/ppc/api/baidu/account.rb +0 -47
  19. data/lib/ppc/api/baidu/bulk.rb +0 -41
  20. data/lib/ppc/api/baidu/creative.rb +0 -125
  21. data/lib/ppc/api/baidu/group.rb +0 -111
  22. data/lib/ppc/api/baidu/keyword.rb +0 -204
  23. data/lib/ppc/api/baidu/plan.rb +0 -68
  24. data/lib/ppc/api/baidu/report.rb +0 -143
  25. data/lib/ppc/api/qihu.rb +0 -107
  26. data/lib/ppc/api/qihu/account.rb +0 -86
  27. data/lib/ppc/api/qihu/creative.rb +0 -106
  28. data/lib/ppc/api/qihu/group.rb +0 -113
  29. data/lib/ppc/api/qihu/keyword.rb +0 -111
  30. data/lib/ppc/api/qihu/plan.rb +0 -64
  31. data/lib/ppc/api/qihu/report.rb +0 -159
  32. data/lib/ppc/api/shenma.rb +0 -64
  33. data/lib/ppc/api/shenma/report.rb +0 -135
  34. data/lib/ppc/api/sogou.rb +0 -122
  35. data/lib/ppc/api/sogou/account.rb +0 -42
  36. data/lib/ppc/api/sogou/creative.rb +0 -117
  37. data/lib/ppc/api/sogou/group.rb +0 -116
  38. data/lib/ppc/api/sogou/keyword.rb +0 -182
  39. data/lib/ppc/api/sogou/plan.rb +0 -66
  40. data/lib/ppc/api/sogou/report.rb +0 -129
  41. data/lib/ppc/ext.rb +0 -9
  42. data/lib/ppc/operation.rb +0 -196
  43. data/lib/ppc/operation/account.rb +0 -53
  44. data/lib/ppc/operation/creative.rb +0 -28
  45. data/lib/ppc/operation/group.rb +0 -59
  46. data/lib/ppc/operation/keyword.rb +0 -32
  47. data/lib/ppc/operation/plan.rb +0 -47
  48. data/lib/ppc/operation/report.rb +0 -19
  49. data/ppc.gemspec +0 -26
  50. data/spec/baidu/api_baidu_account_spec.rb +0 -15
  51. data/spec/baidu/api_baidu_creative_spec.rb +0 -67
  52. data/spec/baidu/api_baidu_group_spec.rb +0 -45
  53. data/spec/baidu/api_baidu_keyword_spec.rb +0 -61
  54. data/spec/baidu/api_baidu_plan_spec.rb +0 -43
  55. data/spec/baidu/api_baidu_report_spec.rb +0 -44
  56. data/spec/baidu/api_baidu_spec.rb +0 -55
  57. data/spec/operation/operation_baidu_report_spec.rb +0 -17
  58. data/spec/operation/operation_baidu_spec.rb +0 -78
  59. data/spec/operation/operation_qihu_report_spec.rb +0 -18
  60. data/spec/operation/operation_qihu_spec.rb +0 -51
  61. data/spec/operation/operation_sogou_report_spec.rb +0 -17
  62. data/spec/operation/operation_sogou_spec.rb +0 -51
  63. data/spec/operation/operation_spec_helper.rb +0 -51
  64. data/spec/qihu/api_qihu_account_spec.rb +0 -25
  65. data/spec/qihu/api_qihu_creative_spec.rb +0 -48
  66. data/spec/qihu/api_qihu_group_spec.rb +0 -40
  67. data/spec/qihu/api_qihu_keyword_spec.rb +0 -50
  68. data/spec/qihu/api_qihu_plan_spec.rb +0 -39
  69. data/spec/qihu/api_qihu_report_spec.rb +0 -54
  70. data/spec/sogou/api_sogou_account_spec.rb +0 -15
  71. data/spec/sogou/api_sogou_creative_spec.rb +0 -48
  72. data/spec/sogou/api_sogou_group_spec.rb +0 -45
  73. data/spec/sogou/api_sogou_keyword_spec.rb +0 -50
  74. data/spec/sogou/api_sogou_plan_spec.rb +0 -39
  75. data/spec/sogou/api_sogou_report_spec.rb +0 -51
  76. data/spec/spec_helper.rb +0 -134
@@ -1,47 +0,0 @@
1
- module PPC
2
- module API
3
- class Baidu
4
- class Account< Baidu
5
- Service = 'Account'
6
-
7
- @map = [
8
- [:id,:userid],
9
- [:balance,:balance],
10
- [:cost,:cost],
11
- [:payment,:payment],
12
- [:status,:userStat],
13
- [:budget_type,:budgetType],
14
- [:budget,:budget],
15
- [:region,:regionTarget],
16
- [:exclude_ip,:excludeIp],
17
- [:isdynamic,:isDynamicCreative],
18
- [:dynamic_param,:dynamicCreativeParam],
19
- [:open_domains,:openDomains],
20
- [:reg_domain,:regDomain],
21
- [:offline_time,:budgetOfflineTime],
22
- [:weekly_budget,:weeklyBudget],
23
- [:opt,:opt]
24
- ]
25
-
26
- def self.info( auth )
27
- response = request(auth,Service,'getAccountInfo' )
28
- return process( response, 'accountInfoType' ){ |x|reverse_type(x)[0] }
29
- end
30
-
31
- def self.update(auth, param = {} )
32
- """
33
- update account info
34
- @ params : account_info_type
35
- @return : account info_type
36
- """
37
- # for account service, there is not bulk operation
38
- infoType = make_type( param )[0]
39
- body = { accountInfoType: infoType }
40
- response = request(auth,Service,'updateAccountInfo', body)
41
- return process( response, 'accountInfoType' ){ |x|reverse_type(x)[0] }
42
- end
43
-
44
- end
45
- end
46
- end
47
- end
@@ -1,41 +0,0 @@
1
- module PPC
2
- module API
3
- class Baidu
4
- class Bulk < Baidu
5
- Service = 'BulkJob'
6
-
7
- def self.get_all_object( auth,params = {})
8
-
9
- plan_ids = params[:plan_ids]
10
-
11
- unless plan_ids.nil?
12
- plan_ids = plan_ids.class == Array ? plan_ids : [plan_ids]
13
- end
14
-
15
- options = {
16
- campaignIds: plan_ids || [] ,
17
- includeQuality: params[:quality] || true ,
18
- includeTemp: params[:temp] || false ,
19
- format: params[:format] || 1 ,
20
- newCreativeFiles: params[:adcopy] || 0 ,
21
- includeTempNewCreatives: params[:temp_adcopy] || 0 ,
22
- includePhraseType: params[:phrase] || 0 ,
23
- extended: params[:extended] || 0
24
- }
25
- response = request( auth, Service, 'getAllObjects',options )
26
- response[:get_all_objects_response][:file_id]
27
- end
28
-
29
- def self.state( auth, id)
30
- raise "empty id" if id.nil? or id.empty?
31
- request(auth, Service, 'getFileState',{fileId:id})[:get_file_state_response][:is_generated]
32
- end
33
-
34
- def self.path( auth, id)
35
- request( auth, Service, 'getFilePath',{fileId:id})[:get_file_path_response][:file_paths]
36
- end
37
-
38
- end
39
- end
40
- end
41
- end
@@ -1,125 +0,0 @@
1
- # -*- coding:utf-8 -*-
2
- module PPC
3
- module API
4
- class Baidu
5
- class Creative< Baidu
6
- Service = 'Creative'
7
-
8
- @map =[
9
- [:id,:creativeId],
10
- [:group_id,:adgroupId],
11
- [:title,:title],
12
- [:description1,:description1],
13
- [:description2,:description2],
14
- [:pc_destination,:pcDestinationUrl],
15
- [:pc_display,:pcDisplayUrl],
16
- [:moile_destination,:mobileDestinationUrl],
17
- [:mobile_display,:mobileDisplayUrl],
18
- [:pause,:pause],
19
- [:preference,:devicePreference]
20
- ]
21
-
22
- def self.add( auth, creatives )
23
- body = { creativeTypes: make_type( creatives ) }
24
- response = request( auth, Service, 'addCreative', body )
25
- process( response, 'creativeTypes' ){ |x| reverse_type(x) }
26
- end
27
-
28
- def self.get( auth, ids, getTemp = 0 )
29
- '''
30
- \'getCreativeByCreativeId\'
31
- @ input : creative ids
32
- @ output: creative informations
33
- '''
34
- ids = [ ids ] unless ids.is_a? Array
35
- body = { creativeIds: ids, getTemp: getTemp }
36
- response = request( auth, Service, 'getCreativeByCreativeId', body )
37
- process( response, 'creativeTypes' ){ |x| reverse_type(x) }
38
- end
39
-
40
- def self.update( auth, creatives )
41
- '''
42
- 根据实际使用情况,更新的时候creative title为必填选
43
- '''
44
- body = { creativeTypes: make_type( creatives ) }
45
- response = request( auth, Service, 'updateCreative', body )
46
- process( response, 'creativeTypes' ){ |x| reverse_type(x) }
47
- end
48
-
49
- def self.delete( auth, ids )
50
- ids = [ ids ] unless ids.is_a? Array
51
- body = { creativeIds: ids }
52
- response = request( auth, Service, 'deleteCreative', body )
53
- process( response, 'result' ){ |x| x }
54
- end
55
-
56
- def self.activate( auth, ids )
57
- ids = [ ids ] unless ids.is_a? Array
58
- body = { creativeIds: ids }
59
- response = request( auth, Service, 'activateCreative', body )
60
- process( response, 'creativeTypes' ){ |x| reverse_type(x) }
61
- end
62
-
63
- def self.status( auth, ids, type )
64
- ids = [ ids ] unless ids.is_a? Array
65
-
66
- type = case type
67
- when 'plan' then 3
68
- when 'group' then 5
69
- when 'creative' then 7
70
- else
71
- Exception.new( 'type must among: \'plan\',\'group\' and \'key\' ')
72
- end
73
-
74
- body = { ids: ids, type: type }
75
- response = request( auth, Service, 'getCreativeStatus', body )
76
- process( response, 'CreativeStatus' ){ |x| x }
77
- end
78
-
79
- def self.search_id_by_group_id( auth, ids, getTemp = 0 )
80
- '''
81
- \'getCreativeIdByAdgroupId\'
82
- @ input: group ids
83
- @ output: groupCreativeIds
84
- '''
85
- ids = [ ids ] unless ids.is_a? Array
86
- body = { adgroupIds: ids, getTemp: getTemp }
87
- response = request( auth, Service, 'getCreativeIdByAdgroupId', body )
88
- process( response, 'groupCreativeIds' ){ |x| make_groupCreativeIds( x ) }
89
- end
90
-
91
- def self.search_by_group_id( auth, ids, getTemp = 0 )
92
- ids = [ ids ] unless ids.is_a? Array
93
- body = { adgroupIds: ids, getTemp: getTemp }
94
- response = request( auth, Service, 'getCreativeByAdgroupId', body )
95
- process( response, 'groupCreatives' ){ |x| make_groupCreatives( x ) }
96
- end
97
-
98
- private
99
- def self.make_groupCreativeIds( groupCreativeIds )
100
- group_creative_ids = []
101
- groupCreativeIds.each do |groupCreativeId|
102
- group_creative_id = { }
103
- group_creative_id[:group_id] = groupCreativeId['adgroupIds']
104
- group_creative_id[:creative_ids] = groupCreativeId['creativeIds']
105
- group_creative_ids << group_creative_id
106
- end
107
- return group_creative_ids
108
- end
109
-
110
- private
111
- def self.make_groupCreatives( groupCreatives )
112
- group_creatives = []
113
- groupCreatives.each do |groupCreative |
114
- group_creative = {}
115
- group_creative[:group_id] = groupCreative['adgroupId']
116
- group_creative[:creatives] = reverse_type( groupCreative['creativeTypes'] )
117
- group_creatives << group_creative
118
- end
119
- return group_creatives
120
- end
121
-
122
- end
123
- end
124
- end
125
- end
@@ -1,111 +0,0 @@
1
- # -*- coding:utf-8 -*-
2
- module PPC
3
- module API
4
- class Baidu
5
- class Group< Baidu
6
- Service = 'Adgroup'
7
-
8
- @map =[
9
- [:plan_id, :campaignId],
10
- [:id, :adgroupId],
11
- [:name, :adgroupName],
12
- [:price, :maxPrice],
13
- [:negative, :negativeWords],
14
- [:exact_negative, :exactNegativeWords],
15
- [:pause, :pause],
16
- [:status, :status],
17
- [:reserved, :reserved]
18
- ]
19
-
20
- def self.ids(auth )
21
- """
22
- @return : Array of campaignAdgroupIds
23
- """
24
- response = request( auth, Service , "getAllAdgroupId" )
25
- process( response, 'campaignAdgroupIds' ){ |x| make_planGroupIds( x ) }
26
- end
27
-
28
- def self.get( auth, ids )
29
- ids = [ ids ] unless ids.is_a? Array
30
- body = { adgroupIds: ids }
31
- response = request(auth, Service, "getAdgroupByAdgroupId",body )
32
- process( response, 'adgroupTypes' ){ |x| reverse_type(x) }
33
- end
34
-
35
- def self.add( auth, groups )
36
- """
37
- @ input : one or list of AdgroupType
38
- @ output : list of AdgroupType
39
- """
40
- adgrouptypes = make_type( groups )
41
-
42
- body = {adgroupTypes: adgrouptypes }
43
-
44
- response = request( auth, Service, "addAdgroup", body )
45
- process( response, 'adgroupTypes' ){ |x| reverse_type(x) }
46
- end
47
-
48
- def self.update( auth, groups )
49
- """
50
- @ input : one or list of AdgroupType
51
- @ output : list of AdgroupType
52
- """
53
- adgrouptypes = make_type( groups )
54
- body = {adgroupTypes: adgrouptypes}
55
-
56
- response = request( auth, Service, "updateAdgroup",body )
57
- process( response, 'adgroupTypes' ){ |x| reverse_type(x) }
58
- end
59
-
60
- def self.delete( auth, ids )
61
- """
62
- delete group body has no message
63
- """
64
- ids = [ ids ] unless ids.is_a? Array
65
- body = { adgroupIds: ids }
66
- response = request( auth, Service,"deleteAdgroup", body )
67
- process( response, 'nil' ){ |x| x }
68
- end
69
-
70
- def self.search_by_plan_id( auth, ids )
71
- ids = [ ids ] unless ids.class == Array
72
- body = { campaignIds: ids }
73
- response = request( auth, Service ,"getAdgroupByCampaignId", body )
74
- process( response, 'campaignAdgroups' ){ |x| make_planGroups( x ) }
75
- end
76
-
77
- def self.search_id_by_plan_id( auth, ids )
78
- ids = [ ids ] unless ids.class == Array
79
- body = { campaignIds: ids }
80
- response = request( auth, Service ,"getAdgroupIdByCampaignId", body )
81
- process( response, 'campaignAdgroupIds' ){ |x| make_planGroupIds( x ) }
82
- end
83
-
84
- private
85
- def self.make_planGroupIds( campaignAdgroupIds )
86
- planGroupIds = []
87
- campaignAdgroupIds.each do |campaignAdgroupId|
88
- planGroupId = { }
89
- planGroupId[:plan_id] = campaignAdgroupId['campaignId']
90
- planGroupId[:group_ids] = campaignAdgroupId['adgroupIds']
91
- planGroupIds << planGroupId
92
- end
93
- return planGroupIds
94
- end
95
-
96
- private
97
- def self.make_planGroups( campaignAdgroups )
98
- planGroups = []
99
- campaignAdgroups.each do |campaignAdgroup|
100
- planGroup = {}
101
- planGroup[:plan_id] = campaignAdgroup['campaignId']
102
- planGroup[:groups] = reverse_type( campaignAdgroup['adgroupTypes'] )
103
- planGroups << planGroup
104
- end
105
- return planGroups
106
- end
107
-
108
- end # class group
109
- end # class baidu
110
- end # API
111
- end # module
@@ -1,204 +0,0 @@
1
- # -*- coding:utf-8 -*-
2
- module PPC
3
- module API
4
- class Baidu
5
- class Keyword< Baidu
6
- Service = 'Keyword'
7
-
8
- Match_type = { 'exact' => 1, 'pharse' => 2, 'wide' => 3,1 => 'exact', 2=> 'pharse' , 3 => 'wide' }
9
- Device = { 'pc' => 0, 'mobile' => 1, 'all' => 2 }
10
- Type = { 'plan' => 3, 'group' => 5, 'keyword' => 11 }
11
-
12
- @map = [
13
- [:id,:keywordId],
14
- [:group_id,:adgroupId],
15
- [:keyword,:keyword],
16
- [:price,:price],
17
- [:pc_destination,:pcDestinationUrl],
18
- [:mobile_destination,:mobileDestinationUrl],
19
- [:match_type,:matchType],
20
- [:phrase_type,:phraseType],
21
- [:status,:status],
22
- [:pause,:pause]
23
- ]
24
-
25
- @quality10_map = [
26
- [ :id, :id ],
27
- [ :group_id, :adgroupId ],
28
- [ :plan_id, :Campaigned ],
29
- [ :pc_quality, :pcQuality ],
30
- [ :pc_reliable, :pcReliable ],
31
- [ :pc_reason, :pcReason ],
32
- [ :pc_scale, :pcScale ],
33
- [ :mobile_quality, :mobileQuality ],
34
- [ :mobile_reliable, :mobileReliable ],
35
- [ :mobile_reason, :mobileReason ],
36
- [ :mobile_scale, :mobileScale ]
37
- ]
38
-
39
- # 后面改成info方法
40
- def self.get( auth, ids )
41
- '''
42
- getKeywordByKeywordId
43
- '''
44
- ids = [ ids ] unless ids.is_a? Array
45
- body = { keywordIds: ids}
46
- response = request( auth, Service, 'getKeywordByKeywordId', body )
47
- return process(response, 'keywordTypes' ){|x| reverse_type( x ) }
48
- end
49
-
50
- def self.add( auth, keywords )
51
- '''
52
- '''
53
- keywordtypes = make_type( keywords )
54
- body = { keywordTypes: keywordtypes }
55
- response = request( auth, Service, "addKeyword", body )
56
- return process(response, 'keywordTypes' ){|x| reverse_type(x) }
57
- end
58
-
59
- def self.update( auth, keywords )
60
- '''
61
- '''
62
- keywordtypes = make_type( keywords )
63
- body = { keywordTypes: keywordtypes }
64
- response = request( auth, Service, "updateKeyword", body )
65
- return process(response, 'keywordTypes' ){|x| reverse_type(x) }
66
- end
67
-
68
- def self.delete( auth, ids )
69
- """
70
- """
71
- ids = [ ids ] unless ids.is_a? Array
72
- body = { keywordIds: ids}
73
- response = request( auth, Service, 'deleteKeyword', body )
74
- return process(response, 'result' ){|x| x }
75
- end
76
-
77
- def self.activate( auth, ids )
78
- """
79
- """
80
- ids = [ ids ] unless ids.is_a? Array
81
- body = { keywordIds: ids }
82
- response = request( auth, Service, 'activateKeyword', body)
83
- return process(response, 'keywordTypes' ){|x| reverse_type(x) }
84
- end
85
-
86
- def self.search_by_group_id( auth, group_ids )
87
- """
88
- getKeywordByGroupIds
89
- @input: list of group id
90
- @output: list of groupKeyword
91
- """
92
- group_ids = [ group_ids ] unless group_ids.is_a? Array
93
- body = { adgroupIds: group_ids }
94
- response = request( auth, Service, "getKeywordByAdgroupId", body )
95
- return process(response, 'groupKeywords' ){|x| make_groupKeywords( x ) }
96
- end
97
-
98
- def self.search_id_by_group_id( auth, group_ids )
99
- group_ids = [ group_ids ] unless group_ids.is_a? Array
100
- body = { adgroupIds: group_ids }
101
- response = request( auth, Service, "getKeywordIdByAdgroupId", body )
102
- return process(response, 'groupKeywordIds' ){|x| make_groupKeywordIds( x ) }
103
- end
104
-
105
- # 下面三个操作操作对象包括计划,组和关键字
106
- # 不知道放在这里合不合适
107
- def self.status( auth, ids, type )
108
- '''
109
- Return [{ id: id, status: status } ... ]
110
- '''
111
- ids = [ ids ] unless ids.is_a? Array
112
- body = { ids: ids, type: Type[type]}
113
- response = request( auth, Service, 'getKeywordStatus', body )
114
- return process(response, 'keywordStatus' ){ |statusTypes|
115
- statusTypes = [statusTypes] unless statusTypes.is_a? Array
116
- status =[]
117
-
118
- statusTypes.each do |statusType|
119
- status << { id: statusType['id'], status: statusType['status'] }
120
- end
121
- return status
122
- }
123
- end
124
-
125
- def self.quality( auth ,ids, type, device )
126
- '''
127
- Return 10Quanlity *Not the old Quality* of given ketword id
128
- '''
129
- ids = [ ids ] unless ids.is_a? Array
130
- body = { ids: ids, type: Type[type], device:Device[device] }
131
- response = request( auth, Service, 'getKeyword10Quality', body )
132
- return process(response, 'keyword10Quality' ){|x| reverse_type( x, @quality10_map ) }
133
- end
134
-
135
- private
136
- def self.make_groupKeywordIds( groupKeywordIds )
137
- group_keyword_ids = []
138
- groupKeywordIds.each do |groupKeywordId|
139
- group_keyword_id = { }
140
- group_keyword_id[:group_id] = groupKeywordId['adgroupIds']
141
- group_keyword_id[:keyword_ids] = groupKeywordId['keywordIds']
142
- group_keyword_ids << group_keyword_id
143
- end
144
- return group_keyword_ids
145
- end
146
-
147
- private
148
- def self.make_groupKeywords( groupKeywords )
149
- group_keywords = []
150
- groupKeywords.each do |groupKeyword|
151
- group_keyword = {}
152
- group_keyword[:group_id] = groupKeyword['adgroupId']
153
- group_keyword[:keywords] = reverse_type( groupKeyword['keywordTypes'] )
154
- group_keywords << group_keyword
155
- end
156
- return group_keywords
157
- end
158
-
159
- # Override
160
- def self.make_type( params, map = @map)
161
- params = [ params ] unless params.is_a? Array
162
- types = []
163
- params.each do |param|
164
- type = {}
165
- map.each do |key|
166
- # 增加对matchtype的自动转换
167
- if key[0] == :match_type
168
- value = param[ key[0] ]
169
- type[ key[1] ] = Match_type[ value ] if value
170
- else
171
- value = param[ key[0] ]
172
- type[ key[1] ] = value if value
173
- end
174
- end
175
- types << type
176
- end
177
- return types
178
- end
179
-
180
- # Overwrite
181
- def self.reverse_type( types, map = @map )
182
- types = [ types ] unless types.is_a? Array
183
- params = []
184
- types.each do |type|
185
- param = {}
186
- # 增加对matchtype的自动转换
187
- map.each do |key|
188
- if key[0] == :match_type
189
- value = type[ key[1].to_s ]
190
- param[ key[0] ] = Match_type[ value ] if value
191
- else
192
- value = type[ key[1].to_s ]
193
- param[ key[0] ] = value if value
194
- end
195
- end # map.each
196
- params << param
197
- end # types.each
198
- return params
199
- end
200
-
201
- end # keyword
202
- end # Baidu
203
- end # API
204
- end # PPC