本篇文章搜索RefererAPI为百度api里很基础的一个,欢迎各路大神纠正和补充,第一次看此api文档感觉没什么,但是俗话说纸上得来终觉浅,绝知此事要躬行。
接入流程
调用前提
1.需要企业认证的百度智能云账号
2.Referer API需要通过百度智能云服务器BCC(北京region)进行访问(需要有一台百度智能云北京区域服务器)
API认证字符串格式
bce-auth-v{version}/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}/{signedHeaders}/{signature}
version是正整数。
timestamp是生成签名时的UTC时间。
expirationPeriodInSeconds表示签名有效期限。
signedHeaders是签名算法中涉及到的头域列表。头域名之间用分号(;)分隔,如host;x-bce-date。列表按照字典序排列。(本API签名仅使用host和x-bce-date两个header)
signature是256位签名的十六进制表示,由64个小写字母组成。
在使用搜索Referer API服务之前,您需要验证使用者身份,并了解UriEncode算法和签名算法,具体请参考鉴权认证机制。
调用API实践
// eqid可以从Referer URL中获取,通常网站的访问日志中会包含该信息
let api_url = "http://referer.bj.baidubce.com/v1/eqid/" + eqid;
// 解析url
let url_obj = url.parse(api_url, true);
// 获取当前时间(utc格式)
let utctime = timeUtil.time2UTC(timeUtil.getFullDate());
// 签名Key。百度智能云不直接使用SK对待签名串生成摘要。相反的,百度智能云首先使用SK和认证字符串前缀生成signingKey,然后用signingKey对待签名串生成摘要。
let signing_key = util.format('bce-auth-v1/%s/%s/%s', CONST.BAIDU.AccessKey, utctime, 1800);
// 加密signing_key
signing_key = crypto.createHmac('sha256', CONST.BAIDU.SecretKey).update(signing_key).digest('hex');
// 对HTTP请求中的Header部分进行选择性编码的结果。
let canonical_headers = util.format("host:%s", url_obj.host);
// 生成CanonicalRequest
let canonical_request = util.format("%s\n%s\n\n%s", "GET", url_obj.path, canonical_headers);
// 生成signature
let signature = crypto.createHmac('sha256', signing_key).update(canonical_request).digest('hex');
// 生成认证字符串
let authorization = util.format("bce-auth-v1/%s/%s/%s/%s/%s", CONST.BAIDU.AccessKey, utctime, 1800, "host", signature);
// 调用接口
let options = {
method: "GET",
headers: {
"accept-encoding": "gzip, deflate",
host: urlObj.host,
"content-type": "application/json; charset=utf-8;",
"x-bce-date": utctime,
authorization: authorization,
accept: "*/*"
},
url: url_api
};
// 返回数据示例{"wd": "%E7%AB%99%E9%95%BF","eqid": "dd2fcaa200000b440000000255bb2d70"}
let result = await rp(options);
引入资源解释
1.url: github地址node-url
2.timeUtil:封装时间帮助类,核心为moment.js
// moment转utc时间格式:
moment(dateStr).utc().format()