python调用阿里巴巴1688 api接口

2019-05-30 发表在 编程语言 3699

    网上资料较少,谨以此文供大家参考,避免踩坑。

    1688文档:https://open.1688.com/api/apidoclist.htm?id=624392

    1688 提供的SDK可以用一句话来概括,乱七八糟。下载了Java和python的sdk,java sdk写得还一般般,但是没有提供sdk的文档。python的文档还是全英文的,而且各种报错。所以最后自己参考1688文档对接了个例子。


    请先安装requests

    pip install requests

    代码:

    # 调用1688接口
    
    from hashlib import sha1
    import hmac
    import time
    import requests
    
    gw = 'http://gw.open.1688.com/openapi'
    
    app_key = 'appkey 应用控制台查看'
    app_secret = '换成自己的密钥,应用控制台查看'
    
    access_token = '替换成自己的token,可以添加测试用户获得固定token'
    
    
    # 获取当前时间戳
    def current_time():
        return int(round(time.time() * 1000))
    
    # 签名
    def sign(key, value):
        key = bytes(key, encoding='utf8')
        value = bytes(value, encoding='utf8')
        val = hmac.new(key, value, sha1).hexdigest()
        return val.upper()
    
    # 调用接口过程
    def invoke(api, params):
        '''
    
        在1688开放平台,url请求的多个参数都要参与签名(与文件上传有关的api中,文件字节流那个参数不参与签名),下面以两个参数为例,假设请求的url格式如下所示:
        http://gw.open.1688.com/openapi/param2/1/system/currentTime/1000000?b=2&a=1(appKey=1000000, 假设 secretKey=test123)
    
        参照签名算法说明,签名串s组装规则为:
        1、 构造签名因子:urlPath。url 中的一部分,我们称之为urlPath,从协议(param2)开始截取,到“?”为止,urlPath=param2/1/system/currentTime/1000000
        2、 构造签名因子:拼装的参数。参数 b=2&a=1,首先将参数的key和value拼在一起,得到b2和a1,然后按照首字母排序,得到a1和b2,最后按顺序拼在一起得到a1b2
        3、 合并两个签名因子。把前两步的字符串拼起来,得到s = param2/1/system/currentTime/1000000a1b2
        4、 对合并后的签名因子执行hmac_sha1算法。 Signature=uppercase (hex (hmac_sha1 (s, secretKey)) 得到签名33E54F4F7B989E3E0E912D3FBD2F1A03CA7CCE88
        ——secretKey为签名密钥,与urlPath中的appKey(1000000)对应
        ——hmac_sha1为通用的hmac_sha1算法,各编程语言一般都对应类库
        ——hex为转为十六进制
        ——uppercase为转为大写字符
    
        说明:API签名算法主要是使用urlPath和请求参数作为签名因子进行签名,主要针对api 调用
        :param url:
        :param params:
        :return:
        '''
    
        # http://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.product.get/8384550
        url = 'param2/1/{}/{}'.format(api, app_key)
    
        # 签名
        pstr = ''
        for key, value in params.items():
            pstr += key
            pstr += str(value)
        # 通用参数
        print(url)
        print(pstr)
        print(url + pstr)
    
        sign_str = sign(app_secret, url + pstr)
        print(sign_str)
        base = {
            # 签名
            '_aop_signature': sign_str,
        }
    
        reqUrl = '{}/{}'.format(gw, url)
    
        for key, value in params.items():
            base[key] = str(value)
    
        # 发起请求
        # r = requests.post(url=reqUrl, data=base)
        r = requests.get(url=reqUrl, params=base)
        rs = r.json()
        if 'exception' in rs:
            raise RuntimeError(rs.get('error_message') + '\n error detail:' + r.text)
    
        return rs
    
    
    class Api:
        def __init__(self, namespace):
            self.namespace = namespace
    
        def call(self, api, params):
            return invoke(self.namespace + '/' + api, params)
    
    
    class Product:
        def __init__(self):
            self.api = Api('com.alibaba.product')
    
        def get(self, product_id):
            '''
               获取产品详情 https://open.1688.com/api/apidocdetail.htm?aopApiCategory=product_new&id=com.alibaba.product:alibaba.product.get-1
               :param product_id:
               :return:
               '''
    
            return self.api.call('alibaba.product.get', {
                'productID': product_id,
                'webSite': '1688'
            })
    
        def repost(self, product_ids):
            '''
            产品重发 https://open.1688.com/api/apidocdetail.htm?aopApiCategory=product_new&id=com.alibaba.product%3Aalibaba.product.repost-1
            :return:
            '''
    
            return self.api.call('alibaba.product.repost', {
                'productIds': product_ids,
                'webSite': '1688'
            })
    
     product = Product()
     # 替换成自己的产品id
     print(product.get('592185058984'))
     # 替换成自己的产品id
     print(product.repost([590339403940, 591411425151]))

    坑:

    HWCnD4f6.png

    文档上标注这三个是系统级的参数,其中access_token是必传,但是有的接口传了会提示签名无效。



    最后打个广告,有问题可有偿帮助。免费勿扰,没太多时间。

    QQ:599194993

    邮箱:599194993@qq.com


    作者:Java笔记
    本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。
    评论
    登录以后才可以发布评论哦, 点击登录 发布评论
    评论列表 0人参与,0条评论
    暂时还没有人评论,快来一条神回复吧!