forked from Trustie/forgeplus
165 lines
5.2 KiB
Ruby
165 lines
5.2 KiB
Ruby
class DunCheck::TextCheck
|
||
|
||
# include DunCheck::PublicParams
|
||
#text_params = {
|
||
# content: "ccc", #内容
|
||
# ip: "xxx", #用户ip
|
||
# account: "xxx", #登录login
|
||
# nickname: "xxx", #用户姓名
|
||
# title: "xxx", #帖子的标题
|
||
# }
|
||
|
||
#检测结果,0:通过,1:嫌疑,2:不通过
|
||
# include ActionView::Helpers::LoopTextsHelper
|
||
|
||
require 'uri'
|
||
require 'net/http'
|
||
|
||
def initialize(text_params)
|
||
@text_params = text_params
|
||
end
|
||
|
||
def call
|
||
new_text_params = @text_params
|
||
text_long_array = []
|
||
check_content = new_text_params[:content]
|
||
format_text(check_content,text_long_array)
|
||
(1..text_long_array.size).each do |i|
|
||
new_text_params.merge!(content: text_long_array[i-1])
|
||
check_result = check_text(new_text_params)
|
||
if check_result[:status].to_i == -1
|
||
return check_result
|
||
break
|
||
else
|
||
if i == text_long_array.size
|
||
return check_result
|
||
else
|
||
next
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
def check_text(text_params)
|
||
begin
|
||
dun_params = check_dun_params(text_params)
|
||
|
||
# api_url = Redmine::Configuration['dun']['text_api']
|
||
api_url = EduSetting.get("dun_text_api")
|
||
uri = URI.parse(api_url)
|
||
|
||
http = Net::HTTP.new(uri.hostname, uri.port)
|
||
if api_url.include?("https://")
|
||
http.use_ssl = true
|
||
end
|
||
dun_params_str = URI.encode_www_form(dun_params)
|
||
header = {'content-type':'application/x-www-form-urlencoded'}
|
||
response = http.post(uri.path, dun_params_str, header)
|
||
response_body = eval(response.body)
|
||
Rails.logger.info("======response========#{response_body}")
|
||
|
||
if response_body[:code].to_i == 200
|
||
response_body_result = response_body[:result]
|
||
response_body_labels = response_body_result[:labels].present? ? response_body_result[:labels][0] : []
|
||
extra_params = {
|
||
action: response_body_result[:action],
|
||
taskId: response_body_result[:taskId],
|
||
infos: response_body_labels.present? ? sub_lables[:"#{response_body_labels[:subLabels][0][:subLabel]}"] : ""
|
||
}
|
||
render_status = response_body_result[:action].to_i == 0 ? 1 : -1
|
||
tip_status(render_status, response_body[:msg], extra_params)
|
||
else
|
||
tip_status(-1, response_body[:msg])
|
||
end
|
||
rescue Exception => ex
|
||
Rails.logger.info "*** transaction abored!"
|
||
Rails.logger.info "*** errors: #{ex.message}"
|
||
tip_status(-1, "检测失败")
|
||
end
|
||
|
||
end
|
||
|
||
private
|
||
|
||
def check_dun_params(text_params)
|
||
dun_public_params = DunCheck::PublicParams.new("text")
|
||
rand_data_id = random_dataId
|
||
check_params = {
|
||
dataId: rand_data_id,
|
||
version: "v3.1",
|
||
callback: rand_data_id
|
||
}.merge(text_params)
|
||
|
||
check_params.merge!(dun_public_params.call)
|
||
dun_params = dun_public_params.generate_sign(check_params)
|
||
return dun_params
|
||
end
|
||
|
||
def format_text(text_long, text_long_array)
|
||
slice_content = text_long.slice(0..4998)
|
||
last_slice_content = text_long.slice(4999..-1)
|
||
text_long_array.push(slice_content)
|
||
if last_slice_content.present?
|
||
if last_slice_content.length > 4999
|
||
format_text(last_slice_content, text_long_array)
|
||
else
|
||
text_long_array.push(last_slice_content)
|
||
end
|
||
end
|
||
end
|
||
|
||
def random_dataId
|
||
Digest::MD5.hexdigest(rand(100000000).to_s)
|
||
end
|
||
|
||
def check_labels
|
||
# 100:色情,200:广告,260:广告法,300:暴恐,400:违禁,500:涉政,600:谩骂,700:灌水
|
||
%w(100 200 260 300 400 500 600 700).join(",")
|
||
end
|
||
|
||
def tip_status(status, message, msg_params={})
|
||
return {status: status, message: message, extra_params: msg_params}
|
||
end
|
||
|
||
def sub_lables
|
||
{
|
||
"100001": "色情其他",
|
||
"100002": "色情传播",
|
||
"100003": "色情性器官",
|
||
"100004": "色情挑逗",
|
||
"100005": "色情低俗段子",
|
||
"100006": "色情性行为",
|
||
"100007": "色情舆情事件",
|
||
"100008": "色情交友类",
|
||
"200009": "商业推广",
|
||
"200010": "广告法",
|
||
"200011": "刷量行为",
|
||
"200012": "广告其他",
|
||
"260052": "广告法-涉医疗用语(非药品禁止宣传药效)",
|
||
"260053": "广告法-迷信用语",
|
||
"260054": "广告法-需要凭证(可以写但需要凭证证明)",
|
||
"260055": "广告法-限时性用语(可以写但必须有具体时间)",
|
||
"260056": "广告法-涉嫌诱导消费者",
|
||
"260057": "广告法-涉嫌欺诈消费者",
|
||
"260058": "广告法-法律风险较高",
|
||
"260059": "广告法-极限词(用语绝对化)",
|
||
"300016": "暴恐其他",
|
||
"400017": "违禁其他",
|
||
"400021": "违禁网监要求",
|
||
"500013": "涉政其他",
|
||
"500014": "敏感专项",
|
||
"500015": "严格涉政",
|
||
"500039": "时事报道",
|
||
"500040": "领导人相关",
|
||
"500041": "英雄烈士相关",
|
||
"500042": "邪教迷信",
|
||
"500043": "落马官员相关",
|
||
"500044": "热点舆情",
|
||
"500045": "涉政综合",
|
||
"600018": "谩骂其他",
|
||
"700019": "灌水其他",
|
||
"900020": "其他",
|
||
}
|
||
end
|
||
end
|