【传送带->相芯科技官网】
一、access_token
所有要用的接口都需要url拼接access_token。
我这里把获取access_token需要用到的key和secret放在了faceunity.js中。
先生成signature,再生成access_token。
// api:获取faceunity的access_token
let fu = require("./../common/faceunity");
let { createHash } = require("crypto");
function signature(params, secret) {
let keys = Object.keys(params).sort();
let sign_str = "";
keys.forEach((value, index) => {
//构造被签名串
sign_str += value + params[value];
});
sign_str += secret; //连接secrect
return createHash("sha1")
.update(sign_str)
.digest("hex"); //返回被签名串的sha1值
}
app.get("/getFaceunityAccessToken", function (req, response) {
response.writeHead(200, { //解决跨域问题
"Content-Type": "text/html",
charset: "utf-8",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "PUT,POST,GET,DELETE,OPTIONS"
});
let params = {
params: "test",
Key: fu.key
};
let sign = signature(params, fu.secret);
console.log("生成sign", sign);
let url ="https://token.faceunity.com/api/v1/GetAccessToken?params=test&Key=" +
fu.key + "&Signature=" + sign;
let body = "";
let access_token = "";
https .get(url, res => {
res .on("data", data => {
body += data;
}).on("end", () => {
access_token = JSON.parse(body).data.access_token;
console.log(access_token);
response.end(JSON.stringify({'access_token':access_token}));
}) .on("error", e => {
console.log("error:" + e.message);
});
});
二、美颜接口/api/beauty
方法一:官网的node示例有一点小错误,先是按我自己的逻辑弄出来了,这里直接使用了后台项目文件夹中的图片。
let formData = {
image: fs.createReadStream( // 获取原图片文件流
"../festival-back/upload/faceunity-1551862111687.jpg"
)
};
// access_token是之前获取的
request.post({
url: `https://api.faceunity.com/api/beauty?access_token=${access_token}`,
formData: formData
}, function (err, body) {
if (err) {
console.log("错误",err);
}
fs.writeFileSync( // 写入新图片
'../festival-back/upload/beauty-'+Date.now()+'.jpg',
Buffer.from(JSON.parse(body.body).data.data)
);
});
方法二:官网方法有1处进行了修正。
async function submit(access_token, data) {
return new Promise((reslove, reject) => {
request.post(
{
url: `https://api.faceunity.com/api/beauty?access_token=${access_token}`,
formData: data
},
function optionalCallback(err, body) {
if (err) {
reject(err);
}
reslove(JSON.parse(body.body));
// 修正:原为"reslove(JSON.parse(body));",返回的body本就是json对象了,
// body里面的body是个JSON字符串,也是包含了图片Buffer的属性。
}
);
});
}
(async () => {
try {
const result = await submit(access_token, formData);
fs.writeFileSync('../upload/response.jpg', Buffer.from(result.data.data));
} catch (e) {
console.log('Submit Error:', e);
}
})()