专栏首页socrates京东联盟的开放平台的Python客户端封装
原创

京东联盟的开放平台的Python客户端封装

我们可以通过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': '...'}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

相关文章

  • 腾讯云的人脸核身RuleId的一个小坑

    在集成腾讯云的人脸核身产品时,如果访问API时,使用的是子账号的key而不是主账号的key,那么很有可能会遇到类似下面的这样的报错

    socrates
  • 在Ubuntu Linux Server上使用奔图P2206NW打印机

    由于奔图提供的和Linux有关的文档和帮助实在太少了,本文会针对奔图P2206NW来说明一下如何在Ubuntu Linux Server的命令行中安装这台激光打...

    socrates
  • 在Windows下通过Python脚本来阻止屏幕关闭

    在Windows下可以在系统中设置自动关闭屏幕的时间,在一些场合下,我么可能会想临时的阻止Windows自动关闭屏幕,但是又不想改变系统设置(比如在疫情里面宅在...

    socrates
  • 事件驱动架构设计

    这篇文章是 软件架构演进 一个有关 软件架构 系列文章中的一篇。这些文章,主要是我学习软件架构、对软件架构的思考及使用方法的记录。相比于这个系列的前几篇文章,本...

    柳公子
  • 谷歌发现了一个潜伏了三年的Android间谍程序

    近期,Google和Lookout的安全研究专家发现了一款非常复杂的Android间谍软件,它不仅可以从手机的聊天软件中窃取用户的隐私数据,还可以通过手机的摄像...

    FB客服
  • __getattr__

    正常情况下,当调用类的方法或属性时,如果不存在,就会报错 要避免这个错误,除了可以加上那个要调用但不存在的属性外,Python还有另一个机制,那就是写一个_...

    py3study
  • Flask 使用json或者jsonify返回json响应数据的方法

    在前后端分离的时代,后端一般返回前端的数据就是json格式的响应数据。 而json格式的响应数据其实实际上就是一个字符串。

    Devops海洋的渔夫
  • Maven不会自动下载jar包

    不会自动下载jar包 idea昨天还在正常使用,结果今天发现pom文件中的依赖不会自动下载了,最后百度找到了解决方案: setting ——> maven ...

    kirin
  • HDU 1159.Common Subsequence【动态规划DP】

    Problem Description A subsequence of a given sequence is the given sequence wit...

    风骨散人Chiam
  • 记一次开源工具某模块的基础二次开发

    近日看到一些关于工具的文章,很多人对于写工具类文章都是蜻蜓点水,写搭建,写基础使用,但是基础的开源工具在生产环境上的使用其实是比较困难的,有很多需要二次开发做到...

    FB客服

扫码关注云+社区

领取腾讯云代金券