• 0
  • 0
分享

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

自动化原理

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

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

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

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

淘宝联盟接入文档

调用入口

调用API的服务URL地址,开放平台目前提供了2个环境给ISV使用:正式环境,海外环境。

调用环境     服务地址

正式环境     https://gw.api.taobao.com/router/rest

海外环境     https://api.taobao.com/router/rest   

公共参数

调用任何一个API都必须传入的参数,目前支持的公共参数有:

参数名称参数类型 是否必须     参数描述
methodString具体API接口名称,例:taobao.item.seller.get
app_keyStringTOP分配给应用的AppKey。例:12345678
sessionString可选
用户授权成功后,平台颁发给应用的授权session,详细介绍请点击这里。当此API文档的标签上注明:“需要授权”,则此参数必传;“不需要授权”,则此参数不需要传。
timestampString时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2016-01-01 12:00:00。淘宝API服务端允许客户端请求最大时间误差为10分钟。
vStringAPI协议版本,可选值:2.0
sign_methodString签名的摘要算法,可选值为:hmac,md5,hmac-sha256。
signStringAPI输入参数签名结果,签名算法参照下面的介绍。
formatString返回内容响应格式。不传默认为xml格式,可选值:xml,json。
simplifyBoolean
是否采用精简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),签名大体过程如下:


  • 对所有API请求参数(包括公共参数和业务参数,但除去sign参数和byte[]类型的参数),根据参数名称的ASCII码表的顺序排序。如:foo:1, bar:2, foo_bar:3, foobar:4排序后的顺序是bar:2, foo:1, foo_bar:3, foobar:4。

  • 将排序好的参数名和参数值拼装在一起,根据上面的示例得到的结果为:bar2foo1foo_bar3foobar4。

  • 把拼装好的字符串采用utf-8编码,使用签名算法对编码后的字节流进行摘要。如果使用MD5算法,则需要在拼装的字符串前后加上app的secret后,再进行摘要,如:md5(secret+bar2foo1foo_bar3foobar4+secret);如果使用HMAC_MD5算法,则需要用app的secret初始化摘要算法后,再进行摘要,如:hmac_md5(bar2foo1foo_bar3foobar4)。

  • 将摘要得到的字节流结果使用十六进制表示,如:hex("helloworld".getBytes("utf-8")) = "68656C6C6F776F726C64"

说明:MD5和HMAC_MD5都是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。

调用示例

以taobao.item.seller.get调用为例,具体步骤如下:


  • 设置参数值

公共参数:

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

  • 按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

  • 拼接参数名与参数值

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

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

  • 组装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

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

4444444444.png

开始分析参数指定规则

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

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

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

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

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

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

添加接口

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

业务请求和响应参数

55555555.png

添加Query参数

6666666666666666.png

添加Body参数和响应参数

7777777777777777.png

使用前置脚本处理

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


可以去官网下载操作一下:apifox.cn

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   一、 越权  越权,指攻击者绕过权限认证对功能或敏感内容进行非授权访问,例如:使用用户A的权限去操作用户B的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞的产生源于系统对用户提交信息缺少必要的权限校验,导致其他用户的信息或用户数据被非法篡改或查询。该漏洞导致的直接结果是信息泄露,严重程度取决于信息的敏感程度。  一般越权漏洞容易出现在权限页面(如查询类操作、账号修改、转账交易)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,服务端需对请求报文中的身份校验参数进行合法性校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越...
            13 13 1180
            分享
          •   框架介绍  1、HttpRunner  是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。  2、Locust  Locust是一款易于使用的分布式用户负载测试工具。它用于对网站(或其他系统)进行负载测试,并确定系统可以处理多少并发用户。HttpRunner 通过复用Locust ,可以在无需对 YAML/JSON 进行任何修改的情况下,直接运行性能测试。  3、 httprunner使用手册  附httprunner中文使用文档地址:cn.httprunner.org/  环境安装  1...
            2 2 1512
            分享
          •   小米方面已经发出公告称,将用全新的「Beta版」模式替换当前的「开发版」模式,未来小米澎湃OS将提供两个版本,面向前期内测用户的「Beta版」,和面向全量用户的「正式版」。  从MIUI诞生至今,小米的开发版系统已经陪伴了用户将近13年的时间,该系统能够让用户快速用到新功能,非常适合极客用户使用。在MIUI正式升级为澎湃OS过后,小米继续提供着开发版系统,不过开发版已经走到了尽头,将会在2024年停止更新。  小米方面已经发出公告称,将用全新的「Beta版」模式替换当前的「开发版」模式,未来小米澎湃OS将提供两个版本,面向前期内测用户的「Beta版」,和面向全量用户的「正式版」。  Bet...
            0 0 98
            分享
          • 对于性能测试来讲,使用编程语言实现性能测试用例的核心就是并发编程,也就是同时执行多个测试用例,以模拟真实的负载情况。并发编程可以有效地提高测试效率,可以更快地发现系统中的瓶颈和性能问题。在实现并发编程时,需要考虑线程的同步和互斥,以确保测试结果的正确性和可靠性。此外,还需要考虑如何分配和管理资源,以避免资源竞争和浪费。之前已经使用了Java实现,最近在计划使用Go语言实现一些新的压测功能的开发,这其中肯定也少不了使用到线程池(Go中协程池)。虽然Go语言协程已经非常强大了,很多情况下,我们可以直接使用go关键字直接创建协程去执行任务。但是在任务调度和负载保护的场景中,还是有所欠缺。所以在参考了...
            0 0 714
            分享
          • 第一章:什么是软件?计算机系统中与硬件相互依存的另一部分。软件包括程序、数据及其相关文档的完整集合。(1)能够完成预定功能呾性能的可执行指令(program)  (2)使得程序能够适当地操作信息的数据结构(data)  (3)描述程序的操作呾使用的文档(document)软件危机的定义?软件在开发和维护过程中遇到的一系列严重问题。软件危机包含两层含义:(1)如何开发软件 (2)如何维护数量不断膨胀的现有软件。软件危机的表现:(1)软件开发的迚度难以控制,经常出现经费超预算、完成期限拖延的现象。 (2)软件需求在开发初期不明确,导致矛盾在后期集中暴露,从而对整个开发 ...
            0 0 1572
            分享
      • 51testing软件测试圈微信