×

Python代码获取京东商品详情原数据 API 接口(item_get_app)

admin admin 发表于2025-10-20 17:34:28 浏览108 评论0

抢沙发发表评论

一、接口概述

京东的 item_get_app 接口用于获取商品的原始详情数据,包括商品的基础信息、价格信息、库存信息、规格参数、促销信息、服务信息以及多媒体信息等

二、前期准备

(一)注册京东开放平台账号

访问京东开放平台官网,注册开发者账号并完成实名认证

(二)创建应用并获取 API 权限

  1. 登录京东开放平台,进入 “我的应用” 页面。
  2. 点击 “创建应用”,填写应用名称、描述等信息。
  3. 在应用的 “接口管理” 中,找到 item_get_app 接口,申请调用权限。
  4. 申请通过后,获取 App KeyApp Secret,这是调用 API 的必要凭证

三、接口调用实战

(一)核心参数与响应结构

请求参数

表格
复制
参数名类型是否必填说明
sku_idString商品 SKU ID,京东商品的唯一标识
access_tokenString访问令牌
platformString平台类型,如 "android"、"ios",默认 "android"
fieldsString需要返回的字段,默认返回全部字段
areaString地区编码,用于获取区域化价格和库存

响应核心字段

  • 商品基础信息:SKU ID、商品名称、品牌信息、分类信息等。
  • 价格信息:基准价、促销价、会员价、活动价、价格计算规则等。
  • 库存信息:实时库存、区域库存、库存状态、限购信息等。
  • 规格参数:SKU 规格、属性组合、规格图片等。
  • 促销信息:活动列表、优惠券、满减规则、赠品信息等。
  • 服务信息:售后政策、配送服务、安装服务等。
  • 多媒体信息:图片、视频、3D 模型等资源链接

(二)Python代码示例

以下是使用 Python 调用 item_get_app 接口的完整代码示例
Python
复制
import requestsimport hashlibimport timeimport loggingimport jsonclass JDItemGetAppAPI:
    def __init__(self, app_key, app_secret, base_url="https://api.jd.com"):
        self.app_key = app_key
        self.app_secret = app_secret
        self.base_url = base_url
        self.access_token = None
        self.token_expires_at = 0
        self.session = requests.Session()

    def _get_access_token(self) -> str:
        """获取访问令牌"""
        if self.access_token and self.token_expires_at > time.time() + 60:
            return self.access_token

        logging.info("获取新的access_token")
        url = f"{self.base_url}/oauth2/token"

        params = {
            "grant_type": "client_credentials",
            "appkey": self.app_key,
            "appsecret": self.app_secret        }

        try:
            response = self.session.get(url, params=params, timeout=10)
            response.raise_for_status()
            result = response.json()

            if "access_token" in result:
                self.access_token = result["access_token"]
                self.token_expires_at = time.time() + result.get("expires_in", 86400)  # 默认为24小时
                return self.access_token            else:
                logging.error(f"获取access_token失败: {result.get('error_description', '未知错误')}")
                return None

        except requests.exceptions.RequestException as e:
            logging.error(f"获取access_token请求异常: {str(e)}")
            return None

    def _generate_sign(self, params: dict) -> str:
        """生成签名"""
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        sign_str = self.app_secret        for k, v in sorted_params:
            if k != "sign":
                sign_str += f"{k}{v}"
        sign_str += self.app_secret        return hashlib.sha256(sign_str.encode()).hexdigest().upper()

    def get_item_raw_data(self, sku_id: str, platform: str = "android", area: str = "1_72_2799_0", fields: str = None) -> dict:
        """获取商品原始详情数据"""
        if not self._get_access_token():
            return None

        url = f"{self.base_url}/item/get_app"

        params = {
            "sku_id": sku_id,
            "access_token": self.access_token,
            "platform": platform,
            "area": area,
            "timestamp": int(time.time() * 1000)  # 时间戳,毫秒级
        }

        if fields:
            params["fields"] = fields

        params["sign"] = self._generate_sign(params)

        try:
            response = self.session.get(url, params=params, timeout=20)
            response.raise_for_status()
            result = response.json()

            if result.get("code") == 200:
                return result.get("data", {})
            else:
                logging.error(f"获取商品数据失败: {result.get('message', '未知错误')} (错误码: {result.get('code')})")
                return None

        except requests.exceptions.RequestException as e:
            logging.error(f"获取商品数据请求异常: {str(e)}")
            return Noneif __name__ == "__main__":
    APP_KEY = "your_app_key"
    APP_SECRET = "your_app_secret"

    api = JDItemGetAppAPI(APP_KEY, APP_SECRET)

    item_data = api.get_item_raw_data(
        sku_id="123456789",
        platform="android",
        area="1_72_2799_0"  # 北京地区编码
    )

    if item_data:
        print(f"商品名称: {item_data.get('skuName')}")
        print(f"京东价: {item_data.get('jdPrice', {}).get('p')}")
        print(f"库存状态: {item_data.get('stock', {}).get('stockStateName')}")
    else:
        print("获取商品数据失败")

四、常见问题及解决方法

(一)签名错误

问题:签名错误,通常是 sign 参数不正确。
解决方法
  • 检查 app_secret 是否正确。
  • 确保参数排序正确,按照字母顺序排列。
  • 确保签名算法正确,使用 SHA256 算法

(二)权限不足

问题:权限不足,通常是 code 返回 403
解决方法
  • 检查是否已申请 item_get_app 接口的调用权限。
  • 确保应用的权限未被限制

(三)参数错误

问题:请求参数错误,通常是 code 返回 400
解决方法
  • 检查请求参数是否符合 API 的要求。
  • 确保所有必填参数都已正确传递

五、总结

通过本文的介绍,你应该已经掌握了如何使用 Python 代码调用京东的 item_get_app 接口,获取商品的原始详情数据。在实际开发中,注意错误处理和日志记录,可以提高开发效率和代码的稳定性。如果遇到问题,可以参考京东开放平台的官方文档或在开发者社区寻求帮助


群贤毕至

访客