python调用阿里巴巴1688 api接口
网上资料较少,谨以此文供大家参考,避免踩坑。
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接口
python
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'
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'
获取当前时间戳
python
def current_time():
return int(round(time.time() * 1000))
def current_time():
return int(round(time.time() * 1000))
签名
python
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 sign(key, value):
key = bytes(key, encoding='utf8')
value = bytes(value, encoding='utf8')
val = hmac.new(key, value, sha1).hexdigest()
return val.upper()
调用接口过程
python
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]))
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]))
坑
文档上标注这三个是系统级的参数,其中access_token是必传,但是有的接口传了会提示签名无效。
广告
最后打个广告,有问题可有偿帮助。免费勿扰,没太多时间。
QQ:599194993
邮箱:599194993@qq.com