玩转ApiFox脚本实现自动化

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

 

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

自动化原理

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

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

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

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


淘宝联盟接入文档

调用入口

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

            image.gif编辑

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

            image.gif编辑

            开始分析参数指定规则

            通过调用示例我们可以知道所有的参数都在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参数中来处理。

                  添加接口

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

                  业务请求和响应参数

                  image.gif编辑

                  添加Query参数

                  image.gif编辑

                  添加Body参数和响应参数

                  image.gif编辑

                  使用前置脚本处理

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

                  image.gif

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

                  相关文章
                  |
                  监控 数据可视化 测试技术
                  Apifox 如何进行 API 自动化测试?经验之谈
                  选择 Apifox 来进行 API 自动化测试能够确保每次迭代的质量,避免引入新的 bug,还要实现自动化测试、定时测试、产品监控、可视化测试、持续集成等,帮助提高效率,通过设计和执行有针对性的测试用例,来全面验证产品功能,确保软件系统能够正常运行,减少上线后的问题。
                  Apifox 如何进行 API 自动化测试?经验之谈
                  |
                  前端开发 jenkins 测试技术
                  自动化测试介绍,为何 Apifox 是进行自动化测试的最佳工具
                  自动化测试利用专用软件执行测试用例,比手动测试更高效准确。Apifox是一款集API文档、调试与自动化测试于一体的工具,提供一体化解决方案,简化API变更管理。其强大的测试功能支持丰富的断言及测试场景组合,便于模拟真实业务流程。Apifox还提供详尽的测试报告与分析功能,有助于快速定位问题。此外,它能轻松集成到CI/CD流程中,并支持定时任务及多分支管理,极大提升了测试效率和团队协作。相较于其他工具,Apifox以其全面的功能和友好的界面脱颖而出。
                  |
                  存储 测试技术 API
                  apifox实例应用-自动化测试用例for循环的使用
                  总结来说,通过在Apifox自动化测试用例中结合for循环的使用,我们可以有效地对接口进行批量测试,提升测试效率和覆盖率。同时,通过参数化测试数据的灵活应用,能够确保我们的接口在不同的输入条件下都能保持正确的行为。这种方法能够显著减少手动测试工作量,同时通过标准化的流程确保测试的一致性。
                  1141 0
                  |
                  算法 安全 jenkins
                  Apifox:API 接口自动化测试完全指南
                  如果要正常访问该接口的数据,需要在 header 中提供 AdminToken: token 头,这是一个常见的需要 JWT 登录认证接口。 很自然的我们想到,如果自动请求登录接口获取 token 值,然后在每次请求前自动带上这个 AdminToken 头不就行了吗,没错就是这样简单,伪代码如下:
                  Apifox:API 接口自动化测试完全指南
                  |
                  JSON 数据格式
                  阿萨聊测试:Apifox的高级Mock 自定义脚本
                  持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情 大家好,我是阿萨。今天我们学习高级Mock的自定义脚本功能。学习完前面的内容后, 我们还有一类场景使用前面的Mock 方法无法实现.
                  1867 0
                  阿萨聊测试:Apifox的高级Mock 自定义脚本
                  |
                  8月前
                  |
                  前端开发 测试技术 API
                  企业级API工具的选择:Apipost和Apifox哪个好
                  Apifox相比Apipost在企业级API协作方面表现更出色,其一体化平台设计有效提升团队协作效率,功能整合度高,支持标准化接口管理,更适合规模化团队和技术协作需求。
                  478 120
                  |
                  9月前
                  |
                  人工智能 NoSQL 测试技术
                  Apipost 与 Apifox:全栈工程师视角下的 API 工具抉择
                  本文对比了Apipost与Apifox两款API工具在AI能力、数据一致性管理、自动化测试、团队协作、协议支持、数据库支持及离线可用性等多个核心维度的表现。Apipost凭借AI智能化、数据自动同步、全面协议支持及离线功能等优势,在大型项目、高安全场景及多协议调试中表现更出色。而Apifox适合预算有限、小型团队及纯HTTP项目。
                  203 0
                  |
                  9月前
                  |
                  人工智能 自然语言处理 测试技术
                  Apipost 与 Apifox 深度对比:谁是 API 开发的最佳拍档?
                  在 API 开发中,Apipost 与 Apifox 是两款流行的国产工具。本文通过实际项目的对比发现,Apipost 在 AI 功能方面表现突出,如 AI 自动生成文档、测试用例、脚本等,显著提升开发效率。基础功能上,Apipost 也更全面,支持离线使用、OpenAPI 格式导出、多种协议及数据库字典导入,界面简洁易用,综合性能优于 Apifox。
                  460 5
                  |
                  9月前
                  |
                  人工智能 测试技术 API
                  Apifox 和 Apipost如何选?2025企业API开发工具选型需求分析及建议
                  本文对比了 Apipost 与 Apifox 在 AI 功能及 API 功能上的差异,指出 Apipost 凭借 AI 一键补全文档、智能提取 API 文档、AI 断言、模拟测试数据、生成用例、参数更新、脚本生成、全局搜索等能力,显著提升开发效率与质量。同时,Apipost 在离线使用、一键分享、OpenAPI 格式支持、多协议适配、数据库导入、模拟数据、压测功能等基础 API 能力上亦全面领先。在AI时代的2025年,API + AI是Apipost将AI技术融合行业应用的最佳典范,这种趋势下,也说明Apipost 更能助力企业与开发者实现高效智能开发。
                  494 2
                  |
                  9月前
                  |
                  人工智能 测试技术 API
                  从 Apifox 到 Apipost:探寻迁移背后的深层驱动力
                  本文对比了Apipost与Apifox在AI能力和基础API功能上的差异,指出Apipost凭借强大的AI文档处理、智能测试及更多更丰富的AI辅助功能,显著提升开发效率和质量。其全面的API支持和便捷协作特性,使其成为企业高效开发的理想选择。
                  179 0

                  热门文章

                  最新文章