当前位置:首页 > 百科

小程序文本内容安全识别怎么调用

小程序上线审核被驳回,小程序文理由写着“涉及用户生成内容,本内别调需接入内容安全识别”。容安这不是全识建议,是小程序文硬性要求。只要你的本内别调小程序有评论、昵称、容安签名、全识聊天、小程序文发帖任意一项,本内别调微信就默认你要自己把好关。容安调用接口本身不复杂,全识难的小程序文是搞清楚什么时候调、调哪个、本内别调返回结果怎么处理。容安

微信提供两个核心接口:msgSecCheck 和 mediaCheckAsync。前者查文本,后者查图片和音频。文本场景下,msgSecCheck 是同步返回的,你传一段文字进去,微信告诉你是否违规。听起来简单,但实际用起来有几个坑。

先看调用方式。小程序端不能直接调这个接口,必须走服务端。流程是这样:小程序把用户输入的文字发给自己的后端,后端拿着 access_token 去请求微信的 https://api.weixin.qq.com/wxa/msg_sec_check?access_token=xxx。请求体是 JSON,核心字段就一个:content,要检测的文本。微信返回的 JSON 里有个 result 字段,suggest 为 pass 就放行,review 是疑似,risky 就是违规。

我见过有人直接把用户输入拼在 URL 里用 GET 请求,结果中文乱码导致误判。必须用 POST,且 Content-Type 设为 application/json。还有编码问题,微信要求 UTF-8,如果你后端默认 GBK,传过去就是一堆问号,接口可能返回 pass,但实际内容根本没检测到。这种静默失败最危险。

另一个细节:msgSecCheck 对文本长度有限制,官方说 2500 字以内,但实测超过 1000 字就容易超时。长文本建议切片,比如每 500 字调一次,任意一片违规就整体拦截。切片时注意不要从词语中间切断,否则“习近平”切成“习近”和“平”,两片都过,合起来就漏了。按标点或空格切更稳妥。

频率限制也得留意。access_token 本身有 2 小时有效期和调用频次限制,msgSecCheck 单账号每秒最多 200 次。小规模应用无所谓,但如果是聊天室场景,用户一秒钟发几十条消息,很容易撞限流。解决办法是本地先做一层敏感词过滤,把明显违规的拦掉,剩下的再送微信接口。敏感词库不用自己维护,GitHub 上搜“敏感词库”能找到现成的,几万条那种,加载到内存里用 Trie 树匹配,单次检测不到 1 毫秒。

返回结果里还有个 label 字段,标识违规类型,比如 100 是正常,20001 是广告,20002 是时政。别忽略这个,它能帮你做分级处理。广告类可以只警告不封号,时政类直接拒绝。我见过一个社交小程序,把所有 risky 都当同一类处理,结果用户发个“出售二手书”被永久封禁,投诉到微信那边,最后还是得人工解封。

异步接口 mediaCheckAsync 是另一个逻辑。你传图片 URL 或音频 URL 过去,微信返回一个 trace_id,检测结果通过消息推送发到你配置的服务器地址。这里必须用 https 且端口只能是 443,微信不认其他端口。回调消息是加密的,要用 EncodingAESKey 解密,解出来是个 XML,里面 isrisky 为 0 表示安全,1 表示违规。很多人卡在解密这一步,建议直接用微信官方提供的 WXBizMsgCrypt 库,别自己手写 AES。

实际项目中,我建议把文本检测做成中间件。用户提交内容时,先过本地敏感词,再过 msgSecCheck,两层都通过才写数据库。如果 msgSecCheck 返回 review,不要直接拒绝,先存起来标记为待审核,同时给用户提示“内容正在审核中”。这样既不影响体验,又留了人工复核的余地。微信的 review 判定准确率大概七成,全拦会误伤正常用户。

最后说个真实案例。有个做校园二手交易的小程序,昵称字段没接内容安全,结果有人把昵称改成“代刷网课+微信xxx”,审核时没发现,上线三天被用户举报,小程序被限制搜索能力一周。后来他们把所有用户输入字段——昵称、签名、商品描述、留言——全部接入了 msgSecCheck,每次调用耗时约 80 毫秒,用户几乎无感。成本方面,这个接口目前免费,但每天有调用上限,具体数值微信没公开,实测个人主体小程序每天一万次左右没问题。

接口调用本身半小时能跑通,真正花时间的是边界情况处理:空字符串、纯表情、特殊符号、超长文本、并发请求。把这些想清楚,内容安全这关就算过了。

分享到: