文档首页 > > 最佳实践> 构建AI(图片鉴黄)应用> 构建后端功能程序

构建后端功能程序

分享
更新时间: 2020/05/13 GMT+08:00

创建后端功能函数

  1. 登录公有云控制台,进入“函数工作流服务控制台 > 函数”界面,单击“创建函数”,进入“创建函数”界面。
  2. 在“创建函数”界面填写函数信息,如图1所示。

    • 模板:选择空白模板。
    • 函数名称:输入“AIDemo”。
    • 所属应用选择默认的“default”。
    • 委托名称:选择“serverless_trust”。
    • 所选委托必选包含API网关、图片检测服务、对象存储服务的访问权限,有关委托的创建过程,请参考创建委托
    • 运行时语言:选择“Node.js 6.10”。
    • 函数执行入口:输入“index.handler”。
    • 代码上传方式:选择“在线编辑”。
    • 在代码框输入以下代码。
      const https = require('https');
      const fs = require('fs');
      const ObsClient = require('esdk-obs-nodejs');    // 引用OBS SDK
      let PAYLOAD = {};
      let CONTEXT = null;
      const PATH = '/tmp/image.png'
      exports.handler = function (event, context, callback) {
          CONTEXT = context;
          
          // 跨域验证
          if (event.httpMethod === "OPTIONS") {
              console.log('OPTIONS request, pass.');
              const result = {
                  body: '',
                  headers: {
                      "Content-Type":"application/json",
                      "Access-Control-Allow-Origin": "*",
                      "Access-Control-Allow-Headers": "Content-Type,Accept",
                      "Access-Control-Allow-Methods": "GET,POST,PUT,DELETE"
                  },
                  statusCode: 200,
                  isBase64Encoded: false
              };
              callback(null, result);
              return;
          }
          
          new Promise(function(resolve, reject) {
              var token = context.getToken();
              const options = {
                  hostname: 'moderation.cn-north-1.myhuaweicloud.com',
                  port: 443,
                  path: '/v1.0/moderation/image',
                  method: 'POST',
                  headers: {
                      'Content-Type': 'application/json;charset=utf8',
                      'X-Auth-Token': token
                  }
              };
              PAYLOAD = constructPayload(event);
              console.log("Sending request to AIS...")
              const req = https.request(options, (res) => {
                  var status = res.statusCode
                  console.log("status:",  status)
                  res.on('data', (d) => {
                      resolve(d.toString());
                  });
              });
      
              req.on('error', (e) => {
                  console.error(e);
              });
              req.write(JSON.stringify(PAYLOAD));
              req.end();
          }).then(function(value) {
              // check image and save if porn
              const resultObj = JSON.parse(value);
              const bucket = context.getUserData('BUCKET');
      
              const apigBody = {
                result: resultObj.result.detail.porn,
                suggestion: resultObj.result.suggestion,
                eiInfo: resultObj.result,
              };
              saveImage(PAYLOAD.image, resultObj.suggestion || '', bucket).then((err) => {
                  // return apig result
                  const result = {
                      body: JSON.stringify(apigBody),
                      headers: {
                          "Content-Type":"application/json",
                          "Access-Control-Allow-Origin": "*",
                          "Access-Control-Allow-Headers": "Content-Type,Accept",
                          "Access-Control-Allow-Methods": "GET,POST,PUT,DELETE"
                      },
                      statusCode: 200,
                      isBase64Encoded: false
                  };
                  callback(null, result);
              });
          });	
      }
      function constructPayload(event) {
          if (event.httpMethod != "POST") {
              return {
                  "image": "",
                  "url": "https://bjbucket.obs.myhwclouds.com/70923411.jpg",
                  "categories": [
                      "porn"
                  ],
                  "threshold" : ""
              }
          }
          const bodyStr = new Buffer(event.body, 'base64').toString('ascii');
          const body = JSON.parse(bodyStr);
          if (body.url != null && body.url.trim() != "") {
              return {
                  "image": "",
                  "url": body.url,
                  "categories": [
                      "porn"
                  ],
                  "threshold" : ""
              }
          } else {
              return {
                  "image": body.image,
                  "url": "",
                  "categories": [
                      "porn"
                  ],
                  "threshold" : ""
              };
          }
      }
      
      function saveImage(image, imageInfo, bucket) {
          return new Promise((resolve, reject) => {
              if (/*imageInfo !== 'pass'*/false) {
                  console.log('>>>>>>>not pass, start save image');
                  writeImage(image).then((err) => {
                      if (!err) {
                          uploadImage(PATH, bucket).then((err) => {
                              resolve(err);
                          });
                      } else {
                          resolve(err)
                      }
                  });
              } else {
                  resolve(null);
              }
          });
      }
      
      
      function writeImage(image) {
          return new Promise((resolve, reject) => {
              const imageBuffer = new Buffer(image, 'base64');
              fs.writeFile(PATH, imageBuffer, function(err) {
                  console.log('>>>>>>>>>>write file:', err);
                  resolve(err);
              }); 
          });
      }
      
      function uploadImage(path, bucket) {
          return new Promise((resolve, reject) => {
              // upload path to bucket;
              const client = buildOBSClient(CONTEXT);
              client.putObject({
                  Bucket: bucket,
                  Key: `image-${(new Date()).valueOf()}.png`,
                  SourceFile: path
              }, (err, result) => {
                  if (err) {
                      console.error('Upload Error-->' + err);
                  } else {
                      console.log('Upload Status-->' + result.CommonMsg.Status + '. uploading file OK!');
                  }
                  resolve(err);
              });
          });
      }
      
      function buildOBSClient(context) {
          // Obtains a temporary AK and SK to access OBS. An agency is required to access IAM.
          const my_access_key = context.getAccessKey();
          const my_secret_access_key = context.getSecretKey();
          console.log('begin create obs client!');
          return new ObsClient({
              access_key_id: my_access_key,
              secret_access_key: my_secret_access_key,
              server: 'obs.cn-north-1.myhwclouds.com'
          });
      }
      

    图1 函数配置

  3. 在页面右侧查看函数配置及计费信息,确认无误后,单击“创建函数”,完成函数创建。

为后端函数创建APIG触发器

  1. 用户登录FunctionGraph,进入“函数”界面,单击AIDemo函数名称,进入函数详情页。
  2. 在函数详情页界面,进入“触发器”页签,单击“创建触发器”,如图2所示,弹出“创建触发器”界面。

    图2 创建触发器

  3. 在下拉框中选择“API Gateway服务(APIG)”,配置触发器信息,如图3所示。

    • API名称:输入“API_AIDemo”
    • 分组:选择“function”,分组的创建过程请参考创建API分组
    • 发布环境:选择“RELEASE”
    • 安全认证:选择“None”
    • 请求协议:选择“HTTPS”
    • 后端超时:输入“5000”
    图3 配置触发器

    发布环境选择Release,创建触发器时,会在API网关生成API,并且将生成的API发布,可以直接调用。

  4. 单击“确定”,创建触发器。

    后端功能函数的APIG触发器调用地址:https://d237af6bc4214cc383b5f2b40a3af234.apigw.cn-north-1.huaweicloud.com/AIDemo,构建前端函数时需要用到。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问