原创

java实现微信小程序内容安全检测

小程序审核多次不过,原因是涉及用户自行产生/发布的内容,需要进行内容安全检测。
可以调用微信小程序提供的免费的api进行安全检测,但是官方没有java的例子,网上参考的案例也比较少。
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.imgSecCheck.html

代码如下:

package xxx;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpException;

import com.alibaba.fastjson.JSONObject;
import com.hong.core.util.common.JsonUtil;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;

/**
 * WxSecCheck - 微信内容安全检测的工具类
 * 
 */
public class WxSecCheck {

    private static String imgSecCheckUrl = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN";

    private static String msgSecCheckUrl = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN";

    /**
     * 文本安全检测,敏感词过滤拦截等
     * @param accessToken
     * @param content
     * @return
     * @throws Exception
     */
    public static Boolean checkText(String accessToken, String content) throws Exception {
        try {
            String url = msgSecCheckUrl.replace("ACCESS_TOKEN", accessToken);
            System.out.println("url:"+url); 
            Map<String, Object> map = new HashMap<>();
            map.put("content", content);
            String result = HttpRequest.post(url)
                .body(JsonUtil.toJson(map))
                .execute()
                .body();
            System.out.println(result);
            JSONObject jsonObject = JSONObject.parseObject(result);
            Object errcode = jsonObject.get("errcode");
            int errcodeInt = (int) errcode;
            if (errcodeInt == 0) {
                return true;
            } else if (errcodeInt == 87014) {
                System.out.println("内容违规-----------" + content);
                return false;
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("----------------调用腾讯内容过滤系统出错------------------");
            return true;// 默认给成功,手动审核吧
        }
    }

    /**
     * 图片安全检测,敏感图片拦截过滤等
     * @param accessToken
     * @param inputStream
     * @return
     * @throws HttpException
     * @throws IOException 
     */
    public static Boolean checkImage(String accessToken,Long fileSize, File file) throws HttpException, IOException {
        if(StringUtils.isBlank(accessToken) || fileSize ==null || file == null){
            return null;
        }
        //获取access_token
        String url = imgSecCheckUrl.replace("ACCESS_TOKEN", accessToken);
        System.out.println("url:"+url);

        HashMap<String, Object> paramMap = new HashMap<>();
        //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
        paramMap.put("file", file);
        String result= HttpUtil.post(url, paramMap);
        System.out.println("response: " + result);
        JSONObject jsonObject = JSONObject.parseObject(result);
        Object errcode = jsonObject.get("errcode");
        int errcodeInt = (int) errcode;
        if (errcodeInt == 0) {
            return true;
        } else if (errcodeInt == 87014) {
            System.out.println("图片违规-----------");
            return false;
        }
        return true;
    }    

}

以上图片检测部分写得封装性不是很好,可以根据需要改造下。图片检测接口有1M大小的限制,目前未作限制,如果需要压缩图片需要用到以下依赖并且自行写压缩代码。

            <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator --><!-- 引入这个会报错,后面再看看怎么办  -->
             <dependency>
                <groupId>net.coobird</groupId>
                <artifactId>thumbnailator</artifactId>
                <version>0.4.8</version>
            </dependency>

发起http或https请求,用到以下依赖

            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.0.3</version>
            </dependency>

开发过程中遇到的问题记录:
1、出现errcode:48001 errmsg:'api unauthorized'
解决方案:这里用到的accessToken是小程序的accessToken而不是公众号的accessToken,如果混用了,就会出现这个问题。
2、调用https接口时报错:PKIX path building failed 的问题
发起https的方式有误,由于时间紧急,所以用了hutool工具类开源库来发起请求就没问题了,具体原因后续再研究下。

参考文章:
java实现微信小程序内容安全检测 https://www.jianshu.com/p/d40c223ce29d
小程序msgSecCheck文本内容过滤敏感词java实现 https://blog.csdn.net/leisure_life/article/details/93881235
其他参考:
使用DFA算法实现的内容安全,反垃圾,智能鉴黄,敏感词过滤,不良信息检测,文本校验,敏感词检测,包括关键词提取,过滤html标签等。
https://github.com/fanhua1994/DzFilter
https开头的URL接口无法获取数据并报错: PKIX path building failed https://www.cnblogs.com/xiaotieblog/p/8337288.html
抓取https网页时,报错sun.security.validator.ValidatorException: PKIX path building failed 解决办法
https://www.cnblogs.com/zdz8207/p/java-https-ssl-jsoup.html
Springboot使用Thumbnailator压缩图片上传到阿里云OSS(无损压缩)
https://blog.csdn.net/weixin_39973810/article/details/86545054

正文到此结束
本文目录