Java实现微信小程序文本内容敏感词检查

1.背景

发布小程序的时候,没有通过审核,审核结果为
在这里插入图片描述
提示要完善内容审核机制。

2.策略

微信服务端内容安全模块提供了内容审核的接口
security.msgSecCheck
检查一段文本是否含有违法违规内容。
在这里插入图片描述
应用场景举例:

  1. 用户个人资料违规文字检测;
  2. 媒体新闻类用户发表文章,评论内容检测;
  3. 游戏类用户编辑上传的素材(如答题类小游戏用户上传的问题及答案)检测等。

频率限制
单个 appId 调用上限为 4000 次/分钟,2,000,000 次/天

调用方式:

  1. HTTPS 调用
  2. 云调用
  3. 增量调用(加强版)

这里我们使用HTTPS调用的方式。

3.实现

1. 调用auth.getAccessToken,获取接口调用凭证

在这里插入图片描述

详情可参考微信公众平台文档 《获取access_token》

使用map存储获取的access_token,建立定时任务,每个7000s更新一次,如果项目中引入了Redis,最好使用Redis存储。原本项目中没有引入Redis,这里就偷了个懒

import cn.hutool.http.HttpUtil;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class WeiXinUtil {

    @Value("${app.appid}")
    String APPID;

    @Value("${app.secret}")
    String SECRET;

    @Value("${app.grant_type}")
    String AUTHORIZATION_CODE;

    @Autowired
    WxCryptUtils wxCryptUtils;

	public static Map<String, String> accessTokenMap;

    public static final String ACCESS_TOKEN_KEY="accessToken";

    static {
        accessTokenMap = new HashMap<String, String>(1);
    }

    /**
     * 功能描述: 获取access_token,每隔7000s获取一次
     * @author jiaoqianjin
     * Date: 2020/11/23 14:33
     */
    @Scheduled(fixedDelay = 2*3000*1000)
    public void getAccessToken() {
        //利用hutool发送https请求
        Map<String, Object> paramMap = new HashMap<String, Object>(3);
        paramMap.put("appid", APPID);
        paramMap.put("secret", SECRET);
        paramMap.put("grant_type", AUTHORIZATION_CODE);
        // 利用Hutool工具包的HttpUtil
        Object result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token?", paramMap);
        JSONObject jsonObject = JSONUtil.parseObj(result);
        WeiXinUtil.accessTokenMap.put(WeiXinUtil.ACCESS_TOKEN_KEY,jsonObject.getStr("access_token"));
    }
}

.yml

app:
  appid: wx23eb370840c******
  secret: 8a665bce9dcc74e6e30e1c849******
  grant_type: client_credential

启动类
添加注解@EnableScheduling,开启定时任务

@EnableScheduling
@SpringBootApplication
public class AppRun {

    public static void main( String[] args ) {
        SpringApplication.run(AppRun.class, args);
    }

}

2. 调用security.msgSecCheck检测文本内容

 /**
     * 功能描述:检查一段文本是否含有违法违规内容。
     *
     * @param content 待检测文本
     * @author jiaoqianjin
     * Date: 2020/11/23 14:41
     */
    public boolean msgCheck(String content) {
        String token = WeiXinUtil.accessTokenMap.get(WeiXinUtil.ACCESS_TOKEN_KEY);
        Map<String, Object> paramMap = new HashMap<String, Object>(1);
        paramMap.put("content", content);
        Object result = HttpUtil.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, JparamMap);
        JSONObject jsonObject = JSONUtil.parseObj(result);
        System.out.println(jsonObject);
        boolean flag = false;
        //87014	内容含有违法违规内容
        int errCode = 87014;
        if (jsonObject.getInt("errcode") == errCode) {
            flag = true;
        }
        return flag;
    }

4.遇到的问题

{“errcode”:47001,“errmsg”:"data format error rid: *** "}
请求格式不正确

hutool给出的post请求例子
在这里插入图片描述
发现自己没有用错,但是请求格式就是不对,发现post请求参数,请发送前还是要转为JSON格式

 Map<String, Object> paramMap = new HashMap<String, Object>(1);
 paramMap.put("content", content);
 Object result = HttpUtil.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, JSONUtil.toJsonPrettyStr(paramMap));

5.工具类完整代码

import cn.hutool.http.HttpUtil;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class WeiXinUtil {

    @Value("${app.appid}")
    String APPID;

    @Value("${app.secret}")
    String SECRET;

    @Value("${app.grant_type}")
    String AUTHORIZATION_CODE;

    @Autowired
    WxCryptUtils wxCryptUtils;

	public static Map<String, String> accessTokenMap;

    public static final String ACCESS_TOKEN_KEY="accessToken";

    static {
        accessTokenMap = new HashMap<String, String>(1);
    }

    /**
     * 功能描述: 获取access_token,每隔7000s获取一次
     * @author jiaoqianjin
     * Date: 2020/11/23 14:33
     */
    @Scheduled(fixedDelay = 2*3000*1000)
    public void getAccessToken() {
        //利用hutool发送https请求
        Map<String, Object> paramMap = new HashMap<String, Object>(3);
        paramMap.put("appid", APPID);
        paramMap.put("secret", SECRET);
        paramMap.put("grant_type", AUTHORIZATION_CODE);
        // 利用Hutool工具包的HttpUtil
        Object result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token?", paramMap);
        JSONObject jsonObject = JSONUtil.parseObj(result);
        WeiXinUtil.accessTokenMap.put(WeiXinUtil.ACCESS_TOKEN_KEY,jsonObject.getStr("access_token"));
    }
     /**
     * 功能描述:检查一段文本是否含有违法违规内容。
     *
     * @param content 待检测文本
     * @author jiaoqianjin
     * Date: 2020/11/23 14:41
     */
    public boolean msgCheck(String content) {
        String token = WeiXinUtil.accessTokenMap.get(WeiXinUtil.ACCESS_TOKEN_KEY);
        Map<String, Object> paramMap = new HashMap<String, Object>(1);
        paramMap.put("content", content);
        Object result = HttpUtil.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, JSONUtil.toJsonPrettyStr(paramMap));
        JSONObject jsonObject = JSONUtil.parseObj(result);
        System.out.println(jsonObject);
        boolean flag = false;
        //87014	内容含有违法违规内容
        int errCode = 87014;
        if (jsonObject.getInt("errcode") == errCode) {
            flag = true;
        }
        return flag;
    }
}

6.使用方式

 // 通知内容添加文本铭感词汇过滤
 boolean isSensitive = new WeiXinUtil().msgCheck(info.getContent());
 if (isSensitive) {
     log.error("【发布通知失败,含有违法违规内容】: objId: " + updateObjectDTO.getId());
     throw new BaseException(ResponseEnum.CONTENT_IS_SENSITIVE);
 }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值