Node.js

本文为您介绍如何使用阿里云视觉智能开放平台相关服务的Node.js SDK,具体包括SDK的获取和安装方法,以及SDK代码示例。

说明

阿里云视觉智能开放平台各类目视觉AI能力SDK接入、接口使用或问题咨询等,请通过钉钉群(23109592)加入阿里云视觉智能开放平台咨询群联系我们。

该版本SDK最低环境要求Node 8.x以上,如不满足请升级Node版本。

准备工作

在安装和使用阿里云SDK前,确保您已经注册阿里云账号并生成访问密钥(AccessKey)。具体操作,请参见创建AccessKey

执行以下命令,根据需要的AI类目安装SDK包。

  • 人脸人体:npm install @alicloud/facebody20191230

  • 文字识别:npm install @alicloud/ocr20191230

  • 商品理解:npm install @alicloud/goodstech20191230

  • 内容审核:npm install @alicloud/imageaudit20191230

  • 图像识别:npm install @alicloud/imagerecog20190930

  • 图像生产:npm install @alicloud/imageenhan20190930

  • 分割抠图:npm install @alicloud/imageseg20191230

  • 目标检测:npm install @alicloud/objectdet20191230

  • 图像分析处理:npm install @alicloud/imageprocess20200320

  • 视觉搜索:npm install @alicloud/imgsearch20200320

  • 视频生产:npm install @alicloud/videoenhan20200320

  • 视频理解:npm install @alicloud/videorecog20200320

  • 视频分割:npm install @alicloud/videoseg20200320

  • 异步任务管理:npm install @alicloud/viapi20230117

  • 人脸核身服务端20200910专用版本:npm install @alicloud/facebody20200910

SDK下载地址如下:

AI类目

SDK链接

Github链接

人脸人体

@alicloud/facebody20191230

facebody-20191230

文字识别

@alicloud/ocr20191230

ocr-20191230

商品理解

@alicloud/goodstech20191230

goodstech-20191230

内容审核

@alicloud/imageaudit20191230

imageaudit-20191230

图像识别

@alicloud/imagerecog20190930

imagerecog-20190930

图像生产

@alicloud/imageenhan20190930

imageenhan-20190930

分割抠图

@alicloud/imageseg20191230

imageseg-20191230

目标检测

@alicloud/objectdet20191230

objectdet-20191230

视觉搜索

@alicloud/imgsearch20200320

imgsearch-20200320

图像分析处理

@alicloud/imageprocess20200320

imageprocess-20200320

视频生产

@alicloud/videoenhan20200320

videoenhan-20200320

视频理解

@alicloud/videorecog20200320

videorecog-20200320

视频分割

@alicloud/videoseg20200320

videoseg-20200320

异步任务管理

@alicloud/viapi-20230117

viapi-20230117

人脸核身服务端20200910专用版本

@alicloud/facebody20200910

facebody-20200910

配置环境变量

配置环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET

重要
  • 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户

  • 请不要将AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

  • Linux和macOS系统配置方法

    1. 在IntelliJ IDEA中打开终端Terminal。

    2. 执行以下命令,配置环境变量。

      <access_key_id>需替换为您RAM用户的AccessKey ID,<access_key_secret>替换为您RAM用户的AccessKey Secret。如果后续需要进行更多权限相关的配置,具体操作请参见使用RAM Policy控制访问权限

      export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
      export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
  • Windows系统配置方法

    新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。然后重启Windows系统。本操作以Windows 10为例进行说明。

    1. 打开文件资源管理器,在此电脑上右键单击属性。

    2. 在右侧导航栏,单击高级系统配置

    3. 系统属性对话框的高级页签下,单击环境变量

    4. 环境变量对话框中,单击新建(W)image.png

    5. 在弹出的新建系统变量对话框中,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。

    6. 重启Windows系统,使配置生效。

SDK示例

本文以RecognizeBankCard为例。

文件在上海地域OSS

说明

每个类目的访问域名与对应Region开通能力,请参见访问域名

// 引入SDK
// 1、这里只是以ocr为例,其他能力请引入相应类目的包。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.com/document_detail/151960.html,可以知道该能力属于分割抠图类目,能力名称为SegmentCommonImage,那么您需要将代码中ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
const OcrClient = require('@alicloud/ocr20191230');
const OpenapiClient = require('@alicloud/openapi-client');
const TeaUtil = require('@alicloud/tea-util');

let config = new OpenapiClient.Config({
  // 2、创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
  // 如果您用的是RAM用户AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
  // 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行示例前必须先配置环境变量。 
  accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,   
  accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
});
// 3、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html
config.endpoint = `ocr.cn-shanghai.aliyuncs.com`;

// 4、这里只是以ocr为例,其他能力请引入相应类目的包下面的Client类
const client = new OcrClient.default(config);
// 5、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,具体入参设置需要参考具体能力的文档
const recognizeBankCardRequest = new OcrClient.RecognizeBankCardRequest({
  imageURL: "http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg"
});
let runtime = new TeaUtil.RuntimeOptions({ });
// 6、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意,recognizeBankCardWithOptions方法名也需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的,如能力名称为SegmentCommonImage,对应方法名应该为segmentCommonImageWithOptions。
client.recognizeBankCardWithOptions(recognizeBankCardRequest, runtime)
  .then(function(recognizeBankCardResponse) {
    // 获取整体结果
    console.log(recognizeBankCardResponse);
    // 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
    console.log(recognizeBankCardResponse.body.data.cardNumber);
  }, function(error) {
    // 获取整体报错信息
    console.log(error);
    // 获取单个字段
    console.log(error.data.Code);
  })
说明

需要修改的地方均在上述代码注释中标明,总结如下:

  1. 引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。

    例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。

  2. 访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错InvalidAction.NotFound。关于域名详情,请参见访问域名

  3. Client类需要使用相应类目的包下面的Client类。

  4. Request和Response需要使用相应类目的包和类。

  5. 调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的。例如,能力名称为SegmentCommonImage,对应方法名应该为segmentCommonImageWithOptions。

文件在本地或可访问的URL

重要

文件不在同一地域与文件在同地域区别在于需要使用xxxAdvanceRequest,文件是以Stream形式通过imageURLObject参数传入。

// 引入SDK
// 1、这里只是以ocr为例,其他能力请引入相应类目的包。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.com/document_detail/151960.html,可以知道该能力属于分割抠图类目,能力名称为SegmentCommonImage,那么您需要将代码中ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
const OcrClient = require('@alicloud/ocr20191230');
const OpenapiClient = require('@alicloud/openapi-client');
const TeaUtil = require('@alicloud/tea-util');
const fs = require('fs');
const http = require('http');
const https = require('https');

let config = new OpenapiClient.Config({
  // 2、创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
  // 如果您用的是RAM用户AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
  // 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行示例前必须先配置环境变量。 
  accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,   
  accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
});
// 3、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html
config.endpoint = `ocr.cn-shanghai.aliyuncs.com`;
// 4、这里只是以ocr为例,其他能力请引入相应类目的包下面的Client类
const client = new OcrClient.default(config);
const getResponse = function (httpClient, url) {
  return new Promise((resolve, reject) => {
    httpClient.get(url, function (response) {
      resolve(response);
    })
  })
}
const request = async function () {
  try {
    // 5、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,具体入参设置需要参考具体能力的文档
    let recognizeBankCardAdvanceRequest = new OcrClient.RecognizeBankCardAdvanceRequest();
    // 场景一,使用本地文件
    // const fileStream = fs.createReadStream('/tmp/bankCard.png');
    // recognizeBankCardAdvanceRequest.imageURLObject = fileStream;
    // 场景二,使用任意可访问的url
    const url = new URL("https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg");
    const httpClient = (url.protocol == "https:") ? https : http;
    recognizeBankCardAdvanceRequest.imageURLObject = await getResponse(httpClient, url);
    let runtime = new TeaUtil.RuntimeOptions({});
    // 6、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意,recognizeBankCardAdvance方法名也需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的,如能力名称为SegmentCommonImage,对应方法名应该为segmentCommonImageAdvance。
    client.recognizeBankCardAdvance(recognizeBankCardAdvanceRequest, runtime)
    .then(function(recognizeBankCardResponse) {
      // 获取整体结果
      console.log(recognizeBankCardResponse);
      // 获取单个字段
      console.log(recognizeBankCardResponse.body.data);
    }, function(error) {
      // 获取整体报错信息
      console.log(error);
      // 获取单个字段
      console.log(error.data.Code);
    })
  } catch (error) {
    console.log(error);
  }
}();
说明

需要修改的地方均在上述代码注释中标明,总结如下:

  1. 引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。

    例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。

  2. 访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错InvalidAction.NotFound。关于域名详情,请参见访问域名

  3. Client类需要使用相应类目的包下面的Client类。

  4. Request和Response需要使用相应类目的包和类。

  5. 调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的。例如,能力名称为SegmentCommonImage,对应方法名应该为segmentCommonImageAdvance。

常见问题

调用报错如何处理?

如果您的调用出现报错,请先尝试升级SDK包到最新版本,最新版本请参考各类目SDK链接。如果您的程序中同时引入了多个类目的包,也可以先尝试将这些包都升级到最新版本,避免版本之间的包冲突问题。

OpenAPI界面显示的最新包在npm仓库中找不到如何处理?

如果您发现OpenAPI界面显示的最新版本的包,在npm仓库中找不到,这是因为新版本的包刚刚发布,仓库同步可能会有延迟,如果遇到版本不存在的情况,请稍后再试或使用npm仓库中的最新版本。

该SDK包支持Web端或者小程序端直接使用吗?

不支持。想要在Web端或者小程序端直接使用,需要根据请求签名机制自行计算签名并进行请求。可以参考Web前端直接调用或者小程序场景下直接调用

技术支持

如果以上方法未能解决您的问题,请通过搜索钉钉群号(23109592)加入阿里云视觉智能开放平台咨询群联系我们。届时会有专业的技术人员与您对接解决问题。