python调用阿里巴巴1688 api接口

2019-05-30 program 发表在 编程语言 174

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

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


评论
登录以后才可以发布评论哦, 点击登录 发布评论
评论列表 0人参与,0条评论
暂时还没有人评论,快来一条神回复吧!