玩转ApiFox脚本实现自动化

liam
• 阅读 834

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

自动化原理

个人观点 自动化就像流水线一样,通过解析固定的规则,来达到自动化。

前置和后置脚本的区别(它们的功能就如同名字一样)

前置脚本:在请求发送之前,你可以通过脚本来做某些事情,值得注意的是变量是在前置脚本后面才执行的,所有有些问题可能不是你问题。

前置脚本:在请求响应之前,你可以通过脚本来做某些事情。


淘宝联盟接入文档

调用入口

调用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

  1. 按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

  1. 拼接参数名与参数值

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

  1. 生成签名 假设app的secret为helloworld,则签名结果为:hex(md5(helloworld+按顺序拼接好的参数名与参数值+helloworld)) = "66987CB115214E59E6EC978214934FB8"

  2. 组装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

玩转ApiFox脚本实现自动化

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

玩转ApiFox脚本实现自动化

开始分析参数指定规则

通过调用示例我们可以知道所有的参数都在url中,也就是说参数存在于Query参数中。

  1. 公共参数必选有:method ,app_key ,timestamp ,v ,sign_method ,sign 。

app_key:可以使用全局变量 。 v:可以固定为 2.0 sign_method:可以固定:hmac,md5,hmac-sha256 其中一个

  1. 此时需要处理的公共参数有:method,timestamp ,sign 。

method:使用正常Query参数 timestamp :通过脚本处理 sign :通过脚本处理

  1. 业务参数使用body参数中来处理。

添加接口

这里以:淘宝客-公用-淘口令生成,来作为示例。

业务请求和响应参数

玩转ApiFox脚本实现自动化

添加Query参数

玩转ApiFox脚本实现自动化

添加Body参数和响应参数

玩转ApiFox脚本实现自动化

使用前置脚本处理

//定义公共参数
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

点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
3年前
手机自动化测试IDE-----Airtest基本操作方法
大家好,我是IT共享者,人称皮皮。这篇我们来讲讲手机自动化测试IDEAirtest。前言前面我们讲到了Airtest的界面和安装技巧,今天我们就来说说Airtest的具体操作方法吧,让我们轻松实现软件自动化,真正解放我们的双手吧。一、基本API介绍我们在做自动化脚本的时候,每个生成的脚本文件会给我们自动生成一些代码,如图:这里所导入的模块其实就是跨平台的
cookie 时效无限延长方案
自动化测试有2种形式,接口自动化和UI自动化。而UI自动化经常会被登录节点堵塞,例如验证码、图形、滑块等,尽管有些方式可以识别图形和定位滑块位置,但成功率都不高,无法真正意义上实现自动化执行;而http接口的自动化测试前置如果依赖cookie,也无法实现自动化执行。
Wesley13 Wesley13
3年前
2020双十一淘宝领喵币&京东全名营业の自动化任务
2020双十一淘宝领喵币&京东全名营业の自动化任务淘宝京东双十一活动脚本不墨迹,直接放链接:2020双十一自动领取脚本(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fp
Stella981 Stella981
3年前
Jmeter+ant+Jenkins实现接口自动化平台及报告发送
项目中实现了比较方便的自动化体系,一直没时间总结一下,现抽空整理一番,废话不多说 内容如下:一、环境准备jmeter:编写接口脚本,实现接口测试ant :静默执行jmeter脚本,并生成测试报告jenkins :集成接口测试到项目流程,实现定时运行及接口测试报告邮件发送\以上准备工作
Stella981 Stella981
3年前
Linux下部署python selenium UI自动化测试
之前写的pythonUI自动化一直在本地运行。后面去申请专门的windows机器来跑。因为对Jenkins下执行windows脚本不是很熟悉,集成到jenkins的时候遇到大量问题没法解决,另外一个原因就是linux下运行效率更高。。所以想尝试把UI自动化脚本部署到Linux机器上去。因为没有图像界面所以就需要用到无头浏览器了,目前方案有3个可
Stella981 Stella981
3年前
Selenium基础教程(三)自动化插件Katalon
Katalon-一款好用的selenium自动化测试插件Selenium框架是目前使用较广泛的开源自动化框架,一款好的、基于界面的录制工具对于初学者来说可以快速入门;对于老手来说可以提高开发自动化脚本的效率。我们知道SeleniumIDE是一款使用较多的脚本录制工具,且只支持Firefox老版
可莉 可莉
3年前
20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量
第二十章shell编程20.1shell介绍shell是一种脚本语言可以使用逻辑判断、循环等语法可自定义函数shell是系统命令的集合shell脚本可以实现自动化运维,能大大增加我们的运维效率20.2shell脚本结构和执行
Stella981 Stella981
3年前
Postman—前置请求脚本
前言在前面的文章中已经说到了,在Postman中可以编写以下两种脚本:前置请求脚本测试脚本这两种脚本的运行时机都不一样,在上一篇《Postman—脚本介绍》中已经详细的进行了介绍。这篇文章将对其中的前置请求脚本进行详细的总结。前置请求脚本前置请求脚本是在请求发送之前执行的代码片段。对于前置请求脚本的使
一种基于闭包函数实现自动化框架断言组件的设计实践 | 京东物流技术团队
1背景目前测试组同学基本具备自动化脚本编写能力,为了提高效率,如何灵活运用这些维护的脚本去替代部分手工的重复工作?为了达到测试过程中更多的去使用自动化方式,如何能够保证通过脚本覆盖更多的校验点,提高自动化测试的精度和力度?那么一定是不断的丰富断言,符合预期
陈哥聊测试 陈哥聊测试
5个月前
自动化测试框架知识,读这一篇就够了!
什么是真正的自动化测试框架?自动化脚本如何工作?自动化测试框架会如何在测试过程中为你提供竞争优势?