涉黄图片提示无违规?security.imgSecCheck 彻底失效?这个Api让我醉了!?

【你是大佬,点进去看看我的问题吧,你一看就是很会】我在小程序中获取照片并转换Base64(可以通过工具正常转换成选择图片),再提交到云函数,在其中调用:

const result = await cloud.openapi.security.imgSecCheck({
                media: {
                    contentType: event.fileName?.toLowerCase().endsWith('.png') ? 'image/png' :
                        'image/jpeg',
                    value: buffer
                }
            });

权限也声明了:
{
    "permissions": {
        "openapi": [
            "security.imgSecCheck",
            "security.msgSecCheck",
            "security.mediaCheckAsync"
        ]
    }
}

但是最终经过重复测试发现无论提交什么图片都返回通过(包括涉黄图,经过测试发现照样返回通过)。

官方文档也没说这个方法被抛弃,说的正常可用。不知道是我的方式错还是咋的。我的云函数是:

const cloud = require('wx-server-sdk');
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV
});


exports.main = async (event, context) => {
    try {
        // Check if the file data is provided
        if (!event.file) {
            console.log('No image data received');
            return {
                code: 400,
                msg: '未接收到图片数据'
            };
        }


        // Convert base64 file to buffer
        const buffer = Buffer.from(event.file, 'base64');
        console.log('Buffer length:', buffer
            .length); // Log the buffer length to check if the image data is correctly converted


        // Check if the image data is empty
        if (buffer.length === 0) {
            console.log('Image data is empty');
            return {
                code: 400,
                msg: '图片数据为空'
            };
        }


        // Check file size (limit to 2MB)
        if (buffer.length > 1024 * 1024 * 2) { // 2MB limit
            console.log('Image size exceeds 2MB:', buffer.length); // Log the size of the image
            return {
                code: 400,
                msg: '图片大小超过限制'
            };
        }


        // Perform security check
        try {
            const result = await cloud.openapi.security.imgSecCheck({
                media: {
                    contentType: event.fileName?.toLowerCase().endsWith('.png') ? 'image/png' :
                        'image/jpeg',
                    value: buffer
                }
            });


            // Log the security check response for debugging
            console.log('Security check response:', JSON.stringify(result));


            if (result.errCode === 0) {
                return {
                    code: 200,
                    msg: '检测通过'
                };
            } else {
                console.log('Security check failed:', result);
                return {
                    code: 500,
                    msg: '图片检测未通过',
                    data: result
                };
            }
        } catch (secError) {
            console.error('Security check error:', secError);


            // Special handling for different error codes
            if (secError.errCode === 87014) {
                console.log('Image content violation detected');
                return {
                    code: 500,
                    msg: '图片内容违规'
                };
            } else if (secError.errCode === -604102) {
                console.log('Image format error detected');
                return {
                    code: 500,
                    msg: '图片格式错误'
                };
            }


            console.log('Unknown security check error:', secError);
            return {
                code: 500,
                msg: '图片检测失败',
                data: secError
            };
        }
    } catch (err) {
        console.error('Fatal error:', err);
        return {
            code: 502,
            msg: '系统错误',
            error: err.message
        };
    }
};

我希望使用相关的用户给个反馈,因为比较紧急。

再说一遍:小程序内选完图片后转成的base64内容绝对没有问题,可以正常转换成图片。

我想解决此类问题。

阅读 2.8k
avatarAI BotBETA
### 可能的问题及解决方案

1. **图片内容处理**:
   - **确认图片内容**:确保你测试的涉黄图片确实包含违规内容,因为有些图片可能由于处理或压缩等原因,其内容变得不那么明显或检测不出来。
   - **图片完整性**:确保在转换和传输过程中,图片的完整性和质量没有受到损害。

2. **API 调用参数**:
   - **`contentType`**:确保 `contentType` 正确设置,即图片类型(`image/png` 或 `image/jpeg`)与实际图片类型一致。
   - **`value`**:确认 `buffer` 变量正确地包含了图片的二进制数据。

3. **API 限制和状态**:
   - **API 状态**:有时 API 本身可能存在问题或维护状态,可以联系微信官方支持或查看相关文档和公告。
   - **敏感内容过滤策略**:微信对于违规内容的过滤策略可能有所调整,导致某些内容现在被认为是合规的。

4. **调试和日志**:
   - **详细日志**:增加更详细的日志记录,包括接收到的图片数据、转换后的 `buffer` 长度、API 调用返回的具体结果等,以便进一步分析问题。
   - **测试环境**:在测试环境中重现问题,确保所有配置和代码都是最新的。

5. **权限和配置**:
   - **权限声明**:确保小程序和云函数的权限声明正确,并且已经通过审核。
   - **云函数配置**:检查云函数的环境配置和依赖是否正确。

6. **联系支持**:
   - 如果上述步骤都无法解决问题,建议联系微信官方技术支持,提供详细的错误信息和日志,以便他们帮助你诊断问题。

### 总结

确保图片内容、API 调用参数、API 状态和权限配置都正确无误,同时增加详细的日志记录,以便进一步调试和解决问题。如果问题依然存在,建议联系微信官方技术支持。
2 个回答

我把我之前写的给你参考一下,在微信小程序中实现照片获取、Base64 转换、内容审核和上传到云函数的完整流程

项目目录结构

project-root/
│
├── cloudfunctions/
│   └── uploadImage/
│       ├── index.js
│       ├── package.json
│       └── node_modules/
│
├── miniprogram/
│   ├── pages/
│   │   └── index/
│   │       ├── index.js
│   │       ├── index.json
│   │       ├── index.wxml
│   │       └── index.wxss
│   ├── app.js
│   ├── app.json
│   └── app.wxss
│
└── project.config.json

云函数代码(cloudfunctions/uploadImage/index.js)

// 云函数入口文件
const cloud = require('wx-server-sdk');
cloud.init(); // 初始化云环境

// 云函数入口函数
exports.main = async (event, context) => {
  const { image } = event; // 从事件中获取 Base64 编码的图片
  try {
    // 将 Base64 编码的图片转换为 Buffer
    const buffer = Buffer.from(image.replace(/^data:image\/\w+;base64,/, ""), 'base64');
    
    // 上传图片到云存储
    const uploadResult = await cloud.uploadFile({
      cloudPath: `images/${Date.now()}.png`, // 生成唯一的文件路径
      fileContent: buffer, // 文件内容
    });

    // 返回文件 ID
    return {
      fileID: uploadResult.fileID,
      status: 'success',
    };
  } catch (error) {
    // 捕获并返回错误信息
    return {
      status: 'fail',
      error: error.message,
    };
  }
};

小程序页面代码(miniprogram/pages/index/index.js)

Page({
  data: {
    imageUrl: '', // 存储上传后的图片 URL
  },

  // 选择图片
  chooseImage() {
    wx.chooseImage({
      count: 1, // 只允许选择一张图片
      sizeType: ['original', 'compressed'], // 支持原图和压缩图
      sourceType: ['album', 'camera'], // 支持相册和相机
      success: (res) => {
        const tempFilePath = res.tempFilePaths[0]; // 获取图片临时路径
        this.convertToBase64(tempFilePath); // 转换为 Base64
      },
      fail: (err) => {
        console.error('Image selection failed:', err); // 处理选择图片失败
      }
    });
  },

  // 将图片转换为 Base64 编码
  convertToBase64(filePath) {
    const fs = wx.getFileSystemManager();
    fs.readFile({
      filePath: filePath, // 图片文件路径
      encoding: 'base64', // 编码格式
      success: (res) => {
        const base64Image = 'data:image/png;base64,' + res.data; // 拼接 Base64 前缀
        this.checkImage(base64Image); // 检查图片内容
      },
      fail: (err) => {
        console.error('Base64 conversion failed:', err); // 处理转换失败
      }
    });
  },

  // 检查图片内容是否违规
  checkImage(base64Image) {
    wx.cloud.callFunction({
      name: 'imgSecCheck', // 调用内容审核云函数
      data: {
        image: base64Image, // 传递 Base64 编码的图片
      },
      success: (res) => {
        if (res.result.errCode === 0) {
          // 图片审核通过,继续上传
          this.uploadImage(base64Image);
        } else {
          console.error('Image contains prohibited content'); // 处理违规内容
        }
      },
      fail: (err) => {
        console.error('Image security check failed:', err); // 处理审核失败
      }
    });
  },

  // 上传图片到云函数
  uploadImage(base64Image) {
    wx.cloud.callFunction({
      name: 'uploadImage', // 调用上传图片的云函数
      data: {
        image: base64Image, // 传递 Base64 编码的图片
      },
      success: (res) => {
        console.log('Image uploaded successfully:', res.result.fileID); // 上传成功
        this.setData({
          imageUrl: res.result.fileID, // 更新页面数据
        });
      },
      fail: (err) => {
        console.error('Image upload failed:', err); // 处理上传失败
      }
    });
  }
});

云函数内容审核代码(cloudfunctions/imgSecCheck/index.js)

// 云函数入口文件
const cloud = require('wx-server-sdk');
cloud.init(); // 初始化云环境

// 云函数入口函数
exports.main = async (event, context) => {
  const { image } = event; // 从事件中获取 Base64 编码的图片
  try {
    // 调用微信内容审核接口
    const result = await cloud.openapi.security.imgSecCheck({
      media: {
        contentType: 'image/png', // 图片类型
        value: Buffer.from(image.replace(/^data:image\/\w+;base64,/, ""), 'base64'), // 图片内容
      }
    });
    return result; // 返回审核结果
  } catch (error) {
    // 捕获并返回错误信息
    return {
      errCode: error.errCode || -1,
      errMsg: error.errMsg || 'Image security check failed',
    };
  }
};

小程序配置文件(project.config.json)

{
  "miniprogramRoot": "miniprogram/",
  "cloudfunctionRoot": "cloudfunctions/",
  "setting": {
    "urlCheck": true,
    "es6": true,
    "enhance": true,
    "postcss": true,
    "minified": true
  },
  "appid": "your-app-id",
  "projectname": "your-project-name"
}

检查一下传递给API的参数符合要求,比如contentTypevalue之类的格式。如果buffer数据没有正确传递,可能让API无法正常工作。再检查一下event.fileName是否正确解析和security.imgSecCheck权限已在小程序的config.json文件中正确配置。

另外,微信API有调用频率限制,如果在短时间内频繁调用,可能会导致返回结果不准确。

你可以增加更多的调试信息,比如打印传递给API的完整请求体和返回结果。
你还可以试试上传不同类型和内容的图片,包括明显违规和正常的图片,确认API的响应一致。

最后如果解决方法无效,你可以联系微信开发者支持团队解决问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏