阿里云人脸比对API封装

这是根据封装是根据阿里云官方给的Demo进行修改的,当时是因为编写微信小程序云函数需要使用到阿里云人脸比对接口,才对其进行封装的。

记录下来,方便下次使用。

复制下来可以直接使用。

用到的依赖如下,使用npm安装:

  • request
  • url
  • crypto
/**
 * 文件说明:阿里云人脸比对API封装
 */

var request = require('request');
var url = require('url');
var crypto = require('crypto');
var date = new Date().toUTCString()

/////////////////////////////////////////////////////////////////////////
/**
 * 配置信息
 * ak_id :阿里云控制台获取的AccessKey
 * ak_secret :阿里云控制台获取的AccessKeySecret 
 * Api_Url :阿里云控制台获取Api接口地址
 */
// AccessKey
var ak_id = '';
// AccessKeySecret 
var ak_secret = '';
// APIURL
var Api_Url = ''

/**
 * 读取本地图片并转base64编码
 */
// 图片1
var fs = require("fs");
var filePath = "01.jpg";
var imageData = fs.readFileSync(filePath);
var imageBase64 = imageData.toString("base64");
//图片2
var fs = require("fs");
var filePath = "02.jpg";
var imageData = fs.readFileSync(filePath);
var imageBase64_2 = imageData.toString("base64");

var options = {
    url: Api_Url,
    method: 'POST',
    body: '{"type": "1", "content_1":"' + imageBase64 + '","content_2":"' + imageBase64 + '"}',
    headers: {
        'accept': 'application/json',
        'content-type': 'application/json',
        'date': date,
        'Authorization': ''
    }
};
/////////////////////////////////////////////////////////////////////////


md5 = function (buffer) {
    var hash;
    hash = crypto.createHash('md5');
    hash.update(buffer);
    return hash.digest('base64');
};

sha1 = function (stringToSign, secret) {
    var signature;
    return signature = crypto.createHmac('sha1', secret).update(stringToSign).digest().toString('base64');
};

var body = options.body || '';
var bodymd5;
if (body === void 0 || body === '') {
    bodymd5 = body;
} else {
    bodymd5 = md5(new Buffer(body));
}

var stringToSign = options.method + "\n" + options.headers.accept + "\n" + bodymd5 + "\n" + options.headers['content-type'] + "\n" + options.headers.date + "\n" + url.parse(options.url).path;

var signature = sha1(stringToSign, ak_secret);
var authHeader = "Dataplus " + ak_id + ":" + signature;
options.headers.Authorization = authHeader;

// 封装函数
function AliFace(options) {
    let promise = new Promise(function (resolve, reject) {
        request(options, (error, response, body) => {
            // 失败
            if (error) {
                console.log("error", error)
                reject()
            }
            console.log("step4-response body:", response.statusCode, body)
            console.log(typeof (body))
            // 成功
            // 注意:这里的body是string类型
            resolve(body)
        })
    })
    return promise;
}



/**
 * 调用接口进行测试
 */
AliFace(options).then(
    function (res) {
        console.log(res)
    }
)
<think>我们正在讨论如何在React应用中集成腾讯云API实现人脸识别功能。根据用户需求,我们需要一个具体的集成指南和实现方法。 参考已有的引用内容: -引用[1]提到在React中使用FaceIOAPI进行人脸识别,这展示了在React中集成第三方人脸识别API的一般模式。-引用[2]提到SpringBoot系统集成腾讯云或阿里云人脸识别API,这提供了使用云服务商API的参考。因此,我们可以借鉴这些思路,具体实现腾讯云人脸识别API在React中的集成。 步骤: 1.注册腾讯云账号并开通人脸识别服务。2.创建API密钥(SecretId和SecretKey)。3.在React项目中安装必要的依赖。4.编写前端组件调用腾讯云API。注意:由于前端直接调用API会暴露SecretKey,存在安全隐患,因此实际项目中应该通过后端服务来调用腾讯云API,前端只与后端交互。但用户要求的是React集成,所以我们先提供前端直接调用的方法(仅用于测试),然后说明生产环境应通过后端代理。 具体步骤:###1.腾讯云人脸识别服务准备-访问腾讯云[人脸识别控制台](https://console.cloud.tencent.com/aiface)开通服务。-在[访问管理](https://console.cloud.tencent.com/cam/capi)创建API密钥(SecretId和SecretKey)。###2.创建React项目(如果已有项目可跳过) ```bashnpxcreate-react-app face-recognition-democd face-recognition-demo```###3.安装依赖我们需要安装`tencentcloud-sdk-nodejs`的客户端库。由于在React(前端)中直接使用Node.jsSDK可能会遇到问题(因为SDK是为Node.js环境设计的),我们可以使用腾讯云提供的Web端SDK(如果有)或者通过HTTP请求直接调用API。但腾讯云人脸识别API通常要求使用签名,前端直接计算签名较复杂且不安全。 因此,我们推荐两种方式:-方式一(测试用):使用前端直接调用,但需要将签名计算放在前端(不推荐生产环境)。-方式二(生产环境):通过自己的后端服务调用腾讯云API,前端只与后端通信。 这里我们先给出方式一的示例(仅用于测试),然后给出方式二的架构。 ####方式一:前端直接调用(测试用) 安装用于生成签名的库(腾讯云签名方法需要crypto-js): ```bashnpm installcrypto-js``` 然后,在React组件中编写调用代码。以人脸检测为例: ```jsximportReact,{ useRef }from 'react';import CryptoJS from'crypto-js';constFaceRecognition= ()=> {constvideoRef= useRef(null);const canvasRef =useRef(null);//腾讯云配置const secretId ='你的SecretId'; //注意:这里暴露了密钥,仅用于测试const secretKey ='你的SecretKey';const endpoint= 'iai.tencentcloudapi.com';//人脸识别API接口//生成签名const getAuthorization= (payload) =>{constservice ='iai';const algorithm= 'TC3-HMAC-SHA256';consttimestamp =Math.floor(Date.now() /1000);constdate =new Date(timestamp*1000).toISOString().substr(0,10);//*************步骤1:拼接规范请求串*************const httpRequestMethod= 'POST';constcanonicalUri= '/';const canonicalQueryString= '';constcanonicalHeaders= 'content-type:application/json;charset=utf-8\nhost:'+ endpoint+ '\n';constsignedHeaders= 'content-type;host';const payloadHash =CryptoJS.SHA256(JSON.stringify(payload)).toString(CryptoJS.enc.Hex);constcanonicalRequest= httpRequestMethod+ '\n'+canonicalUri+ '\n'+canonicalQueryString +'\n' +canonicalHeaders +'\n' +signedHeaders +'\n' +payloadHash;//*************步骤2:拼接待签名字符串*************const credentialScope =date +'/' +service +'/tc3_request';const hashedCanonicalRequest =CryptoJS.SHA256(canonicalRequest).toString(CryptoJS.enc.Hex);const stringToSign= algorithm+ '\n'+timestamp +'\n' +credentialScope +'\n' +hashedCanonicalRequest;//*************步骤3:计算签名*************const kDate =CryptoJS.HmacSHA256(date,'TC3' +secretKey);const kService =CryptoJS.HmacSHA256(service, kDate);constkSigning =CryptoJS.HmacSHA256('tc3_request', kService);constsignature =CryptoJS.HmacSHA256(stringToSign,kSigning).toString(CryptoJS.enc.Hex);//*************步骤4:拼接Authorization*************constauthorization =algorithm +'Credential=' +secretId+ '/'+ credentialScope +',SignedHeaders=' +signedHeaders+', Signature=' +signature;return{authorization,timestamp};};constdetectFace= async(imageBase64)=> {constpayload ={Image:imageBase64,//图片的base64编码//其他参数根据API文档};const{ authorization, timestamp} =getAuthorization(payload);try {constresponse =await fetch(`https://${endpoint}`,{method:'POST',headers:{'Authorization': authorization,'Content-Type':'application/json;charset=utf-8','X-TC-Action': 'DetectFace',//调用的接口动作'X-TC-Timestamp': timestamp.toString(),'X-TC-Version':'2020-03-03',//版本号'X-TC-Region': 'ap-beijing',//地域},body: JSON.stringify(payload)});constdata= awaitresponse.json();console.log(data);//处理返回结果} catch(error) {console.error(error);}};//从视频中捕获图像并转换为base64constcaptureImage= ()=> {constvideo= videoRef.current;const canvas= canvasRef.current;if (!video ||!canvas) return;const context= canvas.getContext('2d');canvas.width =video.videoWidth;canvas.height= video.videoHeight;context.drawImage(video,0,0, canvas.width,canvas.height);const imageData =canvas.toDataURL('image/jpeg');//去掉base64头部(如:data:image/jpeg;base64,)const base64 =imageData.split(',')[1];detectFace(base64);};//启动摄像头const startCamera =async() =>{try {conststream =await navigator.mediaDevices.getUserMedia({ video: true});if (videoRef.current){videoRef.current.srcObject =stream;}}catch (err){console.error("摄像头访问错误:", err);}};return (<div><video ref={videoRef}autoPlayplaysInlinestyle={{ width: '100%' }}/><canvasref={canvasRef} style={{ display: 'none'}} /><button onClick={startCamera}>启动摄像头</button><buttononClick={captureImage}>人脸识别</button></div>);}; exportdefault FaceRecognition; ```注意:此方法将SecretId和SecretKey暴露在前端代码中,非常不安全,只适用于测试。生产环境必须使用后端服务。####方式二:通过后端服务调用(推荐)架构: -前端(React):捕获图像,将图像发送到自己的后端。-后端(例如Node.js、SpringBoot等):接收图像,使用腾讯云SDK调用人脸识别API,然后将结果返回给前端。 这里我们给出一个简单的Node.js后端示例(使用Express)和React前端的交互。 #####后端(Node.js)1.创建后端项目,安装依赖: ```bashnpm init-ynpminstall expressbody-parsertencentcloud-sdk-nodejs cors```2.创建`server.js`:```javascriptconstexpress =require('express');const bodyParser =require('body-parser');const cors= require('cors');const tencentcloud= require("tencentcloud-sdk-nodejs"); constapp =express();app.use(cors());app.use(bodyParser.json());const IaiClient= tencentcloud.iai.v20200303.Client;const clientConfig= {credential: {secretId:"你的SecretId",secretKey:"你的SecretKey",},region:"ap-beijing", //地域profile:{httpProfile: {endpoint: "iai.tencentcloudapi.com",},},}; app.post('/detect-face',async (req,res)=> {try{const {imageBase64 }= req.body;constclient =new IaiClient(clientConfig);const params= {Image: imageBase64,};const response= awaitclient.DetectFace(params);res.json(response);} catch(error) {console.error(error);res.status(500).json({ error: 'Internal ServerError'});} });constPORT =3001; app.listen(PORT,() =>{console.log(`Serverrunning onport ${PORT}`);}); ```#####前端(React) 修改之前的组件,改为调用自己的后端:```jsx// ...其他代码同上constdetectFace= async(imageBase64) =>{try {constresponse =await fetch('http://localhost:3001/detect-face', {method: 'POST',headers: {'Content-Type': 'application/json'},body:JSON.stringify({ imageBase64})});const data= awaitresponse.json();console.log(data);//处理返回结果} catch(error) {console.error(error);} };// ...其他代码同上```这样,密钥就保存在后端,前端只与后端通信,保证了安全性。###总结在React中集成腾讯云人脸识别API,推荐使用后端代理的方式,避免暴露密钥。前端负责捕获图像并发送到后端,后端使用腾讯云SDK调用API并返回结果。###注意事项1.腾讯云人脸识别API有多个功能(人脸检测、人脸比对、人脸搜索等),请根据需求选择。2.前端图像捕获时,注意图像质量(清晰度、光线等)会影响识别结果。 3.生产环境务必使用HTTPS保证数据传输安全。###相关问题1.如何优化前端人脸识别过程中的用户体验(例如实时检测)?2.腾讯云人脸识别API的调用费用如何?3.如何在后端实现人脸识别的结果缓存以提高性能?4.如何处理人脸识别中的隐私和安全问题?</think>### React 集成腾讯云人脸识别 API 指南 #### 一、前期准备 1. **开通腾讯云服务** - 登录[腾讯云控制台](https://console.cloud.tencent.com/),开通人脸识别服务(产品名:人脸核身) - 创建 API 密钥:获取 `SecretId` 和 `SecretKey`(需妥善保管)[^2] 2. **安装 React 依赖** 在 React 项目中安装腾讯云 SDK: ```bash npm install tencentcloud-sdk-nodejs ``` #### 二、核心集成步骤 ##### 1. 创建人脸识别服务封装(`faceService.js`) ```javascript import tencentcloud from "tencentcloud-sdk-nodejs"; const IaiClient = tencentcloud.iai.v20200303.Client; // 初始化客户端 const client = new IaiClient({ credential: { secretId: process.env.REACT_APP_TENCENT_SECRET_ID, secretKey: process.env.REACT_APP_TENCENT_SECRET_KEY, }, region: "ap-beijing", // 按实际地域修改 }); // 人脸检测方法 export const detectFace = async (imageBase64) => { try { const params = { Image: imageBase64, NeedFaceAttributes: 1, // 返回人脸属性 }; const response = await client.DetectFace(params); return response.FaceInfos[0]; } catch (error) { console.error("人脸检测失败:", error); throw error; } }; // 人脸比对方法 export const compareFaces = async (sourceImage, targetImage) => { const params = { ImageA: sourceImage, ImageB: targetImage, }; return await client.CompareFace(params); }; ``` ##### 2. 创建摄像头组件(`FaceCamera.js`) ```jsx import React, { useRef, useState } from 'react'; const FaceCamera = ({ onCapture }) => { const videoRef = useRef(null); const canvasRef = useRef(null); const [error, setError] = useState(''); // 启动摄像头 const startCamera = async () => { try { const stream = await navigator.mediaDevices.getUserMedia({ video: true }); videoRef.current.srcObject = stream; } catch (err) { setError("摄像头访问失败: " + err.message); } }; // 捕获图像 const captureImage = () => { const video = videoRef.current; const canvas = canvasRef.current; canvas.width = video.videoWidth; canvas.height = video.videoHeight; const ctx = canvas.getContext('2d'); ctx.drawImage(video, 0, 0, canvas.width, canvas.height); // 获取Base64格式图像 const imageData = canvas.toDataURL('image/jpeg').split(',')[1]; onCapture(imageData); }; return ( <div className="camera-container"> {error && <div className="error">{error}</div>} <video ref={videoRef} autoPlay playsInline muted /> <canvas ref={canvasRef} style={{ display: 'none' }} /> <button onClick={startCamera}>启动摄像头</button> <button onClick={captureImage}>拍照识别</button> </div> ); }; ``` ##### 3. 主应用组件(`App.js`) ```jsx import React, { useState } from 'react'; import FaceCamera from './FaceCamera'; import { detectFace, compareFaces } from './faceService'; function App() { const [result, setResult] = useState(null); const [loading, setLoading] = useState(false); const handleFaceCapture = async (imageData) => { setLoading(true); try { const detectionResult = await detectFace(imageData); setResult({ age: detectionResult.Age, gender: detectionResult.Gender === 1 ? '男' : '女', expression: detectionResult.Expression === 1 ? '微笑' : '普通' }); } catch (e) { setResult({ error: "识别失败" }); } finally { setLoading(false); } }; return ( <div className="App"> <h1>人脸识别系统</h1> <FaceCamera onCapture={handleFaceCapture} /> {loading && <div>识别中...</div>} {result && !result.error && ( <div className="result"> <h2>识别结果</h2> <p>年龄: {result.age}岁</p> <p>性别: {result.gender}</p> <p>表情: {result.expression}</p> </div> )} {result?.error && <div className="error">{result.error}</div>} </div> ); } ``` #### 三、安全与优化措施 1. **环境变量配置** 在项目根目录创建 `.env.local` 文件: ``` REACT_APP_TENCENT_SECRET_ID=YOUR_SECRET_ID REACT_APP_TENCENT_SECRET_KEY=YOUR_SECRET_KEY ``` 2. **安全增强建议** - 生产环境应通过后端服务代理 API 调用,避免前端暴露密钥[^2] - 使用 HTTPS 确保数据传输安全 - 添加人脸活体检测(腾讯云提供 `DetectLiveFace` 接口) 3. **性能优化** - 图片压缩:上传前将图片尺寸缩小到 640x480 ```javascript // 在captureImage中添加 const resizeImage = (imageData, maxWidth = 640) => { // 实现图片缩放逻辑 } ``` - 添加请求超时处理 - 使用 Web Worker 进行后台处理 #### 四、常见问题解决 1. **摄像头权限问题** - 在 `public/manifest.json` 中添加权限声明: ```json "permissions": ["videoCapture"] ``` 2. **跨域问题** 开发环境中在 `package.json` 添加代理: ```json "proxy": "https://iai.tencentcloudapi.com" ``` 3. **SDK 兼容性问题** 如遇到浏览器兼容问题,可改用直接调用 REST API: ```javascript fetch('https://iai.tencentcloudapi.com', { method: 'POST', headers: { 'X-TC-Action': 'DetectFace', 'X-TC-Version': '2020-03-03', 'Authorization': `TC3-HMAC-SHA256 ...` // 生成签名 }, body: JSON.stringify({ Image: imageBase64 }) }) ``` ### 注意事项 1. 腾讯云人脸识别服务有免费额度限制,超出需付费 2. 图片格式要求:Base64 编码(不超过 5MB),支持 JPG/PNG/BMP 3. 推荐使用腾讯云提供的 `DetectLiveFace` 接口实现活体检测增强安全性 ### 相关问题 1. 如何实现 React 中的人脸识别登录功能? 2. 腾讯云人脸识别阿里云人脸识别 API 有哪些主要区别? 3. 如何在 React Native 中集成人脸识别功能? 4. 人脸识别服务如何应对不同光照条件下的识别挑战? 5. 如何设计人脸识别系统的异常处理机制? [^1]: 如何在 React.js 中通过人脸识别对用户进行身份验证? [^2]: Springboot基于人脸识别的智慧实验室系统ns3s9
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开源分享汇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值