python调用阿里巴巴1688 api接口

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

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

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


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