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

admin7个月前京东api465

一、接口概述

京东的 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 接口,获取商品的原始详情数据。在实际开发中,注意错误处理和日志记录,可以提高开发效率和代码的稳定性。如果遇到问题,可以参考京东开放平台的官方文档或在开发者社区寻求帮助


相关文章

京东开放平台API接口完全指南:商品详情、关键词搜索、评论与券后价

一、接口体系概览京东开放平台为开发者提供了丰富的API矩阵,主要涵盖以下核心能力:表格接口类型方法名适用场景权限要求商品详情jd.union.open.goods.query / ...

实战演练:京东关键词搜索item_search接口调用(从入门到落地)

在电商数据分析、竞品监控、选品调研、第三方工具开发等场景中,通过关键词搜索获取京东商品列表数据是核心需求。京东开放平台提供的item_search接口(核心对应官方jd.union.open.good...

实战解析:京东关键词搜索 item_search_pro —— 按关键字搜索商品

一、接口定位item_search_pro 并不是京东官方文档里出现的接口名,而是第三方服务商对「京东关键词搜索商品」能力的封装代号。它本质上调用的是京东联盟开放平台里的jd.union.open.g...

Java对接京东商品详情API:从授权调用到数据解析实战

一、京东API接入方案概览京东提供两类商品数据获取途径:表格方案适用场景特点门槛京东宙斯开放平台(JOS)京东商家、ISV服务商官方接口,数据全面,需入驻需企业资质,审核周期第三方数据服务API开发者...

京东关键词搜索接口完全指南

一、接口体系概览京东提供两套核心的商品搜索接口,分别服务于不同场景:表格接口类型核心接口适用场景数据特点权限要求京东联盟jd.union.open.goods.searchCPS推广、选品、导购含佣金...

Python代码获取京东商品描述 API 接口(item_get_desc)实战指南

在电商领域,商品描述是影响消费者购买决策的重要因素之一。京东作为国内知名的电商平台,提供了丰富的 API 接口供开发者使用,其中 item_get_desc 接口可用于获取商品的详细描述信息。本文将详...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。