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

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

相关推荐
程序猿阿越20 小时前
Kafka源码(七)事务消息
java·后端·源码阅读
ArabySide21 小时前
【Spring Boot】REST与RESTful详解,基于Spring Boot的RESTful API实现
spring boot·后端·restful
程序定小飞21 小时前
基于springboot的学院班级回忆录的设计与实现
java·vue.js·spring boot·后端·spring
dreams_dream1 天前
Django序列化器
后端·python·django
懷淰メ1 天前
python3GUI--短视频社交软件 By:Django+PyQt5(前后端分离项目)
后端·python·django·音视频·pyqt·抖音·前后端
有意义1 天前
从零搭建:json-server+Bootstrap+OpenAI 全栈 AI 小项目
前端·后端·llm
汤姆yu1 天前
基于springboot的民间救援队救助系统
java·spring boot·后端·救援队
IT_陈寒1 天前
React性能优化实战:这5个Hooks技巧让我的应用快了40%
前端·人工智能·后端
韩立学长1 天前
基于Springboot的智慧管网灌溉系统i1agupa7(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
一 乐1 天前
高校教务|教务管理|基于springboot+vue的高校教务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·教务管理