微信小程序珊瑚文本检测(Java案例)

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…

文章目录


一、业务场景

关于社交圈模块的小程序,经常会涉及到发帖子的相关业务,此时就涉及到一个评论检测的接口或者帮助类了,分享一下相关心得;

如果你对社交圈产品业务感兴趣可以参考:社交圈模块业务分享

微信小程序珊瑚文本检测(Java案例)

应用场景举例:

用户个人资料违规文字检测;
媒体新闻类用户发表文章,评论内容检测;
游戏类用户编辑上传的素材(如答题类小游戏用户上传的问题及答案)检测等。 频率限制:单个 appId 调用上限为 4000 次/分钟,2,000,000 次/天*


关于免费的文本检测接口路径如下

HTTPS 调用请求地址

POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN

备注:普通的文本检测很多内容检测不出来

微信小程序珊瑚文本检测(Java案例)


拓展补充:access_token

access_token 是小程序全局唯一后台接口调用凭据,调用绝大多数后台接口时都需使用。开发者可以通过 getAccessToken 接口获取并进行妥善保存。

为了 access_token 的安全性,后端 API 不能直接在小程序内通过 wx.request 调用,即 api.weixin.qq.com 不能被配置为服务器域名。开发者应在后端服务器使用getAccessToken获取 access_token,并调用相关 API

    /**
     * 微信API请求URL前缀
     */
    private static final String PRE_URL = "https://api.weixin.qq.com";

    /**
     * 获取access_token URL
     */
    private static final String GET_ACCESS_TOKEN_URL = PRE_URL + "/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

//正常情况下代码会自己封装一个获取access_token的方法
    /**
     * /**
     * 获取access_token
     *
     * @param appid  小程序唯一凭证
     * @param secret 小程序唯一凭证密钥
     * @return
     */
    public static JSONObject getAccessToken(String appid, String secret) {
        String url = GET_ACCESS_TOKEN_URL.replace("APPID", appid).replace("APPSECRET", secret);
        String result = HttpUtil.get(url);
        return JSONObject.parseObject(result);
    }

二、珊瑚检测

第一次使用免费的检测工具后送审发现微信小程序评审不通过,这里我们就用到了微信付费的 珊瑚文本检测 ,使用后送审就成功了,分享一波相关代码实践案例;如下的很多接口均以及传参均复制官网;代码亲测实践;

珊瑚文本检测路径

请求地址

POST https://api.weixin.qq.com/wxa/servicemarket?access_token=ACCESS_TOKEN

微信小程序珊瑚文本检测(Java案例)

Object:返回的 JSON 数据包

微信小程序珊瑚文本检测(Java案例)
Appid:wxee446d7507c68b11

Apiname:msgSecCheck

API:API 均在 wx.serviceMarket 对象下。

示例:

{
  "Action": "TextApproval",
  "Text": "hello world!"
}

微信小程序珊瑚文本检测(Java案例)
微信小程序珊瑚文本检测(Java案例)

输出案例

{
  "Response": {
    "RequestId": "8dd99adb-5144-43ca-8213-f6a929ce5075",
    "EvilTokens": [
      {
        "EvilFlag": 1,
        "EvilType": 1,
        "EvilKeywords": [
          "恶意词A"
        ]
      },
      {
        "EvilFlag": 1,
        "EvilType": 5,
        "EvilKeywords": [
          "恶意词B"
        ]
      }
    ]
  }
}

服务端调用demo
https://api.weixin.qq.com/wxa/servicemarket?access_token={access_token}

{
      "service": "wxee446d7507c68b11",
      "api": "msgSecCheck",
      "client_msg_id" : "client_msg_id_1",
      "data": {
        "Action": "TextApproval",
        "Text": "hello world!"
      }
}

代码实践如下

   /**
     * 微信API请求URL前缀
     */
    private static final String PRE_URL = "https://api.weixin.qq.com";
    /**
     * 珊瑚校验问题接口
     */
    private static final String MSG_SHANHU_URL = PRE_URL + "/wxa/servicemarket?access_token=ACCESS_TOKEN";
    /**
     * 检查一段文本是否含有违法违规内容
     *
     * @param accessToken 接口调用凭证
     * @param content     要检测的文本内容,长度不超过 500KB
     * @return
     */
    public static JSONObject msgSecCheck(String accessToken, String content) {
        String url = MSG_SHANHU_URL.replace("ACCESS_TOKEN", accessToken);
        JSONObject jsonObject = new JSONObject();
        JSONObject jsonObject1 = new JSONObject();
        jsonObject1.put("Text", content);
        jsonObject1.put("Action", "TextApproval");
        jsonObject.put("data", jsonObject1);
        jsonObject.put("service", "wxee446d7507c68b11");
        jsonObject.put("api", "msgSecCheck");
        jsonObject.put("client_msg_id", "id123");
        String result = HttpUtil.post(url, jsonObject.toJSONString());
        //有需要的自行输出测试
        //System.out.println(JSON.toJSONString(result));
        //System.out.println(jsonObject + "==");
        return JSONObject.parseObject(result);
    }
    /**
     * 消息校验 --使用珊瑚校验
     *
     * @param msg
     * @return-
     */
    public boolean msgCheck(String msg) {
        String accessToken = getAccessToken();
        JSONObject jsonObject = MiniProgramUtil.msgSecCheck(accessToken, msg);
        JSONObject jsonData = jsonObject.getJSONObject("data");
        JSONObject evilTokens = jsonData.getJSONObject("Response");
        JSONArray responseObj = evilTokens.getJSONArray("EvilTokens");
        //如果是正常的文本responseObj为空
        if (responseObj == null || responseObj.size() == 0) {
            return true;
        }
        int evilFlag = responseObj.getJSONObject(0).getIntValue("EvilFlag");
        // EvilFlag(文本恶意等级):0、正常;1、恶意;2、可疑送审
        // EvilType(文本恶意类型):0、正常;1、政治;2、色情;3、辱骂/低俗;4、暴恐/毒品;5、广告/灌水;6、迷信/*;7、其他违法(如跨站追杀/恶意竞争等);8、综合;9、联系方式/链接 EvilKeywords(恶意关键词组)
        //当然这里的逻辑不一定很严谨,我这里是把所有不符合规范的全部都屏蔽和处理掉了
        if (evilFlag == 1 || evilFlag == 2) {
            return false;
        }
        return true;
    }

看看测试截图吧,本地调试调用珊瑚检测,可以很清晰的发现,你传入的每一个文本都可以很明确的给你分类
微信小程序珊瑚文本检测(Java案例)

管理员可以在珊瑚文本检测的后台查看到对应检测数据发生变化,当我们查看到对应量发生改变的时候,这里就代表我们成功的调用了微信官方的珊瑚文本检测的接口

微信小程序珊瑚文本检测(Java案例)
总结:

1.找到珊瑚文本的访问路径

2.按珊瑚检测接口提供的参数格式传参

3.接到返回值后合理的处理返回的结果(上述代码可以更加完善)

写作本篇文章的初衷是写珊瑚文本检测的时候没有找到合适的代码案例,很早前就解决了这个问题,现分享一下,当然相关的后续逻辑可以更加完善,期待更好的文章分享!


非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞

上一篇:JavaScript 中JsonArray 转 JsonObject


下一篇:Java解析json数组三种情况