> > 前言:之前做一个京东联盟的自动化脚本,好多人不了解为什么,这次做淘宝的自动化签名,并解说一下实现细节,带你理解前置脚本,后置脚本的用法。## 自动化原理> 个人观点> 自动化就像流水线一样,通过解析固定的规定,来达到自动化。## 前置和后置脚本的区别(它们的性能就如同名字一样)> 前置脚本:在申请发送之前,你能够通过脚本来做某些事件,值得注意的是**变量**是在前置脚本前面才执行的,所有有些问题可能不是你问题。> 前置脚本:在申请响应之前,你能够通过脚本来做某些事件。***## 淘宝联盟接入文档#### 调用入口调用API的服务URL地址,开放平台目前提供了2个环境给ISV应用:正式环境,海内环境。| 调用环境 | 服务地址 || -------- | ------------------------------------- || 正式环境 | https://gw.api.taobao.com/router/rest || 海内环境 | https://api.taobao.com/router/rest |#### 公共参数调用任何一个API都必须传入的参数,目前反对的公共参数有:| 参数名称 | 参数类型 | 是否必须 | 参数形容 || ----------- | -------- | -------- | ------------------------------------------------------------ || method | String | 是 | 具体API接口名称,例:taobao.item.seller.get || app_key | String | 是 | TOP调配给利用的AppKey。例:12345678 || session | String | 可选 | 用户受权胜利后,平台颁发给利用的受权session,具体介绍请点击这里。当此API文档的标签上注明:“须要受权”,则此参数必传;“不须要受权”,则此参数不须要传。 || timestamp | String | 是 | 工夫戳,格局为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2016-01-01 12:00:00。淘宝API服务端容许客户端申请最大时间误差为10分钟。 || v | String | 是 | API协定版本,可选值:2.0 || sign_method | String | 是 | 签名的摘要算法,可选值为:hmac,md5,hmac-sha256。 || sign | String | 是 | API输出参数签名后果,签名算法参照上面的介绍。 || format | String | 否 | 返回内容响应格局。不传默认为xml格局,可选值:xml,json。 || simplify | Boolean | 否 | 是否采纳精简JSON返回格局,仅当format=json时无效,可选值:false,true,不传为false。 |### 签名算法> 为了避免API调用过程中被黑客歹意篡改,调用任何一个API都须要携带签名,TOP服务端会依据申请参数,对签名进行验证,签名不非法的申请将会被回绝。TOP目> 前反对的签名算法有三种:MD5(sign_method=md5),HMAC_MD5(sign_method=hmac),HMAC_SHA256(sign_method=hmac-sha256),签名大体过程如下:1. 对所有API申请参数(包含公共参数和业务参数,但除去sign参数和byte[]类型的参数),依据参数名称的ASCII码表的程序排序。如:foo:1, bar:2, foo_bar:3, foobar:4排序后的程序是bar:2, foo:1, foo_bar:3, foobar:4。2. 将排序好的参数名和参数值拼装在一起,依据下面的示例失去的后果为:bar2foo1foo_bar3foobar4。3. 把拼装好的字符串采纳utf-8编码,应用签名算法对编码后的字节流进行摘要。如果应用MD5算法,则须要在拼装的字符串前后加上app的secret后,再进行摘要,如:md5(secret+bar2foo1foo_bar3foobar4+secret);如果应用HMAC_MD5算法,则须要用app的secret初始化摘要算法后,再进行摘要,如:hmac_md5(bar2foo1foo_bar3foobar4)。4. 将摘要失去的字节流后果应用十六进制示意,如:hex("helloworld".getBytes("utf-8")) = "68656C6C6F776F726C64"阐明:MD5和HMAC_MD5都是128位长度的摘要算法,用16进制示意,一个十六进制的字符能示意4个位,所以签名后的字符串长度固定为32个十六进制字符。### 调用示例以taobao.item.seller.get调用为例,具体步骤如下:1. 设置参数值公共参数:method=taobao.item.seller.getapp_key=12345678session=testtimestamp=2016-01-01 12:00:00format=jsonv=2.0sign_method=md5业务参数:fields=num_iid,title,nick,price,numnum_iid=112233442. 按ASCII程序排序(去掉等号)app_key12345678fieldsnum_iid,title,nick,price,numformatjsonmethodtaobao.item.seller.getnum_iid11223344sessiontestsign_methodmd5timestamp2016-01-01 12:00:00v2.03. 拼接参数名与参数值app_key12345678fieldsnum_iid,title,nick,price,numformatjsonmethodtaobao.item.seller.getnum_iid11223344sessiontestsign_methodmd5timestamp2016-01-01 12:00:00v2.04. 生成签名 假如app的secret为helloworld,则签名后果为:hex(md5(helloworld+按程序拼接好的参数名与参数值+helloworld)) = "66987CB115214E59E6EC978214934FB8"5. 组装HTTP申请 将所有参数名和参数值采纳utf-8进行URL编码(参数程序可随便,但必须要包含签名参数),而后通过GET或POST(含byte[]类型参数)发动申请,如:`http://gw.api.taobao.com/router/rest?method=taobao.item.seller.get&app_key=12345678&session=test×tamp=2016-01-01+12%3A00%3A00&format=json&v=2.0&sign_method=md5&fields=num_iid%2Ctitle%2Cnick%2Cprice%2Cnum&num_iid=11223344&sign=66987CB115214E59E6EC978214934FB8`## 配置环境参数### 设置全局变量AppKey和AppSecret#### 设置相干环境下的服务器地址## 开始剖析参数指定规定> 通过调用示例咱们能够晓得所有的参数都在url中,也就是说参数存在于Query参数中。1. 公共参数必选有:method ,app_key ,timestamp ,v ,sign_method ,sign 。> app_key:能够应用全局变量 。> v:能够固定为 2.0> sign_method:能够固定:hmac,md5,hmac-sha256 其中一个2. 此时须要解决的公共参数有:method,timestamp ,sign 。> method:应用失常Query参数> timestamp :通过脚本解决> sign :通过脚本解决3. 业务参数应用body参数中来解决。## 增加接口> 这里以:淘宝客-专用-淘口令生成,来作为示例。业务申请和响应参数增加Query参数增加Body参数和响应参数### 应用前置脚本解决```//定义公共参数let params = new Map([ ["method", pm.request.url.query.get("method")], ["app_key", pm.globals.get("app_key")], ["timestamp", getTimestamp()], ["v", "2.0"], ["sign_method", "md5"], ["format", "json"]])//业务参数pm.request.body.urlencoded.each(item => { params.set(item.key, item.value);})//获取工夫function getTimestamp() { let zero = function (number) { if (number > 10) return number; return `0${number}`; } let date = new Date(); let timestamp = { year: date.getFullYear(), month: zero(date.getMonth() + 1), date: zero(date.getDate()), hour: zero(date.getHours()), minute: zero(date.getMinutes()), second: zero(date.getSeconds()) } return `${timestamp.year}-${timestamp.month}-${timestamp.date} ${timestamp.hour}:${timestamp.minute}:${timestamp.second}`;}//签名封装function signature([...params]) { let stringToBeSigned = pm.globals.get("app_secret"); params.sort(); params.forEach(([key, value]) => { stringToBeSigned += `${key}${value}` }); stringToBeSigned += pm.globals.get("app_secret"); return CryptoJS.MD5(stringToBeSigned).toString().toUpperCase();}//参数会重组,这里先移除pm.request.url.query.remove("method");//重组参数pm.request.body.urlencoded = [];params.forEach((value,key) => { pm.request.body.urlencoded.add({ key: key, value: value })})//增加签名参数pm.request.body.urlencoded.add({ key: "sign", value: signature(params)})```能够去官网下载操作一下:[www.apifox.cn](https://www.apifox.cn/?utm_source=liam)