关于自动化:玩转ApiFox脚本实现自动化

6次阅读

共计 5268 个字符,预计需要花费 14 分钟才能阅读完成。

> > 前言:之前做一个京东联盟的自动化脚本,好多人不了解为什么,这次做淘宝的自动化签名,并解说一下实现细节,带你理解前置脚本,后置脚本的用法。## 自动化原理

> 个人观点
> 自动化就像流水线一样,通过解析固定的规定,来达到自动化。## 前置和后置脚本的区别(它们的性能就如同名字一样)> 前置脚本:在申请发送之前,你能够通过脚本来做某些事件,值得注意的是 ** 变量 ** 是在前置脚本前面才执行的,所有有些问题可能不是你问题。> 前置脚本:在申请响应之前,你能够通过脚本来做某些事件。***

## 淘宝联盟接入文档

#### 调用入口

调用 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.get
app_key=12345678
session=test
timestamp=2016-01-01 12:00:00
format=json
v=2.0
sign_method=md5
业务参数:fields=num_iid,title,nick,price,num
num_iid=11223344

2. 按 ASCII 程序排序(去掉等号)app_key12345678
fieldsnum_iid,title,nick,price,num
formatjson
methodtaobao.item.seller.get
num_iid11223344
sessiontest
sign_methodmd5
timestamp2016-01-01 12:00:00
v2.0

3. 拼接参数名与参数值

app_key12345678fieldsnum_iid,title,nick,price,numformatjsonmethodtaobao.item.seller.getnum_iid11223344sessiontestsign_methodmd5timestamp2016-01-01 12:00:00v2.0

4. 生成签名
   假如 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&timestamp=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

![图片.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/77fd39f39f49430981c742ef490829bc~tplv-k3u1fbpfcp-watermark.image?)

#### 设置相干环境下的服务器地址


![图片.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e40440f8a32c406bb70005f2b506b9f9~tplv-k3u1fbpfcp-watermark.image?)


## 开始剖析参数指定规定

> 通过调用示例咱们能够晓得所有的参数都在 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 参数中来解决。## 增加接口

>  这里以:淘宝客 - 专用 - 淘口令生成,来作为示例。业务申请和响应参数

![图片.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/93f3d891ee124f81989f8010c928d2e5~tplv-k3u1fbpfcp-watermark.image?)


增加 Query 参数

![图片.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d0f0a8f6d02b42bf89820231ec226aa7~tplv-k3u1fbpfcp-watermark.image?)

增加 Body 参数和响应参数

![图片.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7f5976f7fba64105a40a602cf64c552b~tplv-k3u1fbpfcp-watermark.image?)

### 应用前置脚本解决

```
// 定义公共参数
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)
正文完
 0