文章审核自动化
1.文本垃圾內(nèi)容檢測(cè)
試用阿里云的內(nèi)容安全檢測(cè)來(lái)做我們的文本,圖片的檢測(cè)
1.1使用方法如下:
@Getter @Setter @Configuration @ConfigurationProperties(prefix="aliyun") @PropertySource("classpath:aliyun.properties") public class AliyunTextScanRequest {private String accessKey;private String secret;public String textScanRequest(String content) throws Exception {IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, secret);IAcsClient client = new DefaultAcsClient(profile);TextScanRequest textScanRequest = new TextScanRequest();textScanRequest.setAcceptFormat(FormatType.JSON); // 指定api返回格式textScanRequest.setHttpContentType(FormatType.JSON);textScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定請(qǐng)求方法textScanRequest.setEncoding("UTF-8");textScanRequest.setRegionId("cn-shanghai");List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>();Map<String, Object> task1 = new LinkedHashMap<String, Object>();task1.put("dataId", UUID.randomUUID().toString());/*** 待檢測(cè)的文本,長(zhǎng)度不超過(guò)10000個(gè)字符*/task1.put("content", content);tasks.add(task1);JSONObject data = new JSONObject();/*** 檢測(cè)場(chǎng)景,文本垃圾檢測(cè)傳遞:antispam**/data.put("scenes", Arrays.asList("antispam"));data.put("tasks", tasks);System.out.println(JSON.toJSONString(data, true));textScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);// 請(qǐng)務(wù)必設(shè)置超時(shí)時(shí)間textScanRequest.setConnectTimeout(3000);textScanRequest.setReadTimeout(6000);try {HttpResponse httpResponse = client.doAction(textScanRequest);if(httpResponse.isSuccess()){JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));System.out.println(JSON.toJSONString(scrResponse, true));if (200 == scrResponse.getInteger("code")) {JSONArray taskResults = scrResponse.getJSONArray("data");for (Object taskResult : taskResults) {if(200 == ((JSONObject)taskResult).getInteger("code")){JSONArray sceneResults = ((JSONObject)taskResult).getJSONArray("results");for (Object sceneResult : sceneResults) {String scene = ((JSONObject)sceneResult).getString("scene");String suggestion = ((JSONObject)sceneResult).getString("suggestion");//根據(jù)scene和suggetion做相關(guān)處理//suggestion == pass 未命中垃圾 suggestion == block 命中了垃圾,可以通過(guò)label字段查看命中的垃圾分類System.out.println("args = [" + scene + "]");System.out.println("args = [" + suggestion + "]");return suggestion;}}else{System.out.println("task process fail:" + ((JSONObject)taskResult).getInteger("code"));}}} else {System.out.println("detect not success. code:" + scrResponse.getInteger("code"));}}else{System.out.println("response not success. status:" + httpResponse.getStatus());}} catch (ClientException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return null;} }編寫配置類掃描阿里云Config,同時(shí)編寫測(cè)試類AliTest{
@Autowired
private AliyunTextScanRequest aliyunTextScanRequest;
}
2.圖片審核
圖片審核,有兩種方式,第一種放一個(gè)url,第二種方式傳一個(gè)本地的圖片到程序中進(jìn)行檢測(cè)創(chuàng)建工具類:com.common.aliyun.AliyunImageScanRequest
@Getter @Setter @Configuration @ConfigurationProperties(prefix="aliyun") @PropertySource("classpath:aliyun.properties") public class AliyunImageScanRequest {private String accessKey;private String secret;public String imageScanRequest(List<String> images) throws Exception {IClientProfile profile = DefaultProfile.getProfile("cn-shanghai",accessKey,secret);DefaultProfile.addEndpoint("cn-shanghai", "cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");IAcsClient client = new DefaultAcsClient(profile);ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();// 指定api返回格式imageSyncScanRequest.setAcceptFormat(FormatType.JSON);// 指定請(qǐng)求方法imageSyncScanRequest.setMethod(MethodType.POST);imageSyncScanRequest.setEncoding("utf-8");//支持http和httpsimageSyncScanRequest.setProtocol(ProtocolType.HTTP);JSONObject httpBody = new JSONObject();/*** 設(shè)置要檢測(cè)的場(chǎng)景, 計(jì)費(fèi)是按照該處傳遞的場(chǎng)景進(jìn)行* 一次請(qǐng)求中可以同時(shí)檢測(cè)多張圖片,每張圖片可以同時(shí)檢測(cè)多個(gè)風(fēng)險(xiǎn)場(chǎng)景,計(jì)費(fèi)按照?qǐng)鼍坝?jì)算* 例如:檢測(cè)2張圖片,場(chǎng)景傳遞porn,terrorism,計(jì)費(fèi)會(huì)按照2張圖片鑒黃,2張圖片暴恐檢測(cè)計(jì)算* porn: porn表示色情場(chǎng)景檢測(cè)*/httpBody.put("scenes", Arrays.asList("logo","porn","ad","terrorism"));/*** 設(shè)置待檢測(cè)圖片, 一張圖片一個(gè)task,* 多張圖片同時(shí)檢測(cè)時(shí),處理的時(shí)間由最后一個(gè)處理完的圖片決定。* 通常情況下批量檢測(cè)的平均rt比單張檢測(cè)的要長(zhǎng), 一次批量提交的圖片數(shù)越多,rt被拉長(zhǎng)的概率越高* 這里以單張圖片檢測(cè)作為示例, 如果是批量圖片檢測(cè),請(qǐng)自行構(gòu)建多個(gè)task*/List<JSONObject> list = new ArrayList<JSONObject>();for (String image : images) {JSONObject task = new JSONObject();task.put("dataId", UUID.randomUUID().toString());//設(shè)置圖片鏈接為上傳后的urltask.put("url", image);task.put("time", new Date());list.add(task);}httpBody.put("tasks", list);imageSyncScanRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),"UTF-8", FormatType.JSON);/*** 請(qǐng)?jiān)O(shè)置超時(shí)時(shí)間, 服務(wù)端全鏈路處理超時(shí)時(shí)間為10秒,請(qǐng)做相應(yīng)設(shè)置* 如果您設(shè)置的ReadTimeout 小于服務(wù)端處理的時(shí)間,程序中會(huì)獲得一個(gè)read timeout 異常*/imageSyncScanRequest.setConnectTimeout(3000);imageSyncScanRequest.setReadTimeout(10000);HttpResponse httpResponse = null;try {httpResponse = client.doAction(imageSyncScanRequest);} catch (Exception e) {e.printStackTrace();}//服務(wù)端接收到請(qǐng)求,并完成處理返回的結(jié)果if (httpResponse != null && httpResponse.isSuccess()) {JSONObject scrResponse = JSON.parseObject(org.apache.commons.codec.binary.StringUtils.newStringUtf8(httpResponse.getHttpContent()));System.out.println(JSON.toJSONString(scrResponse, true));int requestCode = scrResponse.getIntValue("code");//每一張圖片的檢測(cè)結(jié)果JSONArray taskResults = scrResponse.getJSONArray("data");if (200 == requestCode) {for (Object taskResult : taskResults) {//單張圖片的處理結(jié)果int taskCode = ((JSONObject) taskResult).getIntValue("code");//圖片要檢測(cè)的場(chǎng)景的處理結(jié)果, 如果是多個(gè)場(chǎng)景,則會(huì)有每個(gè)場(chǎng)景的結(jié)果JSONArray sceneResults = ((JSONObject) taskResult).getJSONArray("results");if (200 == taskCode) {for (Object sceneResult : sceneResults) {String scene = ((JSONObject) sceneResult).getString("scene");String suggestion = ((JSONObject) sceneResult).getString("suggestion");//根據(jù)scene和suggetion做相關(guān)處理//do somethingSystem.out.println("scene = [" + scene + "]");System.out.println("suggestion = [" + suggestion + "]");return suggestion;}} else {//單張圖片處理失敗, 原因是具體的情況詳細(xì)分析System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));}}} else {/*** 表明請(qǐng)求整體處理失敗,原因視具體的情況詳細(xì)分析*/System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));}}return null;} }當(dāng)自媒體用戶在自媒體端發(fā)表了一篇文章是需要通過(guò)審核通過(guò)之后才能在用戶app端展示
news:文章?tīng)顟B(tài)
1.提交(待審核)
2.審核失敗
3.人工審核
4.人工審核通過(guò)
8.審核通過(guò)(待發(fā)布)
9.已發(fā)布
審核的思路和流程是這樣:
1.文章?tīng)顟B(tài)如果為4就不用再次去審核了,可以直接保存數(shù)據(jù)。
2.狀態(tài)為8,發(fā)布時(shí)間是大于當(dāng)前時(shí)間的,就可以保存數(shù)據(jù)了
3.判斷為1,待審核
4.標(biāo)題和內(nèi)容是否匹配,不匹配,operation:人工復(fù)審或拒絕給用戶推送消息。
5.審核文本 operation:人工復(fù)審或者拒絕。
6.審核圖片,
7.判斷發(fā)布時(shí)間是否大于當(dāng)前時(shí)間 是的話就保存數(shù)據(jù),不是的話就將vmNews的狀態(tài)改成9審核已通過(guò)。
8.如果不是就保存數(shù)據(jù),向ap_article中保存一條數(shù)據(jù)。
ap_article_config
ap_article
ap_ariticle_content
ap_author
4張表中都需要存貯
8.創(chuàng)建索引
9.修改wmNew文章的狀態(tài)為9,文章審核通過(guò)保存消息。
文章審核代碼實(shí)現(xiàn)
1.adChannelMapper的接口,添加根據(jù)id查詢頻道的方法.
AdChannel selectByPrimaryKey(Integer id);AdChannelMapper.xml <select id="selectByPrimaryKey" resultMap="BaseResultMap" paramType="java.lang.Integer"> select <include refid="Base_Column_List"/> from ad_channel where id=#{id} </select>2.修改com.heima.model.mapper.app.ApAuthorMapper,添加根據(jù)名稱查詢作者的添加方法
ApAuthor selectByAuthorName(String authorName);
void insert(ApAuthor apAuthor);
先根據(jù)作者名稱來(lái)查詢作者,沒(méi)有查詢到就添加作者信息。
3.添加對(duì)應(yīng)的ApArticleContentMapper
void insert(ApArticleContent articleContent)
ApArticleConfigMapper
int insert(ApArticleConfig apArticleConfig);
ApArrticleMapper
int insert(ApArticle apArticle);
這里的mapper中需要返回我們的文章id,這樣我們才能添加對(duì)應(yīng)config,content.
在WmNewsMapper
新建ApUserMessageMapper類 。
Content的格式如下:
我們需要將text和層image都取出來(lái),答題思路,轉(zhuǎn)換成list
map中有兩項(xiàng),type和value,key-value。這里使用的死jsonAarry將大的json轉(zhuǎn)換成小的jsonObj對(duì)象然后從小的json對(duì)象中獲取對(duì)應(yīng)的屬性。
文章審核自動(dòng)測(cè)試:
public void TestReview(){reviewMediaArticleService.autoReviewByMedia(6110); //當(dāng)路徑訪問(wèn)不到的時(shí)候,我們的response可能會(huì)為null,我們需要修改代碼。//如果時(shí)間為null,我們就立即發(fā)布}總結(jié)
- 上一篇: 从架构到监控报警,支付系统的设计如何步步
- 下一篇: zbbz 坐标标注lisp_CAD_XY