我们可以通过requests来实现一个京东联盟开放平台API Client。因为京东联盟开放平台的API都有一个统一的形式和签名方法,所以可以通过一个比较简单的实现来编写一个通用的client,可以比较简单的根据开放平台的文档中的方法名和业务参数来直接进行实际的调用。
相关的代码实现如下(也可以在https://gist.github.com/socrateslee/76e91cb7beef6e0effa030b9e115333b看到):
import datetime
import requests
import hashlib
import json
import urllib.parse
JD_API_ROOT = 'https://router.jd.com/api'
class JdApiClient(object):
def __init__(self, app_key, secret_key):
self.app_key = app_key
self.secret_key = secret_key
def get_sign(self, params):
params_list = sorted(list(params.items()), key=lambda x: x[0])
params_bytes = (self.secret_key + ''.join("%s%s" % (k, v) for k, v in params_list) + self.secret_key).encode('utf-8')
sign = hashlib.md5(params_bytes).hexdigest().upper()
return sign
def call(self, method, param_json, **kwargs):
params = {
"v": "1.0",
"method": method,
"app_key": self.app_key,
"timestamp": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"sign_method": "md5"
}
if isinstance(param_json, (dict, list)):
params["param_json"] = json.dumps(param_json)
else:
params["param_json"] = param_json
params['sign'] = self.get_sign(params)
resp = requests.get(JD_API_ROOT, params=params, **kwargs)
return resp
上面代码中,get_sign
函数是用来参数中签名字段sign的,需要注意的是在Python 3中的bytes和str之间的编码和解码,call
函数封装了requests来进行HTTP请求的发送,并且返回对应的Response对象,可以通过这个对象的.json()方法。将API接口返回的json转化成Python对象。
举例来说明这个client的使用方法,比如获取《腾讯传》的商品详细信息的代码为:
import pprint
client = JdApiClient("<YOUR_APP_KEY>", "<YOUR_SECRET_KEY>")
resp = client.call("jd.union.open.goods.promotiongoodsinfo.query",
{'skuIds':'12072066'})
pprint.pprint(json.loads(resp.json()['jd_union_open_goods_promotiongoodsinfo_query_response']['result']))
对应的结果为:
{'code': 200,
'data': [{'cid': 1713,
'cid2': 3266,
'cid2Name': '管理',
'cid3': 3440,
'cid3Name': '创业/商业史传',
'cidName': '图书',
'commisionRatioPc': 4.0,
'commisionRatioWl': 4.0,
'endDate': 1646064000000,
'goodsName': '腾讯传(1998-2016)',
'imgUrl': 'http://img14.360buyimg.com/n1/jfs/t3946/50/446886753/186144/18672b2c/584fb368Nb5005598.jpg',
'inOrderCount': 411,
'isFreeFreightRisk': 0,
'isFreeShipping': 2,
'isJdSale': 1,
'isSeckill': 0,
'materialUrl': 'http://item.jd.com/12072066.html',
'shopId': 1000098365,
'skuId': 12072066,
'startDate': 1573488000000,
'unitPrice': 43.5,
'vid': 1000098365,
'wlUnitPrice': 43.5}],
'message': '接口成功',
'requestId': '...'}