Skip to content

Commit 705df62

Browse files
committed
🎨 文本接入AI检测
1 parent 69d7205 commit 705df62

File tree

3 files changed

+106
-15
lines changed

3 files changed

+106
-15
lines changed

src/main/java/org/b3log/symphony/processor/middleware/validate/ArticlePostValidationMidware.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -219,21 +219,6 @@ public void handle(final RequestContext context) {
219219
return;
220220
}
221221

222-
// 敏感词检测
223-
JSONObject titleCensorResult = QiniuTextCensor.censor(articleTitle);
224-
JSONObject articleCensorResult = QiniuTextCensor.censor(articleContent);
225-
if (titleCensorResult.optString("do").equals("block") || articleCensorResult.optString("do").equals("block")) {
226-
// 违规内容,不予显示
227-
context.renderJSON(exception.put(Keys.MSG, "您的文章存在严重违规内容,内容已被记录,管理员将会复审,请修改内容后重试。"));
228-
ChatRoomBot.sendBotMsg("犯罪嫌疑人 @" + currentUser.optString(User.USER_NAME) + " 由于上传违规内容(帖子),被处以 500 积分的处罚,请引以为戒。\n@adlered 留档");
229-
ChatRoomBot.abusePoint(currentUser.optString(Keys.OBJECT_ID), 500, "机器人罚单-上传违规内容(帖子)");
230-
// 记录日志
231-
LogsService.censorLog(context, currentUser.optString(Keys.OBJECT_ID), "用户:" + currentUser.optString(User.USER_NAME) + " 违规上传文章:" + articleTitle + " 内容:" + articleContent + " 标题违规判定:" + titleCensorResult + " 内容违规判定:" + articleCensorResult);
232-
System.out.println("用户:" + currentUser.optString(User.USER_NAME) + " 违规上传文章:" + articleTitle + " 内容:" + articleContent + " 标题违规判定:" + titleCensorResult + " 内容违规判定:" + articleCensorResult);
233-
context.abort();
234-
return;
235-
}
236-
237222
final int rewardPoint = requestJSONObject.optInt(Article.ARTICLE_REWARD_POINT, 0);
238223
if (rewardPoint < 0) {
239224
context.renderJSON(exception.put(Keys.MSG, langPropsService.get("invalidRewardPointLabel")));
@@ -266,6 +251,21 @@ public void handle(final RequestContext context) {
266251
}
267252
}
268253

254+
// 敏感词检测
255+
JSONObject titleCensorResult = QiniuTextCensor.censor(articleTitle);
256+
JSONObject articleCensorResult = QiniuTextCensor.censor(articleContent);
257+
if (titleCensorResult.optString("do").equals("block") || articleCensorResult.optString("do").equals("block")) {
258+
// 违规内容,不予显示
259+
context.renderJSON(exception.put(Keys.MSG, "您的文章存在严重违规内容,内容已被记录,管理员将会复审,请修改内容后重试。"));
260+
ChatRoomBot.sendBotMsg("犯罪嫌疑人 @" + currentUser.optString(User.USER_NAME) + " 由于上传违规内容(帖子),被处以 500 积分的处罚,请引以为戒。\n@adlered 留档");
261+
ChatRoomBot.abusePoint(currentUser.optString(Keys.OBJECT_ID), 500, "机器人罚单-上传违规内容(帖子)");
262+
// 记录日志
263+
LogsService.censorLog(context, currentUser.optString(Keys.OBJECT_ID), "用户:" + currentUser.optString(User.USER_NAME) + " 违规上传文章:" + articleTitle + " 内容:" + articleContent + " 标题违规判定:" + titleCensorResult + " 内容违规判定:" + articleCensorResult);
264+
System.out.println("用户:" + currentUser.optString(User.USER_NAME) + " 违规上传文章:" + articleTitle + " 内容:" + articleContent + " 标题违规判定:" + titleCensorResult + " 内容违规判定:" + articleCensorResult);
265+
context.abort();
266+
return;
267+
}
268+
269269
context.handle();
270270
}
271271
}

src/main/java/org/b3log/symphony/processor/middleware/validate/CommentAddValidationMidware.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,22 @@
2424
import org.b3log.latke.http.RequestContext;
2525
import org.b3log.latke.ioc.BeanManager;
2626
import org.b3log.latke.ioc.Singleton;
27+
import org.b3log.latke.model.User;
2728
import org.b3log.latke.service.LangPropsService;
2829
import org.b3log.symphony.model.Article;
2930
import org.b3log.symphony.model.Comment;
31+
import org.b3log.symphony.processor.ApiProcessor;
32+
import org.b3log.symphony.processor.bot.ChatRoomBot;
3033
import org.b3log.symphony.service.ArticleQueryService;
3134
import org.b3log.symphony.service.CommentQueryService;
35+
import org.b3log.symphony.service.LogsService;
3236
import org.b3log.symphony.service.OptionQueryService;
37+
import org.b3log.symphony.util.QiniuTextCensor;
3338
import org.b3log.symphony.util.ReservedWords;
39+
import org.b3log.symphony.util.Sessions;
3440
import org.b3log.symphony.util.StatusCodes;
3541
import org.json.JSONObject;
42+
import pers.adlered.simplecurrentlimiter.main.SimpleCurrentLimiter;
3643

3744
/**
3845
* Validates for comment adding locally.
@@ -44,6 +51,8 @@
4451
@Singleton
4552
public class CommentAddValidationMidware {
4653

54+
final private static SimpleCurrentLimiter addCommentLimiter = new SimpleCurrentLimiter(60 * 30, 10);
55+
4756
public void handle(final RequestContext context) {
4857
final Request request = context.getRequest();
4958
final JSONObject requestJSONObject = context.requestJSON();
@@ -54,9 +63,31 @@ public void handle(final RequestContext context) {
5463
final ArticleQueryService articleQueryService = beanManager.getReference(ArticleQueryService.class);
5564
final CommentQueryService commentQueryService = beanManager.getReference(CommentQueryService.class);
5665

66+
JSONObject currentUser = Sessions.getUser();
67+
try {
68+
currentUser = ApiProcessor.getUserByKey(context.param("apiKey"));
69+
} catch (NullPointerException ignored) {
70+
}
71+
try {
72+
currentUser = ApiProcessor.getUserByKey(requestJSONObject.optString("apiKey"));
73+
} catch (NullPointerException ignored) {
74+
}
75+
if (null == currentUser) {
76+
context.sendError(401);
77+
context.abort();
78+
return;
79+
}
80+
5781
final JSONObject exception = new JSONObject();
5882
exception.put(Keys.CODE, StatusCodes.ERR);
5983

84+
// 频率检测
85+
if (!addCommentLimiter.access(currentUser.optString(Keys.OBJECT_ID))) {
86+
context.renderJSON(exception.put(Keys.MSG, "操作过于频繁,请稍候重试。"));
87+
context.abort();
88+
return;
89+
}
90+
6091
requestJSONObject.put(Comment.COMMENT_CONTENT, ReservedWords.processReservedWord(requestJSONObject.optString(Comment.COMMENT_CONTENT)));
6192
final String commentContent = StringUtils.trim(requestJSONObject.optString(Comment.COMMENT_CONTENT));
6293
if (StringUtils.isBlank(commentContent) || commentContent.length() > Comment.MAX_COMMENT_CONTENT_LENGTH) {
@@ -95,6 +126,20 @@ public void handle(final RequestContext context) {
95126
}
96127
}
97128

129+
// 敏感词检测
130+
JSONObject censorResult = QiniuTextCensor.censor(commentContent);
131+
if (censorResult.optString("do").equals("block")) {
132+
// 违规内容,不予显示
133+
context.renderJSON(exception.put(Keys.MSG, "您的评论存在严重违规内容,内容已被记录,管理员将会复审,请修改内容后重试。"));
134+
ChatRoomBot.sendBotMsg("犯罪嫌疑人 @" + currentUser.optString(User.USER_NAME) + " 由于上传违规内容(评论),被处以 500 积分的处罚,请引以为戒。\n@adlered 留档");
135+
ChatRoomBot.abusePoint(currentUser.optString(Keys.OBJECT_ID), 500, "机器人罚单-上传违规内容(评论)");
136+
// 记录日志
137+
LogsService.censorLog(context, currentUser.optString(Keys.OBJECT_ID), "用户:" + currentUser.optString(User.USER_NAME) + " 违规评论:" + commentContent + " 违规判定:" + censorResult);
138+
System.out.println("用户:" + currentUser.optString(User.USER_NAME) + " 违规评论:" + commentContent + " 违规判定:" + censorResult);
139+
context.abort();
140+
return;
141+
}
142+
98143
context.handle();
99144
}
100145
}

src/main/java/org/b3log/symphony/processor/middleware/validate/CommentUpdateValidationMidware.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,21 @@
2525
import org.b3log.latke.ioc.BeanManager;
2626
import org.b3log.latke.ioc.Inject;
2727
import org.b3log.latke.ioc.Singleton;
28+
import org.b3log.latke.model.User;
2829
import org.b3log.latke.service.LangPropsService;
2930
import org.b3log.symphony.model.Comment;
31+
import org.b3log.symphony.processor.ApiProcessor;
32+
import org.b3log.symphony.processor.bot.ChatRoomBot;
3033
import org.b3log.symphony.service.ArticleQueryService;
3134
import org.b3log.symphony.service.CommentQueryService;
35+
import org.b3log.symphony.service.LogsService;
3236
import org.b3log.symphony.service.OptionQueryService;
37+
import org.b3log.symphony.util.QiniuTextCensor;
3338
import org.b3log.symphony.util.ReservedWords;
39+
import org.b3log.symphony.util.Sessions;
3440
import org.b3log.symphony.util.StatusCodes;
3541
import org.json.JSONObject;
42+
import pers.adlered.simplecurrentlimiter.main.SimpleCurrentLimiter;
3643

3744
/**
3845
* Validates for comment updating locally.
@@ -68,6 +75,8 @@ public class CommentUpdateValidationMidware {
6875
@Inject
6976
private OptionQueryService optionQueryService;
7077

78+
final private static SimpleCurrentLimiter updateCommentLimiter = new SimpleCurrentLimiter(60 * 30, 3);
79+
7180
public void handle(final RequestContext context) {
7281
final Request request = context.getRequest();
7382
final JSONObject requestJSONObject = context.requestJSON();
@@ -76,16 +85,53 @@ public void handle(final RequestContext context) {
7685
final LangPropsService langPropsService = beanManager.getReference(LangPropsService.class);
7786
final OptionQueryService optionQueryService = beanManager.getReference(OptionQueryService.class);
7887

88+
JSONObject currentUser = Sessions.getUser();
89+
try {
90+
currentUser = ApiProcessor.getUserByKey(context.param("apiKey"));
91+
} catch (NullPointerException ignored) {
92+
}
93+
try {
94+
currentUser = ApiProcessor.getUserByKey(requestJSONObject.optString("apiKey"));
95+
} catch (NullPointerException ignored) {
96+
}
97+
if (null == currentUser) {
98+
context.sendError(401);
99+
context.abort();
100+
return;
101+
}
102+
79103
final JSONObject exception = new JSONObject();
80104
exception.put(Keys.CODE, StatusCodes.ERR);
81105

106+
// 频率检测
107+
if (!updateCommentLimiter.access(currentUser.optString(Keys.OBJECT_ID))) {
108+
context.renderJSON(exception.put(Keys.MSG, "操作过于频繁,请稍候重试。"));
109+
context.abort();
110+
return;
111+
}
112+
82113
requestJSONObject.put(Comment.COMMENT_CONTENT, ReservedWords.processReservedWord(requestJSONObject.optString(Comment.COMMENT_CONTENT)));
83114
final String commentContent = StringUtils.trim(requestJSONObject.optString(Comment.COMMENT_CONTENT));
84115
if (StringUtils.isBlank(commentContent) || commentContent.length() > Comment.MAX_COMMENT_CONTENT_LENGTH) {
85116
context.renderJSON(exception.put(Keys.MSG, langPropsService.get("commentErrorLabel")));
86117
context.abort();
87118
return;
88119
}
120+
121+
// 敏感词检测
122+
JSONObject censorResult = QiniuTextCensor.censor(commentContent);
123+
if (censorResult.optString("do").equals("block")) {
124+
// 违规内容,不予显示
125+
context.renderJSON(exception.put(Keys.MSG, "您的评论存在严重违规内容,内容已被记录,管理员将会复审,请修改内容后重试。"));
126+
ChatRoomBot.sendBotMsg("犯罪嫌疑人 @" + currentUser.optString(User.USER_NAME) + " 由于上传违规内容(评论),被处以 500 积分的处罚,请引以为戒。\n@adlered 留档");
127+
ChatRoomBot.abusePoint(currentUser.optString(Keys.OBJECT_ID), 500, "机器人罚单-上传违规内容(评论)");
128+
// 记录日志
129+
LogsService.censorLog(context, currentUser.optString(Keys.OBJECT_ID), "用户:" + currentUser.optString(User.USER_NAME) + " 违规评论:" + commentContent + " 违规判定:" + censorResult);
130+
System.out.println("用户:" + currentUser.optString(User.USER_NAME) + " 违规评论:" + commentContent + " 违规判定:" + censorResult);
131+
context.abort();
132+
return;
133+
}
134+
89135
context.handle();
90136
}
91137
}

0 commit comments

Comments
 (0)