背景需求:

我个人做了一款校友交流的小程序。里面有校友相册,校友聚会,校友资讯,校友互助等功能,校友从本地相册选一张或者多张图片后,连同文章内容保存到服务器。这里就涉及到内容安全了,提交审核没有通过也是因为这个没有做内容安全。防止一些色情低俗的事情发生。

当前可用的图片审核方案的优缺点:

方案1 :小程序自带的同步同步API:security.imgSecCheck

优点:小程序自带,无须额外申请,格式支持PNG、JPEG、JPG、GIF,单个 appId 调用上限为 2000 次/分钟,200,000 次/天,基本满足需要

缺点:图片大小限制1M ,图片尺寸不超过 750px x 1334px

虽然有图片尺寸限制,但是在实际应用中发现,尺寸到4000 x 4000都可以,但是4000以上会出现问题

方案2 :小程序自带的异步API: security.mediaCheckAsync

优点:单个文件大小不超过10M,解决手机拍照或者相册里的大图片限制

缺点:属于异步调用,必须先上传图片,处理不及时,最多可能30分钟才返回结果,需要提供回调URL来接受处理结果,不健康的图片无法实时处理,容易造成风险

方案3: 小程序服务市场的珊瑚图片安全

优点:非常好用,但是已经下架(2021年4月9日),无比郁闷

方案4: 小程序服务市场的天御

才上线没多久,按官方给出的文档无法正常调用成功,而且只有30天的免费使用时长

方案5 :腾讯云:T-Sec 天御 图片内容安全

优点:能精准识别图片中出现可能令人反感、不安全或不适宜内容,支持配置图片黑名单,识别自定义的图片类型。

缺点:文档调用复杂,价格高昂

方案6 :百度云:内容审核平台

优点:基于深度学习的智能内容审核方案,准确过滤图像和视频中的色情、暴恐、政治敏感、广告、恶心、不良场景等违规内容,也能从美观、

清晰等维度对图像进行筛选,紧贴业务需求,释放审核人力

缺点:1)还是价格!!!2)接入成本

我的解决思路

综合上述方案优缺点,我还是选择方案1(security.imgSecCheck),原因如下

1 小程序自带的API,调用方便,尤其是云函数调用方便

2 没有额外的申请流程

3 没有费用开销

4 量度次数上限基本满足我的校友录小程序需求

security.imgSecCheck 亟待解决的问题:

  1. 图片大小限制1M

  2. 图片尺寸限制的问题(官方表述750px x 1334px)

我的解决方案

虽然官方文档有些图片尺寸的上限,这也是当时我犹豫不决的原因,

但是在实际应用中发现,尺寸到4000 x 4000都可以实现检测,但是4000px以上会出现问题,

实际图片中出现上述大尺寸的少,所以可以暂且忽略,

只需要针对图片大于1M的进行压缩处理

大于1M的图片 思路:校友会小程序相册选图片 --> 判断图片是否大于1M --> 压缩图片 --> 上传图片流给security.imgSecCheck检测–>通过–>保存

小于1M的图片 思路:校友会小程序相册选图片 --> 判断图片是否大于1M --> 不压缩图片 --> 上传图片流给security.imgSecCheck检测–>通过–>保存

代码实现:

小程序端


/*** 选择上传图片 */bindChooseImgTap: function (e) {wx.chooseImage({count: this.data.imgMax - this.data.imgList.length, //默认9sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有sourceType: ['album', 'camera'], //从相册选择success: async (res) => {wx.showLoading({title: '图片校验中',mask: true});for (let k = 0; k < res.tempFiles.length; k++) {let size = res.tempFiles[k].size;let path = res.tempFiles[k].path;if (!contentCheckHelper.imgTypeCheck(path)) {wx.hideLoading();return pageHelper.showNoneToast('只能上传png、jpg、jpeg格式', 3000);}let imageMaxSize = 1024 * 1000 * this.data.imgUploadSize;console.log('IMG SIZE=' + size + ',' + size / 1024 + 'K');if (!contentCheckHelper.imgSizeCheck(size, imageMaxSize)) {wx.hideLoading();return pageHelper.showNoneToast('单张图片大小不能超过 ' + this.data.imgUploadSize + 'M', 3000);}// 图片校验if (this.data.isCheck) {let that = this;let callback = async function (path) {let check = await contentCheckHelper.imgCheckCloud(path);if (!check) {wx.hideLoading();return false;//return pageHelper.showNoneToast('存在不合适的图片, 已屏蔽', 3000);}that.setData({imgList: that.data.imgList.concat(path)});that.triggerEvent('myImgUploadEvent', that.data.imgList);return true;}// 图片大于1M,压缩if (size > 1000 * 1000) {wx.compressImage({src: path, // 图片路径quality: 50, // 压缩质量fail: function () {pageHelper.showModal('上传失败,请重新上传');},success: async function (res) {await callback(res.tempFilePath);}});} else {// 小于1M,不压缩if (!await callback(path)) return;}}else {//图片无须审核this.setData({imgList: this.data.imgList.concat(path)});this.triggerEvent('myImgUploadEvent', this.data.imgList);}}wx.hideLoading();}});}, 

云端

async function checkImg(imgData, mine) {// 下载CDN图片进行检查const axios = require('axios');let buffer = null;await axios({method: 'get',url: imgData,responseType: 'arraybuffer'}).then(res => {buffer = res.data;});console.log('buffer SIZE=' + buffer.length / 1024 + 'K');let cloud = cloudBase.getCloud();try {const result = await cloud.openapi.security.imgSecCheck({media: {contentType: 'image/png',value: buffer//value: Buffer.from(imgData, 'base64') // 这里必须要将小程序端传过来的进行Buffer转化,否则就会报错,接口异常}});console.log('imgcheck', result);if (!result || result.errCode !== 0)throw new AppError('图片内容不合适,请修改');} catch (err) {console.log('imgcheck ex', err);if (err.errMsg && err.errMsg.includes('invalid media size'))throw new AppError('图片过大,请修改');else if (err.errMsg && err.errMsg.includes('content size out of limit'))throw new AppError('图片尺寸过大,请修改');else if (err.errMsg && err.errMsg.includes('604102'))throw new AppError('图片过大,请上传较小图片');elsethrow new AppError('图片内容不合适,请修改');}}

测试情况:

校友会小程序中上传正常图片不含违法违规,测试50次,全部通过。校友会小程序上线后暂无发现检测失败情况。

小程序图片安全审核security.imgSecCheck不能校验超过1M图片的解决思路相关推荐

  1. 小程序图片安全审核方案与security.imgSecCheck不能校验超过1M图片的解决思路

    背景: 如上图,我的小程序涉及图片功能上线还没两天就被人搞了(上传了黄图然后被举报).通过查看得知UGC平台类小程序,涉及到平台内用户发布,平台都要对用户发布内容设置违法违规内容过滤机制.当天连夜修改 ...

  2. 开发提交审核流程_小程序如何提交审核,多久能通过?

    小程序制作时需要代码开发的,因此,如果是想成为小程序商家的老板们,可以通过客源多这样的小程序制作公司来完成. 当然,老板们也可以多方面的了解一些小程序的制作过程,如果是想自己开发的程序员,这些审核流程 ...

  3. 微信小程序开发(1)—— 微信小程序申请注册提交审核并发布详细流程

    一.微信小程序注册申请 作为开发者可以用测试版.也可以申请测试号.https://developers.weixin.qq.com/miniprogram/dev/devtools/sandbox.h ...

  4. 微信小程序发布上线流程以及个人小程序怎么通过审核

    小程序如何发布?微信小程序发布流程其实很简单,本文就介绍下如何发布上线流程以及个人小程序怎么通过审核 小程序在开发完成后,需要上传代码,设为体验版本,提交审核,发布上线这几个基本步骤 微信小程序发布流 ...

  5. java微信小程序太阳码中间logo变成成想要的图片

    微信小程序太阳码中间logo变成成想要的图片 ImageMergeUtil 类 imageGenerateUtil 类,getUrlByBufferedImage()方法 ImageMergeUtil ...

  6. 微信小程序iBeacon获取问题(wx.onBeaconUpdate不执行)【已解决】

    微信小程序iBeacon获取问题(wx.onBeaconUpdate不执行)[已解决] 问题描述 软件硬件 使用代码 问题现象 解决办法 问题描述 长话短说,使用某公司的iBeacon标签设备,开发微 ...

  7. 服务商模式下微信小程序支付时,一直报“支付验证签名失败”错误的解决办法

    在写小程序支付的时候,我是以服务商模式发起的支付,统一下单接口是调用成功的,但是在小程序调起支付的时候就报"支付验证签名失败"的错误. 主要有三个原因: 1.第二次签名用到的tim ...

  8. 小程序聊天室开发,发送文字,表情,图片,音频,视频,即时通讯,快速部署,可定制开发

    效果图: 微信小程序聊天功能模块,现在已经支持发送图片,文字,音频,视频,表情,在线即时聊天啦. 需要做的可以联系我微信.13977284413 上代码: <view class="b ...

  9. 微信小程序:一个json帮你完成分享朋友圈图片

    写在前面 最近在做小程序,发现制作分享到朋友圈图片是每个项目必须的.遇到坑比较多,写起来也比较繁琐,也没有找到类似组件,所以就自己动手写了一个. 演示 左侧是 canvasdrawer 绘制的,右侧是 ...

最新文章

  1. [树形dp] Jzoj P5233 概率博弈
  2. 和晋叔吹B讨论业务驱动与架构演进
  3. 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )
  4. atlas安装需要kafka吗_客厅吸顶灯安装方法你知道吗?安装需要注意什么
  5. linux内核杂记(11)-进程调度(6)
  6. NodeJS开发环境配置
  7. HTML5常用标签及特殊字符表
  8. linux下的ImageMagick安装
  9. SSAS parent/child dimension
  10. solaris 关闭、释放socket端口
  11. ComBox 绑定数据库
  12. 极客大学架构师训练营 框架设计、设计原则、设计模式 第四课 听课总结
  13. foxmail超大附件服务器文件怎么删,foxmail邮件太大怎么发?foxmail发送超大附件的方法...
  14. macOS Mojave 夜神模拟器打不开解决办法
  15. rk3399 Android9.0 ota升级失败
  16. php session fixation,什么是session fixation攻击
  17. CentOS7中怎样设置静态IP
  18. ListView中如何优化图片
  19. 打造卓越的 Android 游戏体验
  20. 第一性原理 《禅与计算机程序设计艺术》 / 陈光剑

热门文章

  1. 梦幻西游唯美版.gim(3D模型)文件格式结构记录
  2. 给大家介绍一个WIFI密码查看器,解密不安全的WIFI
  3. 电脑使用小技巧大合集
  4. 第 15 章 Div+CSS页面设计
  5. 微信公众号开发《四》使用微信JS-SDK实现手机图片上传,支持压缩、预览。并下载图片到自身服务器
  6. 设计模式之命令模式详解
  7. android opengl把经纬度点用红色点显示在3d地球上,android OpenGL ES 地球仪绘制——球体绘制及纹理映射——源码...
  8. css 浮动动画效果
  9. 叙述式教学方案计算机技术,叙述式教学设计方案模板(1)
  10. 计算机中成绩等级排名的函数怎么写,计算机二级excel函数总结(第一篇)