玩转ApiFox脚本实现自动化
前言:之前做一个京东联盟的自动化脚本,好多人不理解为什么,这次做淘宝的自动化签名,并讲解一下实现细节,带你了解前置脚本,后置脚本的用法。
自动化原理
个人观点
自动化就像流水线一样,通过解析固定的规则,来达到自动化。
前置和后置脚本的区别(它们的功能就如同名字一样)
前置脚本:在请求发送之前,你可以通过脚本来做某些事情,值得注意的是变量是在前置脚本后面才执行的,所有有些问题可能不是 你问题。
前置脚本:在请求响应之前,你可以通过脚本来做某些事情。
淘宝联盟接入文档
调用入口
调用环境 | 服务地址 |
---|---|
正式环境 | https://gw.api.taobao.com/router/rest |
海外环境 | https://api.taobao.com/router/rest |
公共参数
参数名称 | 参数类型 | 是否必须 | 参数描述 |
---|---|---|---|
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.
2.
3.
4.
调用示例
1.
app_key=12345678
session=test
timestamp=2016-01-01 12:00:00
format=json
v=2.0
sign_method=md5
业务参数:
num_iid=11223344
2. 按ASCII顺序排序(去掉等号)
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. 拼接参数名与参数值
4. 生成签名
假设app的secret为helloworld,则签名结果为:hex(md5(helloworld+按顺序拼接好的参数名与参数值+helloworld)) = "66987CB115214E59E6EC978214934FB8"
5.
将所有参数名和参数值采用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
配置环境参数
设置全局变量
设置相关环境下的服务器地址
开始分析参数指定规则
通过调用示例我们可以知道所有的参数都在url中,也就是说参数存在于Query参数中。
1.
app_key:可以使用全局变量 。
v:可以固定为 2.0
sign_method:可以固定:hmac,md5,hmac-sha256 其中一个
2.
method:使用正常Query参数
timestamp :通过脚本处理
sign :通过脚本处理
3.
添加接口
这里以:淘宝客-公用-淘口令生成,来作为示例。
使用前置脚本处理
//定义公共参数
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)
})
修改于 2022-07-03 10:48:38