ppc 1.3.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/LICENSE +334 -17
  4. data/README.md +75 -3
  5. data/lib/ppc.rb +3 -1
  6. data/lib/ppc/api.rb +137 -2
  7. data/lib/ppc/api/baidu.rb +20 -99
  8. data/lib/ppc/api/baidu/account.rb +21 -21
  9. data/lib/ppc/api/baidu/bulk.rb +39 -3
  10. data/lib/ppc/api/baidu/creative.rb +33 -33
  11. data/lib/ppc/api/baidu/group.rb +14 -14
  12. data/lib/ppc/api/baidu/keyword.rb +57 -46
  13. data/lib/ppc/api/baidu/phone_new_creative.rb +51 -0
  14. data/lib/ppc/api/baidu/plan.rb +34 -31
  15. data/lib/ppc/api/baidu/rank.rb +23 -0
  16. data/lib/ppc/api/baidu/report.rb +100 -81
  17. data/lib/ppc/api/qihu.rb +150 -0
  18. data/lib/ppc/api/qihu/account.rb +86 -0
  19. data/lib/ppc/api/qihu/bulk.rb +35 -0
  20. data/lib/ppc/api/qihu/creative.rb +108 -0
  21. data/lib/ppc/api/qihu/group.rb +96 -0
  22. data/lib/ppc/api/qihu/keyword.rb +113 -0
  23. data/lib/ppc/api/qihu/plan.rb +64 -0
  24. data/lib/ppc/api/qihu/rank.rb +25 -0
  25. data/lib/ppc/api/qihu/report.rb +159 -0
  26. data/lib/ppc/api/qihu/sublink.rb +71 -0
  27. data/lib/ppc/api/shenma.rb +64 -0
  28. data/lib/ppc/api/shenma/report.rb +135 -0
  29. data/lib/ppc/api/sm.rb +50 -0
  30. data/lib/ppc/api/sm/account.rb +44 -0
  31. data/lib/ppc/api/sm/bulk.rb +69 -0
  32. data/lib/ppc/api/sm/creative.rb +86 -0
  33. data/lib/ppc/api/sm/group.rb +94 -0
  34. data/lib/ppc/api/sm/keyword.rb +132 -0
  35. data/lib/ppc/api/sm/phone_new_creative.rb +51 -0
  36. data/lib/ppc/api/sm/plan.rb +63 -0
  37. data/lib/ppc/api/sm/report.rb +136 -0
  38. data/lib/ppc/api/sogou.rb +118 -0
  39. data/lib/ppc/api/sogou/account.rb +42 -0
  40. data/lib/ppc/api/sogou/bulk.rb +69 -0
  41. data/lib/ppc/api/sogou/creative.rb +117 -0
  42. data/lib/ppc/api/sogou/group.rb +123 -0
  43. data/lib/ppc/api/sogou/keyword.rb +188 -0
  44. data/lib/ppc/api/sogou/plan.rb +66 -0
  45. data/lib/ppc/api/sogou/report.rb +129 -0
  46. data/lib/ppc/ext.rb +17 -0
  47. data/lib/ppc/operation.rb +50 -36
  48. data/lib/ppc/operation/account.rb +19 -7
  49. data/lib/ppc/operation/creative.rb +7 -7
  50. data/lib/ppc/operation/group.rb +2 -2
  51. data/lib/ppc/operation/keyword.rb +11 -8
  52. data/lib/ppc/operation/report.rb +23 -0
  53. data/ppc.gemspec +14 -4
  54. data/spec/baidu/api_baidu_account_spec.rb +16 -0
  55. data/spec/baidu/api_baidu_creative_spec.rb +73 -0
  56. data/spec/{api_baidu_group_spec.rb → baidu/api_baidu_group_spec.rb} +12 -17
  57. data/spec/baidu/api_baidu_keyword_spec.rb +61 -0
  58. data/spec/baidu/api_baidu_phone_spec.rb +22 -0
  59. data/spec/{api_baidu_plan_spec.rb → baidu/api_baidu_plan_spec.rb} +11 -10
  60. data/spec/baidu/api_baidu_report_spec.rb +44 -0
  61. data/spec/{api_baidu_spec.rb → baidu/api_baidu_spec.rb} +10 -15
  62. data/spec/operation/operation_baidu_report_spec.rb +17 -0
  63. data/spec/operation/operation_baidu_spec.rb +126 -0
  64. data/spec/operation/operation_qihu_report_spec.rb +18 -0
  65. data/spec/operation/operation_qihu_spec.rb +94 -0
  66. data/spec/operation/operation_sm_report_spec.rb +21 -0
  67. data/spec/operation/operation_sogou_report_spec.rb +17 -0
  68. data/spec/operation/operation_sogou_spec.rb +88 -0
  69. data/spec/{operation_spec_helper.rb → operation/operation_spec_helper.rb} +3 -5
  70. data/spec/qihu/api_qihu_account_spec.rb +29 -0
  71. data/spec/qihu/api_qihu_creative_spec.rb +48 -0
  72. data/spec/qihu/api_qihu_group_spec.rb +40 -0
  73. data/spec/qihu/api_qihu_keyword_spec.rb +50 -0
  74. data/spec/qihu/api_qihu_plan_spec.rb +39 -0
  75. data/spec/qihu/api_qihu_report_spec.rb +54 -0
  76. data/spec/qihu/api_qihu_sublink_spec.rb +36 -0
  77. data/spec/sm/api_sm_account_spec.rb +8 -0
  78. data/spec/sm/api_sm_creative_spec.rb +52 -0
  79. data/spec/sm/api_sm_group_spec.rb +75 -0
  80. data/spec/sm/api_sm_keyword_spec.rb +59 -0
  81. data/spec/sm/api_sm_plan_spec.rb +39 -0
  82. data/spec/sm/api_sm_report_spec.rb +30 -0
  83. data/spec/sogou/api_sogou_account_spec.rb +17 -0
  84. data/spec/sogou/api_sogou_creative_spec.rb +51 -0
  85. data/spec/sogou/api_sogou_group_spec.rb +50 -0
  86. data/spec/sogou/api_sogou_keyword_spec.rb +54 -0
  87. data/spec/sogou/api_sogou_plan_spec.rb +43 -0
  88. data/spec/sogou/api_sogou_report_spec.rb +51 -0
  89. data/spec/spec_helper.rb +49 -10
  90. metadata +140 -46
  91. data/lib/ppc/baidu.rb +0 -152
  92. data/lib/ppc/baidu/account.rb +0 -88
  93. data/lib/ppc/baidu/bulk.rb +0 -52
  94. data/lib/ppc/baidu/group.rb +0 -99
  95. data/lib/ppc/baidu/key.rb +0 -38
  96. data/lib/ppc/baidu/plan.rb +0 -85
  97. data/lib/ppc/baidu/report.rb +0 -82
  98. data/spec/api_baidu_account_spec.rb +0 -18
  99. data/spec/api_baidu_creative_spec.rb +0 -71
  100. data/spec/api_baidu_keyword_spec.rb +0 -64
  101. data/spec/api_baidu_report_spec.rb +0 -32
  102. data/spec/baidu_account_spec.rb +0 -32
  103. data/spec/baidu_bulk_spec.rb +0 -21
  104. data/spec/baidu_group_spec.rb +0 -56
  105. data/spec/baidu_plan_spec.rb +0 -129
  106. data/spec/baidu_report_spec.rb +0 -24
  107. data/spec/operation_spec.rb +0 -87
data/lib/ppc/baidu.rb DELETED
@@ -1,152 +0,0 @@
1
- require 'ppc/baidu/account'
2
- require 'ppc/baidu/plan'
3
- require 'ppc/baidu/bulk'
4
- require 'ppc/baidu/group'
5
- require 'ppc/baidu/key'
6
- require 'ppc/baidu/report'
7
- require 'awesome_print'
8
- require 'net/http'
9
- require 'net/https'
10
- require 'json'
11
- # require 'savon'
12
- module PPC
13
- class Baidu
14
- include ::PPC
15
-
16
- def initialize(params = {})
17
- @service = params[:service] + 'Service'
18
- @username = params[:username]
19
- @password = params[:password]
20
- @token = params[:token]
21
- @debug = params[:debug] || false
22
- end
23
-
24
-
25
- def request(method,params = {}, with_header = false)
26
- uri = URI("https://api.baidu.com/json/sms/v3/#{@service}/#{method}")
27
- http_body = {
28
- header: request_header,
29
- body: params
30
- }.to_json
31
-
32
- http_header = {
33
- 'Content-Type' => 'application/json; charset=UTF-8'
34
- }
35
-
36
- http = Net::HTTP.new(uri.host, 443)
37
- http.set_debug_output $stderr
38
- http.use_ssl = true
39
-
40
- response = http.post(uri.path, http_body, http_header)
41
- response = (JSON.parse response.body)
42
- # if not needed, only return body
43
- return response['body'] unless with_header else response
44
- end
45
-
46
- def operations
47
- end
48
-
49
- protected
50
- def download(params = {})
51
- bulk = ::PPC::Baidu::Bulk.new({
52
- username: @username,
53
- password: @password,
54
- token: @token,
55
- debug: @debug
56
- })
57
-
58
- params[:extended] = params[:extended] || 2
59
-
60
- begin
61
- file_id = bulk.file_id_of_all(params)
62
- puts "file_id: #{file_id}" if @debug
63
-
64
- loop do
65
- state = bulk.state(file_id)
66
- raise "invalid file state: #{state}" unless %w(1 2 3 null).include? state
67
- break if state == '3'
68
- puts "waiting for #{file_id} to be ready. current state:#{state}" if @debug
69
- sleep 3
70
- end
71
- puts "#{file_id} is ready" if @debug
72
- return bulk.path(file_id)
73
- rescue
74
- # @header = bulk.header
75
- # @oprs = bulk.oprs
76
- # @oprtime = bulk.oprtime
77
- # @quota = bulk.quota
78
- # @rquota = bulk.rquota
79
- # @status = bulk.status
80
-
81
- # @desc = bulk.desc
82
-
83
- # case @desc
84
- # when 'success'
85
- # when 'failure'
86
- # @code = bulk.code
87
- # @message = bulk.message
88
- # when 'system failure'
89
- # @code = bulk.code
90
- # @message = bulk.message
91
- # else
92
- # raise "unknown desc from baidu: #{@desc}"
93
- # end
94
- raise BulkException.new(file_id,bulk)
95
- end
96
-
97
- return false
98
- end
99
-
100
- private
101
-
102
-
103
- def request_header
104
- {
105
- username: @username,
106
- password: @password,
107
- token: @token
108
- }
109
- end
110
-
111
- def example(operation,with_header=false)
112
- operation = make_operation(operation)
113
- if with_header
114
- {
115
- example_header: operation.example_header,
116
- example_body: operation.example_body
117
- }
118
- else
119
- operation.example_body
120
- end
121
- end
122
-
123
- def process_response(response)
124
- body = response[:envelope]
125
- print_debug(body,'response.envelope') if @debug
126
- @header = body[:header]
127
- res_header = header[:res_header]
128
-
129
- @oprs = res_header[:oprs]
130
- @oprtime = res_header[:oprtime]
131
- @quota = res_header[:quota]
132
- @rquota = res_header[:rquota]
133
- @status = res_header[:status]
134
-
135
- @desc = res_header[:desc]
136
- case @desc
137
- when 'success'
138
- when 'failure'
139
- failures = res_header[:failures]
140
- @code = failures[:code]
141
- @message = failures[:message]
142
- when 'system failure'
143
- failures = res_header[:failures]
144
- @code = failures[:code]
145
- @message = failures[:message]
146
- else
147
- raise "unknown desc from baidu: #{@desc}"
148
- end
149
- end
150
-
151
- end
152
- end
@@ -1,88 +0,0 @@
1
- module PPC
2
- class Baidu
3
- class Account < ::PPC::Baidu
4
- def initialize(params = {})
5
- params[:service] = 'Account'
6
- super(params)
7
- end
8
-
9
- def info
10
- response = request('getAccountInfo')["accountInfoType"]
11
- end
12
-
13
- def all(params = {})
14
- download(params)
15
- end
16
-
17
- def update( params = {} )
18
- """
19
- update account info
20
- @ params : account_info_type
21
- @return : account info_type
22
- """
23
- info = {
24
- accountInfoType: {
25
- budgetType: params[:budget_type] ,
26
- budget: params[:budget],
27
- regionTarget: params[:region],
28
- excludeIp: params[:excludeip] ,
29
- isDynamicCreative: params[:isdynamic],
30
- dynamicCreativeParam: params[:creativeparam]
31
- }
32
- }
33
- # delete null symbol
34
- info[:accountInfoType].each{
35
- |pair|
36
- key, value = pair
37
- info[:accountInfoType].delete(key) if value == nil
38
- }
39
-
40
- request('updateAccountInfo', info)["accountInfoType"]
41
- end
42
-
43
- def query_report(params = {})
44
- report = ::PPC::Baidu::Report.new({username: @username, password: @password, token: @token, debug: @debug})
45
-
46
- begin
47
- @file_id = report.file_id_of_query(params)
48
- print_debug(@file_id,'file_id') if @debug
49
-
50
- loop do
51
- state = report.state(@file_id)
52
- raise "invalid file state: #{state}" unless %w(1 2 3 null).include? state
53
- break if state == '3'
54
- print_debug(state,'file_id.state') if @debug
55
- sleep 3
56
- end
57
-
58
- url = report.path(@file_id)
59
- open(url).read.force_encoding('gb18030').encode('utf-8')
60
- rescue Exception => e
61
- raise ReportException.new(@file_id,report,e)
62
- end
63
- end
64
-
65
- def cost_report(params = {})
66
- report = ::PPC::Baidu::Report.new({username: @username, password: @password, token: @token, debug: @debug})
67
- begin
68
- @file_id = report.file_id_of_cost(params)
69
- print_debug(@file_id,'file_id') if @debug
70
-
71
- loop do
72
- state = report.state(@file_id)
73
- raise "invalid file state: #{state}" unless %w(1 2 3 null).include? state
74
- break if state == '3'
75
- print_debug(state,'file_id.state') if @debug
76
- sleep 3
77
- end
78
-
79
- url = report.path(@file_id)
80
- open(url).read.force_encoding('gb18030').encode('utf-8')
81
- rescue Exception => e
82
- raise ReportException.new(@file_id,report,e)
83
- end
84
- end
85
-
86
- end
87
- end
88
- end
@@ -1,52 +0,0 @@
1
- module PPC
2
- class Baidu
3
- class BulkException < Exception
4
- attr_reader :file_id,:bulk,:exception
5
- def initialize(file_id,bulk,exception)
6
- @file_id = file_id
7
- @bulk = bulk
8
- @exception = exception
9
- end
10
- end
11
-
12
- class Bulk < ::PPC::Baidu
13
- def initialize(params = {})
14
- params[:service] = 'BulkJob'
15
- super(params)
16
- end
17
-
18
- def file_id_of_all(params = {})
19
- plan_ids = params[:plan_ids]
20
-
21
- unless plan_ids.nil?
22
- plan_ids = plan_ids.class == Array ? plan_ids : [plan_ids]
23
- end
24
-
25
- options = {
26
- campaignIds: plan_ids || [] ,
27
- includeQuality: params[:quality] || true ,
28
- includeTemp: params[:temp] || false ,
29
- format: params[:format] || 1 ,
30
- newCreativeFiles: params[:adcopy] || 0 ,
31
- includeTempNewCreatives: params[:temp_adcopy] || 0 ,
32
- includePhraseType: params[:phrase] || 0 ,
33
- extended: params[:extended] || 0
34
- }
35
- response = request('getAllObjects',options)
36
-
37
- body = response[:envelope][:body]
38
- raise "no result" if body.nil?
39
- body[:get_all_objects_response][:file_id]
40
- end
41
-
42
- def state(id)
43
- raise "empty id" if id.nil? or id.empty?
44
- request('getFileState',{fileId:id})[:envelope][:body][:get_file_state_response][:is_generated]
45
- end
46
-
47
- def path(id)
48
- request('getFilePath',{fileId:id})[:envelope][:body][:get_file_path_response][:file_paths]
49
- end
50
- end
51
- end
52
- end
@@ -1,99 +0,0 @@
1
- module PPC
2
- class Baidu
3
- class Group < ::PPC::Baidu
4
- def initialize(params = {})
5
- params[:service] = 'Adgroup'
6
- super(params)
7
- end
8
-
9
- def all()
10
- """
11
- @return : Array of campaignAdgroupIds
12
- """
13
- request( "getAllAdgroupId" )["campaignAdgroupIds"]
14
- end
15
-
16
- def add( params={}, test = false)
17
- """
18
- @ input : one or list of AdgroupType
19
- @ output : list of AdgroupType
20
- """
21
- params = [ params ] unless params.class == Array
22
- adgroupType = []
23
-
24
- params.each{ | group_i |
25
- adgroupType << make_adgrouptype( group_i )
26
- }
27
-
28
- body = {adgroupTypes: adgroupType}
29
- response = request( "addAdgroup", body, test )
30
- return response['adgroupTypes'] unless test else response
31
- end
32
-
33
- def update( params={}, test = false )
34
- """
35
- @ input : one or list of AdgroupType
36
- @ output : list of AdgroupType
37
- """
38
- params = [ params ] unless params.class == Array
39
- adgroupType = []
40
-
41
- params.each{ | group_i |
42
- adgroupType << make_adgrouptype( group_i )
43
- }
44
-
45
- body = {adgroupTypes: adgroupType}
46
- responses = request( "updateAdgroup", body, test )
47
- return responses['adgroupTypes'] unless test else responses
48
- end
49
-
50
- def delete( ids )
51
- # delete responses have no content therefore we
52
- #return header.desc to judge whether operation success
53
- ids = [ ids ] unless ids.class == Array
54
-
55
- body = { adgroupIds: ids }
56
- request( "deleteAdgroup", body, true )[ 'header' ][ 'desc' ]
57
- end
58
-
59
- def search_by_planid( ids, test = false )
60
- ids = [ ids ] unless ids.class == Array
61
- body = { campaignIds: ids }
62
- responses = request("getAdgroupByCampaignId", body, test )
63
- return responses["campaignAdgroups"] unless test else responses
64
- end
65
-
66
- def search_by_groupid( ids, test = false )
67
- ids = [ ids ] unless ids.class == Array
68
- body = { adgroupIds: ids }
69
- responses = request("getAdgroupByAdgroupId",body, test )
70
- return responses["adgroupTypes"] unless test else responses
71
- end
72
-
73
- private
74
- def make_adgrouptype( params={} )
75
- adgrouptype = {
76
- campaignId: params[:plan_id],
77
- adgroupId: params[:group_id],
78
- adgroupName: params[:name],
79
- maxPrice: params[:maxprice],
80
- negativeWords: params[:negative],
81
- exactNegativeWords: params[:exact_negative],
82
- pause: params[:pause],
83
- status: params[:status],
84
- reserved: params[:reserved]
85
- }
86
- # delete empty node
87
- adgrouptype.each{
88
- |pair|
89
- key, value = pair
90
- adgrouptype.delete(key) if value == nil
91
- }
92
- # delete invalid note according to request type
93
- # unimplemented
94
- return adgrouptype
95
- end #make_adgrouptype
96
-
97
- end # class group
98
- end # class baidu
99
- end # module
data/lib/ppc/baidu/key.rb DELETED
@@ -1,38 +0,0 @@
1
- module PPC
2
- class Baidu
3
- class Key < ::PPC::Baidu
4
- def initialize(params = {})
5
- params[:service] = 'Keyword'
6
- @se_id = params[:se_id]
7
- super(params)
8
- end
9
-
10
- def add()
11
- end
12
-
13
- def update()
14
- end
15
-
16
- def delete()
17
- end
18
-
19
- def active()
20
- end
21
-
22
- def search_by_groupid( ids, return_id = false )
23
- end
24
-
25
- def search_by_keywordid( ids )
26
- end
27
-
28
- def get_status()
29
- end
30
-
31
- def get_quality()
32
- end
33
-
34
- def get_10quality()
35
- end
36
- end
37
- end
38
- end
@@ -1,85 +0,0 @@
1
- module PPC
2
- class Baidu
3
- class Plan < ::PPC::Baidu
4
- def initialize(params = {})
5
- params[:service] = 'Campaign'
6
- @se_id = params[:se_id]
7
- super(params)
8
- end
9
-
10
- def all(params = {})
11
- params[:plan_ids] = [@se_id]
12
- download(params)
13
- end
14
-
15
- def ids
16
- request('getAllCampaignId')['campaignIds']
17
- end
18
-
19
- #add one or more plans
20
- def add(plans)
21
- if plans.class == Hash
22
- plans = [plans]
23
- single = true
24
- end
25
- campaignTypes = []
26
-
27
- plans.each do |plan|
28
- campaignTypes << {
29
- campaignName: plan[:name],
30
- negativeWords: plan[:negative],
31
- exactNegativeWords: plan[:exact_negative]
32
- }
33
- end
34
-
35
- options = {campaignTypes: campaignTypes}
36
- response = request('addCampaign',options)['campaignTypes']
37
- if single
38
- response.first
39
- else
40
- response
41
- end
42
- end
43
-
44
- def get(ids)
45
- if ids.class != Array
46
- ids = [ids]
47
- single = true
48
- end
49
-
50
- options = {campaignIds: ids}
51
- response = request('getCampaignByCampaignId',options)['campaignTypes']
52
-
53
- if single
54
- response.first
55
- else
56
- response
57
- end
58
- end
59
-
60
- # @todo needs testing
61
- def updates(params)
62
- params['campaignId'] = @se_id
63
- options = {campaignTypes: [params]}
64
- request('updateCampaign',options)['campaignTypes']
65
- end
66
-
67
- def update_by_id(id,params = {})
68
- params['campaignId'] = id
69
- options = {campaignTypes: [params]}
70
- request('updateCampaign',options)['campaignTypes']
71
- end
72
-
73
- def update(plans)
74
- options = {campaignTypes: plans}
75
- request('updateCampaign',options)['campaignTypes']
76
- end
77
-
78
- def delete(ids)
79
- ids = [ids] unless ids.class == Array
80
- options = {campaignIds: ids}
81
- request('deleteCampaign',options)['result'] == 1
82
- end
83
- end
84
- end
85
- end