class Shiny
Public Class Methods
new(api_key, api_secret_key, api_host='https://shiny.kotori.moe')
click to toggle source
# File lib/shiny-sdk.rb, line 15 def initialize(api_key, api_secret_key, api_host='https://shiny.kotori.moe') @API_KEY = api_key.freeze @API_SECRET_KEY = api_secret_key.freeze @API_HOST = api_host.freeze end
Public Instance Methods
add(spider_name, level, data=nil, hash=false, channel: nil)
click to toggle source
添加数据项
# File lib/shiny-sdk.rb, line 42 def add(spider_name, level, data=nil, hash=false, channel: nil) if data.nil? data = {} end url = @API_HOST + '/Data/add' payload = {'api_key' => @API_KEY} event = {"level": level.to_i, "spiderName": spider_name} # 如果没有手动指定Hash,将会把data做一次md5生成hash begin if hash event['hash'] = hash else event['hash'] = md5(data.to_json) end rescue raise ShinyError.new('Fail to generate hash.') end event['data'] = data event['channel'] = channel unless channel.nil? payload['sign'] = sha1(@API_KEY + @API_SECRET_KEY + event.to_json) payload["event"] = event.to_json response = Net::HTTP.post_form(URI.parse(url), payload) if response.code != '200' begin error = JSON.parse(response.body) rescue raise ShinyError.new("Network error: #{response.code}") end raise ShinyError.new("Shiny error: #{error['error']['info']} code=#{error['error']['code']}") else JSON.parse(response.body) end end
add_many(events)
click to toggle source
添加多个事件
# File lib/shiny-sdk.rb, line 87 def add_many(events) payload = {} url = @API_HOST + "/Data/add" events.each do |event| if event[:hash].nil? if event[:data].nil? if event[:data][:hash] event[:hash] = event[:data][:hash] event[:data].delete(:hash) else event[:hash] = md5(Hash[event[:data]].sort.to_json) end else raise ShinyError.new("Missing parameters.") end event[:level] = event[:level].to_i end end payload[:event] = events.to_json payload_sign = sign(payload) payload[:sign] = payload_sign payload[:api_key] = @API_KEY response = Net::HTTP.post_form(URI.parse(url), payload) if response.code != '200' begin error = JSON.parse(response.body) rescue raise ShinyError.new("Network error: #{response.code}") end raise ShinyError.new("Shiny error: #{error['error']['info']} code=#{error['error']['code']}") else JSON.parse(response.body) end end
get_jobs()
click to toggle source
# File lib/shiny-sdk.rb, line 142 def get_jobs url = @API_HOST + "/Job/query?api_key=#{@API_KEY}&sign=#{sign}" response = http.start {|http| http.request Net::HTTP::Get.new(uri.request_uri) } if response.code != '200' raise ShinyError.new("Network error: #{response.code}") else return JSON.parse(response.body) end end
md5(text)
click to toggle source
计算md5
# File lib/shiny-sdk.rb, line 32 def md5(text) Digest::MD5.hexdigest(text) end
recent(page=1)
click to toggle source
获取最新项目
# File lib/shiny-sdk.rb, line 127 def recent(page=1) url = @API_HOST + "/Data/recent?page=#{page}" uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true if uri.scheme == 'https' response = http.start {|http| http.request Net::HTTP::Get.new(uri.request_uri) } if response.code != '200' raise ShinyError.new("Network error: #{response.code}") else return JSON.parse(response.body) end end
report(job_id, status)
click to toggle source
# File lib/shiny-sdk.rb, line 154 def report(job_id, status) url = @API_HOST + "/Job/report" payload = { "jobId": job_id, "status": status } payload_sign = sign(payload) response = Net::HTTP.post_form(URI.parse(url), payload) if response.code != '200' begin error = JSON.parse(response.body) rescue raise ShinyError.new("Network error: #{response.code}") end raise ShinyError.new("Shiny error: #{error['error']['info']} code=#{error['error']['code']}") else JSON.parse(response.body) end end
sha1(text)
click to toggle source
计算sha1
# File lib/shiny-sdk.rb, line 37 def sha1(text) Digest::SHA1.hexdigest(text) end
sign(payload={})
click to toggle source
API 请求签名
# File lib/shiny-sdk.rb, line 22 def sign(payload={}) data = @API_KEY + @API_SECRET_KEY Hash[payload.sort].keys.each do |key| data += payload[key].to_s end data end