玩转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

                  相关文章
                  |
                  9天前
                  |
                  Python
                  自动化微信朋友圈:Python脚本实现自动发布动态
                  本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
                  108 60
                  |
                  2月前
                  |
                  数据采集 监控 数据挖掘
                  Python自动化脚本:高效办公新助手###
                  本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
                  |
                  4天前
                  |
                  Web App开发 数据采集 JavaScript
                  Chrome浏览器实例的TypeScript自动化脚本
                  Chrome浏览器实例的TypeScript自动化脚本
                  |
                  1月前
                  |
                  Android开发 开发者 Python
                  通过标签清理微信好友:Python自动化脚本解析
                  微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
                  54 7
                  |
                  1月前
                  |
                  运维 Kubernetes Devops
                  自动化运维:从脚本到工具的演进之旅
                  在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
                  |
                  2月前
                  |
                  SQL 测试技术 API
                  如何编写API接口的自动化测试脚本
                  本文详细介绍了编写API自动化测试脚本的方法和最佳实践,涵盖确定测试需求、选择测试框架、编写测试脚本(如使用Postman和Python Requests库)、参数化和数据驱动测试、断言和验证、集成CI/CD、生成测试报告及维护更新等内容,旨在帮助开发者构建高效可靠的API测试体系。
                  |
                  2月前
                  |
                  运维 Devops
                  自动化运维:从脚本到DevOps的进化之旅
                  在数字化时代,自动化运维不仅是提高生产效率的关键,更是企业竞争力的象征。本文将带领读者穿越自动化运维的发展历程,从最初的脚本编写到现代DevOps文化的形成,揭示这一演变如何重塑IT行业的工作模式。通过具体案例,我们将展示自动化工具和实践如何简化复杂任务,优化流程,并促进团队协作。你将发现,自动化运维不仅关乎技术的进步,更体现了人、流程和技术三者之间协同增效的深层逻辑。
                  |
                  2月前
                  |
                  监控 数据挖掘 数据安全/隐私保护
                  Python脚本:自动化下载视频的日志记录
                  Python脚本:自动化下载视频的日志记录
                  |
                  2月前
                  |
                  机器学习/深度学习 人工智能 运维
                  自动化运维之路:从脚本到工具的演进
                  在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
                  |
                  2月前
                  |
                  运维 监控 网络安全
                  自动化运维的崛起:如何利用Python脚本简化日常任务
                  【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。