前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习NestJS开发小程序后台(二)检测图片敏感内容

学习NestJS开发小程序后台(二)检测图片敏感内容

原创
作者头像
一起重学前端
修改2024-09-23 16:52:28
880
修改2024-09-23 16:52:28

前言

在当今数字化时代,小程序以其便捷、高效的特点成为了人们生活和工作中不可或缺的一部分。而在小程序开发中,上传图片功能常常是关键需求之一。然而,随着网络环境的日益复杂,确保上传的图片以及相关文本不含有敏感内容变得至关重要。今天,我们就来探讨一下如何在小程序开发中实现上传图片功能中,需要关注的内容安全监测接口进行严格的校验。

小程序获取图片,未检测图片是否含有敏感内容(黄赌毒)

  • 微信公众平台建议:1.尽快排查删除小程序中已存在的违规内容,包括但不限于平台验证时发布的测试文字、图片等;2.调用内容安全监测接口校验文本/图片是否含有敏感内容,降低被恶意利用导致传播恶意内容的风险。
小程序信息安全风险
小程序信息安全风险

第一版express版本 调用微信小程序官方img_sec_check接口(官方废弃),也没有通过官方代码审核。。。后面发现nsfwjs,一个JavaScript 库。

代码语言:javascript
复制
const wxImgCheck = async (token, file) => {
    const url = `https://api.weixin.qq.com/wxa/img_sec_check?access_token=${token}`;
    const stream = fs.createReadStream(file.path);
    const form = new FormData();
    form.append('media', stream);

    const getHeaders = form => {
        return new Promise((resolve, reject) => {
            form.getLength((err, len) => {
                if (err) { reject(err); };
                const headers = Object.assign({ 'Content-Length': len, }, form.getHeaders());
                resolve(headers);
            });
        })
    }

    try {
        const headers = await getHeaders(form);
        const res = await axios.post(url, form, { headers });
        if (res.data.errcode === 40001 || res.data.errcode === 40013) {
            global.AccessToken.flag = true;
            const newToken = await getToken();
            await wxImgCheck(newToken, file);
        }
        
        return res.data;
    } catch (err) {
        return {
            errcode: 500,
            message: err.message
        }
    }
}

今天要介绍的是 nsfwjs

nsfwjs 库,基于 TensorFlow.js 构建。 是一个用于检测图像是否包含不适当内容(Not Safe For Work,NSFW)的 JavaScript 库。

nsfwjs 的工作原理主要基于深度学习中的卷积神经网络(Convolutional Neural Network,CNN)技术来对图像进行分类,以判断图像是否属于不适当内容。

1. 前端项目直接使用

nsfwjs有三个model库:MobileNetV2、MobileNetV2Mid、InceptionV3

我们也能使用自己的匹配库

代码语言:ts
复制
const model = nsfwjs.load("/path/to/model/directory/");
代码语言:ts
复制
import * as nsfwjs from 'nsfwjs';


const imgbody = document.getElementById('img');
const img = new Image();
img.crossOrigin = 'anonymous';
img.src =
'https://xxxxxxxx.jpg';
imgbody?.appendChild(img);
if (img) {
  const model = await nsfwjs.load('MobileNetV2');
  const predictions = await model.classify(img);
  console.log('Predictions: ', predictions);
}

下图百分比就是鉴别结果,主要区分如下:

  • Drawing 绘图 – 安全的工作图纸(包括动漫)
  • Hentai – 变态和色情图纸
  • Neutral – 工作中性图像安全
  • Porn – 色情图片,性行为
  • Sexy – 色情图片,而不是色情内容
2. 通过nestjs后台调用nsfwjs

类似前端直接使用,需要注意的是,model.classify img参数类型

代码语言:bash
复制
nsfwjs.classify(img: tf.Tensor3D | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, topk?: number): Promise<Array<nsfwjs.predictionType>>
代码语言:ts
复制
import {
  Controller,
  Post,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import * as nsfwjs from 'nsfwjs';
import * as tf from '@tensorflow/tfjs-node';
import { readFileSync } from 'fs';
import jpeg from 'jpeg-js';

const convert = async (img) => {
  // Decoded image in UInt8 Byte array
  const image = await jpeg.decode(img, { useTArray: true });

  const numChannels = 3;
  const numPixels = image.width * image.height;
  const values = new Int32Array(numPixels * numChannels);

  for (let i = 0; i < numPixels; i++)
    for (let c = 0; c < numChannels; ++c)
      values[i * numChannels + c] = image.data[i * 4 + c];

  return tf.tensor3d(values, [image.height, image.width, numChannels], 'int32');
};

@Controller('image-check')
export class ImageCheckController {
  @Post('detect')
  @UseInterceptors(FileInterceptor('image'))
  async detectImage(@UploadedFile() file) {
    if (!file) {
      return { error: 'No image uploaded.' };
    }
    const model = await nsfwjs.load('InceptionV3');
    const buffer = readFileSync(file.path);
    const image = await convert(buffer);
    const predictions = await model.classify(image);
    return predictions;
  }
}
判断图片非法业务逻辑

假设如果色情概率超过一定阈值则认为非法,看业务需要,根据预测结果中成人内容(pornhentai)的概率是否超过一定阈值(这里假设为 0.5)来判断图片是否非法,并返回判断结果。你可以根据实际情况调整阈值和具体的判断逻辑。(宁可错杀一千,也不放过一个! 哈哈哈)

代码语言:ts
复制
let isImageIllegal = false;
if (predictions[0].probability > 0.5 && predictions[0].className === 'Porn') {
  isImageIllegal = true;
}
后续

本文只是给大家提供一个可行性思路,具体方案可以根据实际业务来处理。(腾讯云、阿里云也提供了图片检测云api,当然需要收钱~)ps:因为nsfwjs的准确率官方模型的准确率小型模型的准确率约为 90%,中型模型约为 93%,实际使用也存在一些误差,主要是可以白嫖。

最后大家可以试试,nsfwjs在线地址

nsfwjs在线地址
nsfwjs在线地址

参考

https://nsfwjs.com/

https://github.com/infinitered/nsfwjs

腾讯技术创作特训营s9

学习NestJS的第一个接口(一)

学习NestJS开发小程序后台(一)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 今天要介绍的是 nsfwjs
      • 1. 前端项目直接使用
      • 2. 通过nestjs后台调用nsfwjs
      • 判断图片非法业务逻辑
      • 后续
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档