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

一、接口概述

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

二、前期准备

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

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

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

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

三、接口调用实战

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

请求参数

表格

复制

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

响应核心字段

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

(二)Python代码示例

以下是使用 Python 调用 item_get_app 接口的完整代码示例:

Python 复制代码
import requests
import hashlib
import time
import logging
import json

class 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 None

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

如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系

相关推荐
JAVA数据结构3 小时前
BPMN-Activiti-简单流程委托
后端
sivdead3 小时前
智能体记忆机制详解
人工智能·后端·agent
拉不动的猪4 小时前
图文引用打包时的常见情景解析
前端·javascript·后端
该用户已不存在4 小时前
程序员的噩梦,祖传代码该怎么下手?
前端·后端
间彧4 小时前
Redis缓存穿透、缓存雪崩、缓存击穿详解与代码实现
后端
摸鱼的春哥4 小时前
【编程】是什么编程思想,让老板对小伙怒飙英文?Are you OK?
前端·javascript·后端
Max8125 小时前
Agno Agent 服务端文件上传处理机制
后端
调试人生的显微镜5 小时前
苹果 App 怎么上架?从开发到发布的完整流程与使用 开心上架 跨平台上传
后端
顾漂亮5 小时前
Spring AOP 实战案例+避坑指南
java·后端·spring