Node调用七牛云图片审核api鉴权简记

2024-07-16 | 82浏览 | 0评论 | 标签:七牛云

前言

国内涉及到UGC(用户生产内容)的服务,无论是图片、文字、视频甚至直播,都会涉及到内容审核,不然可能无法上线。最近在使用七牛云的图片审核api,大概流程是服务端(Node)调用七牛云图片审核api(文档地址),一直报错401"bad token"。

因为之前有项目使用过客户端直接上传到七牛云,服务端返回一个token给前端,前端上传时放在header.Authorization完成鉴权。token使用的是官方提供的sdk(文档地址)生成。

前端上传鉴权token

供前端上传使用的token代码大体长这样:

// 官方sdk
const qiniu = require('qiniu');
// 七牛云上传鉴权
const getUptoken = () => {
  return new Promise((resolve, reject) => {
    const options = {
      scope: 'YOUR-BUCKET-NAME',    //空间名称
    };
    const qiniuMac = new qiniu.auth.digest.Mac('YOUR-AK', 'YOUR-SK');
    const putPolicy = new qiniu.rs.PutPolicy(options);
    const uptoken = putPolicy.uploadToken(qiniuMac);
    if (uptoken) {
      resolve(uptoken);
    } else {
      reject('获取upToken失败')
    }
  })
}

用上面的token调用'http://ai.qiniuapi.com/v3/image/censor'会报401 “bad token”,推测可能是因为上面生成的token仅供客户端上传使用。经过翻阅sdk源码(源码地址),发现在/examples/atlab_check_qiniu_auth.js示例中调用了如下方法:

var accessToken = qiniu.util.generateAccessTokenV2(mac, reqURL, 'POST', contentType, reqBody);

服务端管理鉴权token

于是照着放进自己的代码中,竟然通过了鉴权,调用成功了。整理了一下图片审核完整的代码,大体长这样:

// 官方sdk
const qiniu = require('qiniu');
const request = require('./request');
// 七牛云管理鉴权
const getQiniuAccessToken = (url, body) => {
  return qiniu.util.generateAccessTokenV2(qiniuMac, url, 'POST', 'application/json', body);
}

// 图片审核
const imageLegalCheck = (base64 = '') => {
  const url = 'http://ai.qiniuapi.com/v3/image/censor';
  const data = JSON.stringify({
    data: {
      uri: base64
    },
    params: {
      scenes: ["pulp", 'terror'],
    }
  });
  const accessToken = getQiniuAccessToken(url, data);
  return request({
    url,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': accessToken,
    },
    data,
  }).then((res) => {
    if (res.result) {
      return res.result.suggestion === 'pass'
    } else {
      return false;
    }
  }).catch((err) => {
    return err;
  });
}

根据官方文档,data.uri支持base64和url两种方式。params.scenes支持pulp(黄)、terror(恐)、politician(政)、ads(广告)、behavior(不良场景)5种场景,可以单独设置,也可以以string[]格式组合。每种类型单独计费,大概8.5元/万张/类型,具体见官方收费说明。

结尾

此外,还有一些小细节需要注意,否则可能也会调不通。比如如果你使用base64格式,官方要求加上前缀“data:application/octet-stream;base64”;Content-Type需要设置为application/json;request方法根据你项目情况自己封装,我试过用axios和request都能调通,但如果使用async-request这种可能需要修改包源码才能支持。

至此,基于Node服务端直调七牛云图片审核api流程打通。

(本篇完。有疑问欢迎留言探讨)

留言:

*

* (方便回复通知)

打赏
编辑代码 运行结果
退出