淘宝联盟平台API(自动签名)
    淘宝联盟平台API(自动签名)
    • 玩转ApiFox脚本实现自动化
    • 公用
      • 淘宝客-公用-淘口令生成
        POST
      • 淘宝客-公用-长链转短链
        POST
      • 淘宝客-公用-阿里妈妈推广券详情查询
        POST

    玩转ApiFox脚本实现自动化

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

    自动化原理#

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

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

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

    淘宝联盟接入文档#

    调用入口#

    调用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_keyString是TOP分配给应用的AppKey。例:12345678
    sessionString可选用户授权成功后,平台颁发给应用的授权session,详细介绍请点击这里。当此API文档的标签上注明:“需要授权”,则此参数必传;“不需要授权”,则此参数不需要传。
    timestampString是时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2016-01-01 12:00:00。淘宝API服务端允许客户端请求最大时间误差为10分钟。
    vString是API协议版本,可选值:2.0
    sign_methodString是签名的摘要算法,可选值为:hmac,md5,hmac-sha256。
    signString是API输入参数签名结果,签名算法参照下面的介绍。
    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),签名大体过程如下:
    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
    2. 按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
    3. 拼接参数名与参数值
    app_key12345678fieldsnum_iid,title,nick,price,numformatjsonmethodtaobao.item.seller.getnum_iid11223344sessiontestsign_methodmd5timestamp2016-01-01 12:00:00v2.0
    4. 生成签名
    假设app的secret为helloworld,则签名结果为:hex(md5(helloworld+按顺序拼接好的参数名与参数值+helloworld)) = "66987CB115214E59E6EC978214934FB8"
    5.
    组装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.png

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

    image.png

    开始分析参数指定规则#

    通过调用示例我们可以知道所有的参数都在url中,也就是说参数存在于Query参数中。
    1.
    公共参数必选有:method ,app_key ,timestamp ,v ,sign_method ,sign 。
    app_key:可以使用全局变量 。
    v:可以固定为 2.0
    sign_method:可以固定:hmac,md5,hmac-sha256 其中一个
    2.
    此时需要处理的公共参数有:method,timestamp ,sign 。
    method:使用正常Query参数
    timestamp :通过脚本处理
    sign :通过脚本处理
    3.
    业务参数使用body参数中来处理。

    添加接口#

    这里以:淘宝客-公用-淘口令生成,来作为示例。
    业务请求和响应参数
    image.png
    添加Query参数
    image.png
    添加Body参数和响应参数
    image.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)
    })
    
    
    修改于 2022-07-03 10:48:38
    下一页
    淘宝客-公用-淘口令生成
    Built with