当前位置: 首页 > news >正文

微信小程序中基于java后端实现官方的文本内容安全识别msgSecCheck

在开发微信小程序中,发布审核的时候官方审核要求要对用于UGC生成的内容做安全审核,对违规内容进行处理,这里用到了官方给出的文本内容安全识别和多媒体内容安全识别,这次是基于java后端去实现的,过去的文章有写用云开发调用,可以参考以前的文章。

码字不易,看之前麻烦点个赞赞~谢谢!

文本内容安全识别

接口应在服务器端调用,不可在前端(小程序、网页、APP等)直接调用,具体可参考接口调用指南。

接口英文名:msgSecCheck

该接口用于检查一段文本是否含有违法违规内容。

应用场景:

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

查询参数Query String Parameters

参数名类型必填说明
access_tokenstring接口调用凭证

请求体Request Payload

参数名类型必填说明
contentstring需检测的文本内容,文本字数的上限为2500字,需使用UTF-8编码
versionnumber接口版本号,2.0版本为固定值2
scenenumber场景枚举值(1 资料;2 评论;3 论坛;4 社交日志)
openidstring用户的openid(用户需在近两小时访问过小程序)
titlestring文本标题,需使用UTF-8编码
nicknamestring用户昵称,需使用UTF-8编码
signaturestring个性签名,该参数仅在资料类场景有效(scene=1),需使用UTF-8编码

3. 返回参数

返回体Response Payload

参数名类型说明
errcodenumber错误码
errmsgstring错误信息
detailobjarray详细检测结果
trace_idstring唯一请求标识,标记单次请求
resultobject综合结果

解析

首先是查询参数access_token这个怎么获取?

XpayUtils.java
public String getAccessToken() throws Exception { long now = System.currentTimeMillis(); if (cachedAccessToken != null && now < tokenExpireMillis) return cachedAccessToken; synchronized (this) { now = System.currentTimeMillis(); if (cachedAccessToken != null && now < tokenExpireMillis) return cachedAccessToken; String url = "https://api.weixin.qq.com/cgi-bin/token" + "?grant_type=client_credential" + "&appid=" + XpayConfig.APP_ID + "&secret=" + XpayConfig.APP_SECRET; String raw = restTemplate.getForObject(url, String.class); JSONObject json = JSONObject.fromObject(raw); if (!json.containsKey("access_token")) { throw new Exception("获取 access_token 失败:" + raw); } cachedAccessToken = json.getString("access_token"); long expiresIn = json.getLong("expires_in"); tokenExpireMillis = now + (expiresIn - 300) * 1000L; return cachedAccessToken; } }

XpayConfig.java

public class XpayConfig { // 小程序 AppID / AppSecret public static final String APP_ID = ""; public static final String APP_SECRET = ""; }

然后是文本内容安全接口实现

// ==================== 文本 msg_sec_check ==================== @Data @NoArgsConstructor public static class TextSecCheckReq { /** 需检测文本,≤2500 字,UTF-8 */ private String content; /** 接口版本,2.0 固定为 2 */ private Integer version; /** 场景:1资料 2评论 3论坛 4社交日志 */ private Integer scene; /** 用户 openid(近两小时需访问过小程序) */ private String openid; private String title; private String nickname; /** 个性签名,仅 scene=1 有效 */ private String signature; } /** * 文本内容安全识别(转发 POST https://api.weixin.qq.com/wxa/msg_sec_check) */ @PostMapping("/text/check") public String textSecCheck(@RequestBody TextSecCheckReq req) { IsInterface<JSONObject> res = new IsInterface<>(); try { if (req.getContent() == null || req.getContent().trim().isEmpty()) { res.setCode("fail"); res.setMsg("content不能为空"); return String.valueOf(JSONObject.fromObject(res)); } String text = req.getContent(); if (text.length() > 2500) { res.setCode("fail"); res.setMsg("content超过2500字上限"); return String.valueOf(JSONObject.fromObject(res)); } if (req.getScene() == null || req.getOpenid() == null || req.getOpenid().trim().isEmpty()) { res.setCode("fail"); res.setMsg("scene、openid不能为空"); return String.valueOf(JSONObject.fromObject(res)); } int version = req.getVersion() != null ? req.getVersion() : 2; JSONObject body = new JSONObject(); body.put("content", text); body.put("version", version); body.put("scene", req.getScene()); body.put("openid", req.getOpenid().trim()); if (req.getTitle() != null && !req.getTitle().isEmpty()) { body.put("title", req.getTitle()); } if (req.getNickname() != null && !req.getNickname().isEmpty()) { body.put("nickname", req.getNickname()); } if (req.getSignature() != null && !req.getSignature().isEmpty()) { body.put("signature", req.getSignature()); } JSONObject wx = wxaOpenApiUtils.postJson("/wxa/msg_sec_check", body); res.setCode("success"); res.setMsg("ok"); res.setObj(wx); return String.valueOf(JSONObject.fromObject(res)); } catch (Exception e) { res.setCode("fail"); res.setMsg("调用失败:" + e.getMessage()); return String.valueOf(JSONObject.fromObject(res)); } }

wxaOpenApiUtils.java

/** * 小程序服务端调用微信开放接口(非米大师 xpay),共用 {@link XpayUtils#getAccessToken()}。 */ @Component public class WxaOpenApiUtils { private final RestTemplate restTemplate = new RestTemplate(); @Autowired private XpayUtils xpayUtils; /** * POST JSON 到 api.weixin.qq.com 指定路径(不含域名) * * @param wxPath 如 {@code /wxa/msg_sec_check} * @param body JSON 请求体 * @return 微信返回的 JSON */ public JSONObject postJson(String wxPath, JSONObject body) throws Exception { String token = xpayUtils.getAccessToken(); String url = "https://api.weixin.qq.com" + wxPath + "?access_token=" + token; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> entity = new HttpEntity<>(body.toString(), headers); String raw = restTemplate.postForObject(url, entity, String.class); return JSONObject.fromObject(raw); } }

综合结果可以看下面官方提供的信息,来判断是否违规

Res.resultObject Payload

综合结果

参数名类型说明
suggeststring建议,有risky、pass、review三种值
labelnumber命中标签枚举值,100 正常;10001 广告;20001 时政;20002 色情;20003 辱骂;20006 违法犯罪;20008 欺诈;20012 低俗;20013 版权;21000 其他
http://www.jsqmd.com/news/759966/

相关文章:

  • 对比在 Taotoken 上调用不同模型的单次请求 token 消耗与费用
  • 告别VideoCapture:手把手教你用海康SDK+C++为OpenCV项目接入工业相机
  • 万方AI率60%怎么降?率零3.2元单价宿舍拼单实测94%达标率! - 我要发一区
  • 【Dify多模态开发黄金标准】:20年AI架构师亲授——为什么92%的团队在第3步就失败?
  • 终极网易云音乐美化插件:打造沉浸式播放体验的完整指南
  • 在UOS/麒麟上部署东方通TongWeb 7.0.4.2,我踩过的那些坑和避坑指南
  • PyQt5避坑指南:从QWidget到QMainWindow迁移、内存泄漏排查到多线程通信
  • 雀魂牌谱屋:三步搭建你的麻将数据分析平台
  • WarcraftHelper终极指南:魔兽争霸III六大兼容性问题一站式解决方案
  • 告别Gradle Daemon警告:深入理解Android Studio、JDK与JAVA_HOME的三角关系
  • 基于扩散模型的文本生成高保真图像研究,从噪声到杰作:基于扩散模型的文本生成高保真图像完全指南
  • 香橙派Zero2保姆级教程:手把手教你为Ender-3 V2编译Klipper固件(含避坑指南)
  • Dify金融审计落地全攻略:从零搭建符合银保监要求的AI审计系统
  • 免费降AI工具vs付费降AI工具:效果差在哪4个核心维度? - 我要发一区
  • 从零开始:用ADS 2023手把手教你设计2.4GHz Wi-Fi LNA(基于ATF-54143,附模型文件)
  • 如何快速掌握GARbro:视觉小说资源提取终极实用指南
  • 面向智慧农业的病虫害识别与预警无人机系统,从田间到云端:我用深度学习给庄稼装上“AI天眼”——病虫害识别与预警无人机系统全解析
  • 全面解析九大网盘直链下载神器:告别限速困扰的终极解决方案
  • 避坑指南:从Flink旧版Group Window迁移到TVF窗口聚合的完整流程(附1.17版本示例)
  • Navicat Mac版无限试用重置终极指南:3种方法破解14天限制的完整解决方案
  • ArchLinux + Windows双系统蓝牙共享实战:从注册表到配置文件的完整解析
  • 如何快速掌握LeRobot:5步搭建AI机器人控制系统的终极指南
  • 蓝桥杯嵌入式G4选手必看:LCD显示乱码时,别忘了检查LED这个‘捣蛋鬼’
  • D3KeyHelper:5分钟搞定暗黑3自动战斗,彻底告别手指酸痛!
  • LLM推理优化:系统挑战与分层解决方案
  • 串口服务器— 设计方案
  • Palworld存档工具终极指南:如何安全修复损坏的存档文件
  • 初创团队借助统一大模型 API 平台加速产品原型开发
  • HiveWE:魔兽争霸III现代化地图编辑器终极指南
  • MediaPipe TouchDesigner插件终极指南:30分钟打造专业级AI视觉应用