百度BCE API授权认证爬坑与搜索RefererAPI实践

关键词:nodejs百度RefererAPI实践nodejs referer
描述:百度BCE API授权认证爬坑与搜索RefererAPI实践

本篇文章搜索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()

3.crypto:nodejs加密,官方文档地址http://nodejs.cn/api/crypto.html

4.request-promise:支持Promise的HTTP请求客户端,github地址request-promise

5.CONST:定义常量文件,CONST.BAIDU.AccessKey为百度智能云账号的AccessKey,CONST.BAIDU.SecretKey为百度智能云账号的SecretKey

相关推荐: