censor_bear 0.1.13 → 0.1.14
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.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/censor_bear/home.css +4 -0
- data/app/controllers/censor_bear/home_controller.rb +31 -0
- data/app/controllers/censor_bear/logs_controller.rb +1 -0
- data/app/helpers/censor_bear/home_helper.rb +4 -0
- data/app/models/censor_bear/log.rb +18 -0
- data/app/models/censor_bear/stop_word.rb +2 -2
- data/app/views/censor_bear/home/debug.turbo_stream.haml +8 -0
- data/app/views/censor_bear/home/debugger.html.haml +9 -0
- data/app/views/censor_bear/home/index.html.erb +2 -0
- data/app/views/censor_bear/logs/_log.html.haml +7 -1
- data/app/views/censor_bear/logs/index.html.haml +1 -0
- data/app/views/censor_bear/logs/show.html.haml +29 -0
- data/app/views/layouts/censor_bear/application.html.haml +1 -0
- data/config/routes.rb +5 -1
- data/db/migrate/20211209093050_add_response_to_censor_bear_logs.rb +5 -0
- data/lib/censor_bear/censor.rb +21 -7
- data/lib/censor_bear/version.rb +1 -1
- data/lib/censor_bear.rb +2 -0
- metadata +9 -2
- data/app/views/censor_bear/logs/show.html.erb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8f5e80bfe3be4dc22e9c8fc14932f6c830a87efc0ee15d5588bd258f0311e0e
|
4
|
+
data.tar.gz: bc47827fb4f09f2cd875d20db1c4593168917709b0174d0780237c503c156e5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc58e6353da8c5697b92f2c4857a7dcaa948a6e03c367d14aed8960b015c0809cc33094628efc1983f07865f270ae646bbf05c942dda7a58b425db54f3434f00
|
7
|
+
data.tar.gz: d080b530b575ece289451d58079a40e3a85ad0f7721e8707cac299d141ea066047f5b36c13a9a5a7a133edf0e70707d28b85ea622ea4fe20f5309cc5be132462
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_dependency 'censor_bear/application_controller'
|
2
|
+
|
3
|
+
module CensorBear
|
4
|
+
class HomeController < ApplicationController
|
5
|
+
def index; end
|
6
|
+
|
7
|
+
def debugger; end
|
8
|
+
|
9
|
+
def debug
|
10
|
+
content = params[:content]
|
11
|
+
type = params[:type]
|
12
|
+
|
13
|
+
case params[:stage]
|
14
|
+
when 'aliyun_check'
|
15
|
+
@r = AliyunGreen::Text.scan(content)
|
16
|
+
when 'check_text'
|
17
|
+
@r = CensorBear.check_text(content, type.to_sym)
|
18
|
+
when 'check_search'
|
19
|
+
# TODO: 搜索前置检查
|
20
|
+
@r = {}
|
21
|
+
when 'check_image'
|
22
|
+
# TODO: 检查图片
|
23
|
+
@r = {}
|
24
|
+
when 'qq_regex'
|
25
|
+
@r = content.match(Censor::QQ_REG)
|
26
|
+
when 'wx_regex'
|
27
|
+
@r = content.match(Censor::WX_REG)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -55,6 +55,7 @@ module CensorBear
|
|
55
55
|
def load_logs
|
56
56
|
builder ||= log_scope
|
57
57
|
builder = builder.where("original_content ilike ?", "%#{params[:q]}%") if params[:q].present?
|
58
|
+
builder = builder.where(stage: params[:stage]) if params[:stage].present?
|
58
59
|
builder = builder.order(id: :desc)
|
59
60
|
|
60
61
|
@pagy, @logs = pagy(builder)
|
@@ -1,5 +1,23 @@
|
|
1
1
|
module CensorBear
|
2
2
|
class Log < ApplicationRecord
|
3
3
|
belongs_to :user, class_name: CensorBear.config.user_class, optional: true
|
4
|
+
|
5
|
+
def suggestion
|
6
|
+
return nil if response.blank?
|
7
|
+
|
8
|
+
response['data']&.first['results']&.first['suggestion']
|
9
|
+
end
|
10
|
+
|
11
|
+
def rate
|
12
|
+
return nil if response.blank?
|
13
|
+
|
14
|
+
response['data']&.first['results']&.first['rate']
|
15
|
+
end
|
16
|
+
|
17
|
+
def label
|
18
|
+
return nil if response.blank?
|
19
|
+
|
20
|
+
response['data']&.first['results']&.first['label']
|
21
|
+
end
|
4
22
|
end
|
5
23
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module CensorBear
|
2
2
|
class StopWord < ApplicationRecord
|
3
|
-
FIELDS = %w(ugc username nickname signature dialog)
|
4
|
-
ACTIONS_MAP = %w(ignore mod banned replace)
|
3
|
+
FIELDS = %w(ugc username nickname signature dialog).freeze
|
4
|
+
ACTIONS_MAP = %w(ignore mod banned replace).freeze
|
5
5
|
belongs_to :user, class_name: CensorBear.config.user_class
|
6
6
|
end
|
7
7
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
= turbo_stream.update(:result) do
|
2
|
+
%h3{class: "text-lg"} 检测结果
|
3
|
+
%div{class: "bg-yellow-100 text-yellow-700 p-4 rounded-lg"}
|
4
|
+
%pre{class: "whitespace-pre-wrap"}
|
5
|
+
- if @r.is_a?(MatchData)
|
6
|
+
= @r.pretty_inspect
|
7
|
+
- else
|
8
|
+
= JSON.pretty_generate(@r.is_a?(CensorBear::Result) ? JSON.parse(@r.to_json) : @r)
|
@@ -0,0 +1,9 @@
|
|
1
|
+
%div{class: "flex flex-col space-y-2 rounded-lg border p-4"}
|
2
|
+
%h2{class: "text-xl font-medium text-center"} 在线调试
|
3
|
+
%div{class: "flex justify-center"}
|
4
|
+
= form_with(url: debug_path, method: :post, class: "flex flex-col items-center w-full space-y-4") do |f|
|
5
|
+
= f.select :stage, options_for_select([%w[check_text check_text], %w[check_search check_search], %w[check_search check_search], %w[qq_regex qq_regex], %w[wx_regex wx_regex]], params[:stage]), {}, class: "border rounded-md m py-0.5 px-1"
|
6
|
+
= f.select :type, options_for_select(CensorBear::StopWord::FIELDS.map{|f| [f.upcase, f]}, params[:type]), {}, class: "border rounded-md m py-0.5 px-1"
|
7
|
+
= f.text_area :content, value: params[:content], placeholder: "输入正文", rows: 6, class: "bg-gray-100 rounded-lg p-4 w-full"
|
8
|
+
= f.submit "检测", class: "rounded-lg px-10 py-1 bg-black text-white cursor-pointer"
|
9
|
+
#result
|
@@ -9,6 +9,12 @@
|
|
9
9
|
%span{class: "text-sm bg-pink-100 text-pink-600 py-1 px-2 rounded-lg"}=t("censor_log.stage.#{log.stage}")
|
10
10
|
- unless log.action.blank?
|
11
11
|
%span{class: "text-sm bg-yellow-100 text-yellow-600 py-1 px-2 rounded-lg"}=t("censor_log.action.#{log.action.downcase}")
|
12
|
+
- unless log.suggestion.blank?
|
13
|
+
%span{class: "text-sm bg-green-100 text-green-600 py-1 px-2 rounded-lg"}=log.suggestion.upcase
|
14
|
+
- unless log.rate.blank?
|
15
|
+
%span{class: "text-sm bg-green-100 text-green-600 py-1 px-2 rounded-lg"}=log.rate
|
16
|
+
- unless log.label.blank?
|
17
|
+
%span{class: "text-sm bg-green-100 text-green-600 py-1 px-2 rounded-lg"}=log.label.upcase
|
12
18
|
- unless log.user_id.blank?
|
13
19
|
%span{class: "text-sm bg-gray-100 text-gray-600 py-1 px-2 rounded-lg font-bold"}="##{log.user_id}"
|
14
20
|
- unless log.ip.blank?
|
@@ -19,7 +25,7 @@
|
|
19
25
|
%span{class: "text-sm bg-gray-100 text-gray-600 py-1 px-2 rounded-lg"}= log.created_at
|
20
26
|
%div{class: "flex space-x-2 items-center"}
|
21
27
|
%span
|
22
|
-
= link_to '详情', log
|
28
|
+
= link_to '详情', log, data: { turbo: false }
|
23
29
|
%span
|
24
30
|
= button_to '删除', log, method: :delete, data: { confirm: 'Are you sure?' }, class: "text-red-600 rounded-md px-2 py-0.5"
|
25
31
|
%div{class: "flex justify-between items-center"}
|
@@ -4,6 +4,7 @@
|
|
4
4
|
= form_with(url: logs_path, method: :get, class: "flex items-center") do |f|
|
5
5
|
%div{class: "space-x-0.5"}
|
6
6
|
= f.text_field :q, value: params[:q], placeholder: "关键词", class: "border rounded-md m py-0.5 px-1"
|
7
|
+
= f.select :stage, options_for_select([%w[aliyun_check aliyun_check], %w[aliyun_check aliyun_check], %w[qq_regex qq_regex], %w[wx_regex wx_regex], %w[local_check local_check]], params[:stage]), {include_blank: "-- 按Stage筛选 --"}, class: "border rounded-md m py-0.5 px-1"
|
7
8
|
= f.submit "检索", class: "rounded-md px-2 py-1 text-sm bg-black text-white cursor-pointer"
|
8
9
|
= link_to "重置", logs_path, class: "text-sm"
|
9
10
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
%div{class: "flex flex-col space-y-2"}
|
2
|
+
%div
|
3
|
+
%div{class: "font-bold"} 源内容:
|
4
|
+
%div= @log.original_content
|
5
|
+
%div
|
6
|
+
%div{class: "font-bold"} 过滤后内容:
|
7
|
+
%div= @log.filtered_content
|
8
|
+
%div
|
9
|
+
%div{class: "font-bold"} 动作:
|
10
|
+
%div= @log.action
|
11
|
+
%div
|
12
|
+
%div{class: "font-bold"} 场景:
|
13
|
+
%div= @log.scenario
|
14
|
+
%div
|
15
|
+
%div{class: "font-bold"} 检测阶段:
|
16
|
+
%div= @log.stage
|
17
|
+
%div
|
18
|
+
%div{class: "font-bold"} 命中敏感词:
|
19
|
+
%div= @log.mod_words
|
20
|
+
%div
|
21
|
+
%div{class: "font-bold"} 云检测返回标签:
|
22
|
+
%div= @log.labels
|
23
|
+
%div
|
24
|
+
%div{class: "font-bold"} 云检测返回标签:
|
25
|
+
%div= @log.labels
|
26
|
+
%div
|
27
|
+
%div{class: "font-bold"} 云检测返回:
|
28
|
+
%div{class: "p-1 bg-gray-100 rounded-lg"}
|
29
|
+
%pre= JSON.pretty_generate(@log.response)
|
@@ -12,6 +12,7 @@
|
|
12
12
|
%li= link_to "审查(#{CensorBear::ModLog.pending.count})", mod_logs_path
|
13
13
|
%li= link_to "日志", logs_path
|
14
14
|
%li= link_to "敏感词", stop_words_path
|
15
|
+
%li= link_to "调试", debugger_path
|
15
16
|
%li= link_to "控制台", main_app.send(CensorBear.config.main_app_root_path_method.to_sym)
|
16
17
|
%li= current_user.email
|
17
18
|
%div
|
data/config/routes.rb
CHANGED
data/lib/censor_bear/censor.rb
CHANGED
@@ -117,30 +117,42 @@ module CensorBear
|
|
117
117
|
@labels = concat_labels(r['details'])
|
118
118
|
if action == 'block' && rate >= 70 && %w[politics terrorism].include?(r['label'])
|
119
119
|
CensorBear.info(
|
120
|
-
d['content'], @type,
|
120
|
+
d['content'], @type, 'banned', 'aliyun_check',
|
121
121
|
filtered_content: d['filteredContent'],
|
122
122
|
mod_words: @mod_words,
|
123
123
|
labels: @labels,
|
124
|
-
ip: @ip, user_id: @user_id
|
124
|
+
ip: @ip, user_id: @user_id,
|
125
|
+
response: response
|
125
126
|
)
|
126
127
|
raise NotPassedException
|
127
|
-
elsif action == 'block'
|
128
|
+
elsif action == 'block' && rate >= 90
|
128
129
|
@is_mod = true
|
129
130
|
CensorBear.info(
|
130
|
-
d['content'], @type,
|
131
|
+
d['content'], @type, 'mod', 'aliyun_check',
|
131
132
|
filtered_content: d['filteredContent'],
|
132
133
|
mod_words: @mod_words,
|
133
134
|
labels: @labels,
|
134
|
-
ip: @ip, user_id: @user_id
|
135
|
+
ip: @ip, user_id: @user_id,
|
136
|
+
response: response
|
135
137
|
)
|
136
138
|
elsif action == 'review'
|
137
139
|
@is_mod = true
|
138
140
|
CensorBear.info(
|
139
|
-
d['content'], @type,
|
141
|
+
d['content'], @type, 'mod', 'aliyun_check',
|
140
142
|
filtered_content: d['filteredContent'],
|
141
143
|
mod_words: @mod_words,
|
142
144
|
labels: @labels,
|
143
|
-
ip: @ip, user_id: @user_id
|
145
|
+
ip: @ip, user_id: @user_id,
|
146
|
+
response: response
|
147
|
+
)
|
148
|
+
else
|
149
|
+
CensorBear.info(
|
150
|
+
d['content'], @type, 'ignore', 'aliyun_check',
|
151
|
+
filtered_content: d['filteredContent'],
|
152
|
+
mod_words: @mod_words,
|
153
|
+
labels: @labels,
|
154
|
+
ip: @ip, user_id: @user_id,
|
155
|
+
response: response
|
144
156
|
)
|
145
157
|
end
|
146
158
|
end
|
@@ -149,6 +161,7 @@ module CensorBear
|
|
149
161
|
|
150
162
|
def concat_labels(data)
|
151
163
|
return [] if data.blank?
|
164
|
+
|
152
165
|
labels = []
|
153
166
|
data.map do |d|
|
154
167
|
next if d['label'].blank?
|
@@ -160,6 +173,7 @@ module CensorBear
|
|
160
173
|
|
161
174
|
def concat_words(data)
|
162
175
|
return [] if data.blank?
|
176
|
+
|
163
177
|
words = []
|
164
178
|
data.each do |d|
|
165
179
|
next if d['contexts'].blank?
|
data/lib/censor_bear/version.rb
CHANGED
data/lib/censor_bear.rb
CHANGED
@@ -47,6 +47,7 @@ module CensorBear
|
|
47
47
|
labels = options[:labels] || []
|
48
48
|
ip = options[:ip] || nil
|
49
49
|
user_id = options[:user_id] || nil
|
50
|
+
response = options[:response] || {}
|
50
51
|
|
51
52
|
CensorBear::Log.create(
|
52
53
|
original_content: content,
|
@@ -58,6 +59,7 @@ module CensorBear
|
|
58
59
|
labels: labels,
|
59
60
|
ip: ip,
|
60
61
|
user_id: user_id,
|
62
|
+
response: response
|
61
63
|
)
|
62
64
|
end
|
63
65
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: censor_bear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 42up
|
@@ -112,16 +112,19 @@ files:
|
|
112
112
|
- Rakefile
|
113
113
|
- app/assets/config/censor_bear_manifest.js
|
114
114
|
- app/assets/stylesheets/censor_bear/application.css
|
115
|
+
- app/assets/stylesheets/censor_bear/home.css
|
115
116
|
- app/assets/stylesheets/censor_bear/logs.css
|
116
117
|
- app/assets/stylesheets/censor_bear/mod_logs.css
|
117
118
|
- app/assets/stylesheets/censor_bear/stop_words.css
|
118
119
|
- app/assets/stylesheets/censor_bear/tailwind.min.css
|
119
120
|
- app/assets/stylesheets/scaffold.css
|
120
121
|
- app/controllers/censor_bear/application_controller.rb
|
122
|
+
- app/controllers/censor_bear/home_controller.rb
|
121
123
|
- app/controllers/censor_bear/logs_controller.rb
|
122
124
|
- app/controllers/censor_bear/mod_logs_controller.rb
|
123
125
|
- app/controllers/censor_bear/stop_words_controller.rb
|
124
126
|
- app/helpers/censor_bear/application_helper.rb
|
127
|
+
- app/helpers/censor_bear/home_helper.rb
|
125
128
|
- app/helpers/censor_bear/logs_helper.rb
|
126
129
|
- app/helpers/censor_bear/mod_logs_helper.rb
|
127
130
|
- app/helpers/censor_bear/stop_words_helper.rb
|
@@ -131,13 +134,16 @@ files:
|
|
131
134
|
- app/models/censor_bear/log.rb
|
132
135
|
- app/models/censor_bear/mod_log.rb
|
133
136
|
- app/models/censor_bear/stop_word.rb
|
137
|
+
- app/views/censor_bear/home/debug.turbo_stream.haml
|
138
|
+
- app/views/censor_bear/home/debugger.html.haml
|
139
|
+
- app/views/censor_bear/home/index.html.erb
|
134
140
|
- app/views/censor_bear/logs/_form.html.erb
|
135
141
|
- app/views/censor_bear/logs/_log.html.haml
|
136
142
|
- app/views/censor_bear/logs/destroy.turbo_stream.haml
|
137
143
|
- app/views/censor_bear/logs/edit.html.erb
|
138
144
|
- app/views/censor_bear/logs/index.html.haml
|
139
145
|
- app/views/censor_bear/logs/new.html.erb
|
140
|
-
- app/views/censor_bear/logs/show.html.
|
146
|
+
- app/views/censor_bear/logs/show.html.haml
|
141
147
|
- app/views/censor_bear/mod_logs/_form.html.erb
|
142
148
|
- app/views/censor_bear/mod_logs/_mod_log.html.haml
|
143
149
|
- app/views/censor_bear/mod_logs/destroy.turbo_stream.haml
|
@@ -162,6 +168,7 @@ files:
|
|
162
168
|
- db/migrate/20211129110218_create_censor_bear_mod_logs.rb
|
163
169
|
- db/migrate/20211206092626_add_ip_to_censor_bear_logs.rb
|
164
170
|
- db/migrate/20211208041114_add_labels_to_censor_bear_logs.rb
|
171
|
+
- db/migrate/20211209093050_add_response_to_censor_bear_logs.rb
|
165
172
|
- lib/censor_bear.rb
|
166
173
|
- lib/censor_bear/censor.rb
|
167
174
|
- lib/censor_bear/configuration.rb
|
@@ -1,34 +0,0 @@
|
|
1
|
-
<p id="notice"><%= notice %></p>
|
2
|
-
|
3
|
-
<p>
|
4
|
-
<strong>Orginal content:</strong>
|
5
|
-
<%= @log.original_content %>
|
6
|
-
</p>
|
7
|
-
|
8
|
-
<p>
|
9
|
-
<strong>Action:</strong>
|
10
|
-
<%= @log.action %>
|
11
|
-
</p>
|
12
|
-
|
13
|
-
<p>
|
14
|
-
<strong>Scenario:</strong>
|
15
|
-
<%= @log.scenario %>
|
16
|
-
</p>
|
17
|
-
|
18
|
-
<p>
|
19
|
-
<strong>Stage:</strong>
|
20
|
-
<%= @log.stage %>
|
21
|
-
</p>
|
22
|
-
|
23
|
-
<p>
|
24
|
-
<strong>Filtered content:</strong>
|
25
|
-
<%= @log.filtered_content %>
|
26
|
-
</p>
|
27
|
-
|
28
|
-
<p>
|
29
|
-
<strong>Mod words:</strong>
|
30
|
-
<%= @log.mod_words %>
|
31
|
-
</p>
|
32
|
-
|
33
|
-
<%= link_to 'Edit', edit_log_path(@log) %> |
|
34
|
-
<%= link_to 'Back', logs_path %>
|