淘宝 item_get_app 接口深度分析及 Python 实现

淘宝item_get_app接口是淘宝开放平台提供的用于获取淘宝 APP 端商品详情原始数据的接口,相比 PC 端接口,它能返回更贴近移动端展示的商品信息,包括 APP 专属价格、移动端促销活动、APP 端详情页结构等。该接口主要服务于需要对接淘宝移动端商品数据的开发者,适用于电商导购、比价工具、数据分析等场景。

一、接口核心特性分析

  1. 接口定位与功能
  • 接口名称item_get_app(淘宝 APP 商品详情获取)
  • 功能:获取淘宝商品在移动端的完整详情数据,包括基础信息、价格、库存、规格、详情页内容、促销活动等
  • 数据特点 :返回 APP 端特有的数据结构,与 PC 端item_get接口在字段和格式上有差异
  • 权限要求:需要申请 "商品详情" 相关权限,个人开发者和企业开发者均可申请
  1. 认证机制

采用淘宝开放平台统一的appkey + appsecret + session三重认证机制:

  • appkeyappsecret:通过开放平台注册应用获得
  • session:通过用户授权获得的访问令牌,代表用户授权应用访问其数据
  • 签名机制:参数按 ASCII 升序排序后拼接,结合 appsecret 进行 MD5 加密生成签名
  1. 核心参数与响应结构

核心请求参数

参数名 类型 是否必填 说明
method String 接口方法名,固定为taobao.item_get_app
app_key String 应用的 appkey
session String 用户授权 session
timestamp String 时间戳,格式yyyy-MM-dd HH:mm:ss
sign String 签名
num_iid String 商品 ID
is_promotion String 是否获取促销信息,值为 "1" 时获取

响应核心字段 响应数据以item_get_app_response为根节点,主要包含以下几类信息:

  • 商品基础信息:标题、主图、价格、销量、店铺信息等
  • 规格参数:SKU 信息、规格属性、库存等
  • 详情页内容:移动端富文本详情、图片列表等
  • 促销信息:优惠券、满减活动、APP 专享价等
  • 服务信息:售后保障、配送方式等 二、Python 脚本实现 下面是调用item_get_app接口的 Python 实现,包含签名生成、接口调用和数据解析功能: import requests import hashlib import time import json import logging from typing import Dict, Optional

配置日志 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" )

class TaobaoItemGetAppAPI: def init (self, appkey: str, appsecret: str, session: str): """ 初始化淘宝item_get_app接口客户端 :param appkey: 淘宝开放平台appkey :param appsecret: 淘宝开放平台appsecret :param session: 用户授权session """ self.appkey = appkey self.appsecret = appsecret self.session = session self.base_url = "eco.taobao.com/router/rest" self.session = requests.Session()

python 复制代码
def _generate_sign(self, params: Dict) -> str:
    """生成淘宝API签名"""
    # 1. 按参数名ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 2. 拼接为key=value格式
    sign_str = "".join([f"{k}{v}" for k, v in sorted_params])
    # 3. 首尾拼接appsecret并MD5加密
    sign_str = self.appsecret + sign_str + self.appsecret
    return hashlib.md5(sign_str.encode()).hexdigest().upper()

def _get_timestamp(self) -> str:
    """生成时间戳(yyyy-MM-dd HH:mm:ss)"""
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

def get_item_details(self, num_iid: str, is_promotion: bool = False) -> Optional[Dict]:
    """
    调用item_get_app接口获取商品详情
    :param num_iid: 商品ID
    :param is_promotion: 是否获取促销信息
    :return: 商品详情数据
    """
    # 构造请求参数
    params = {
        "method": "taobao.item_get_app",
        "app_key": self.appkey,
        "session": self.session,
        "timestamp": self._get_timestamp(),
        "format": "json",
        "v": "2.0",
        "sign_method": "md5",
        "num_iid": num_iid,
        "is_promotion": "1" if is_promotion else "0"
    }

    # 生成签名
    params["sign"] = self._generate_sign(params)

    try:
        # 发送请求
        response = self.session.get(
            self.base_url,
            params=params,
            timeout=15
        )
        response.raise_for_status()
        result = response.json()

        # 处理错误响应
        if "error_response" in result:
            error = result["error_response"]
            logging.error(f"接口错误:{error['msg']}(错误码:{error['code']})")
            return None

        # 提取商品数据
        item_data = result.get("item_get_app_response", {}).get("item", {})
        if not item_data:
            logging.warning("未获取到商品数据")
            return None

        # 格式化返回结果
        return self._format_item_data(item_data)

    except Exception as e:
        logging.error(f"请求异常:{str(e)}")
        return None

def _format_item_data(self, item_data: Dict) -> Dict:
    """格式化商品数据,提取关键信息"""
    # 提取基础信息
    basic_info = {
        "num_iid": item_data.get("num_iid"),
        "title": item_data.get("title"),
        "desc_short": item_data.get("desc_short"),
        "price": float(item_data.get("price", 0)),
        "orginal_price": float(item_data.get("orginal_price", 0)),
        "sales": int(item_data.get("sales", 0)),
        "total_sold": int(item_data.get("total_sold", 0)),
        "comment_count": int(item_data.get("comment_count", 0)),
        "pic_url": item_data.get("pic_url"),
        "detail_url": item_data.get("detail_url"),
        "is_app_exclusive": item_data.get("is_app_exclusive", False),  # 是否APP专属商品
        "app_exclusive_price": float(item_data.get("app_exclusive_price", 0))  # APP专属价
    }

    # 提取店铺信息
    shop_info = {
        "shop_id": item_data.get("shop_id"),
        "shop_name": item_data.get("shop_name"),
        "shop_type": item_data.get("shop_type"),  # 店铺类型:c2c/b2c
        "seller_id": item_data.get("seller_id"),
        "seller_nick": item_data.get("seller_nick")
    }

    # 提取规格信息
    sku_info = {
        "sku": item_data.get("sku", []),  # SKU列表
        "sku_props": item_data.get("sku_props", []),  # SKU属性
        "props_name": item_data.get("props_name", ""),  # 属性名称
        "stock": int(item_data.get("stock", 0))  # 总库存
    }

    # 提取详情页信息
    detail_info = {
        "detail_image": item_data.get("detail_image", []),  # 详情页图片
        "desc": item_data.get("desc", "")  # 详情页富文本
    }

    # 提取促销信息
    promotion_info = {
        "promotion_price": float(item_data.get("promotion_price", 0)),
        "promotion_type": item_data.get("promotion_type", ""),
        "coupons": item_data.get("coupons", []),  # 优惠券信息
        "activity": item_data.get("activity", "")  # 活动信息
    }

    # 整合所有信息
    return {
        "basic_info": basic_info,
        "shop_info": shop_info,
        "sku_info": sku_info,
        "detail_info": detail_info,
        "promotion_info": promotion_info,
        "raw_data": item_data  # 保留原始数据
    }

示例调用

if name == "main": # 替换为实际参数(从淘宝开放平台获取) APPKEY = "your_appkey" APPSECRET = "your_appsecret" SESSION = "your_session" ITEM_ID = "6543217890" # 淘宝商品ID

python 复制代码
# 初始化API客户端
api = TaobaoItemGetAppAPI(APPKEY, APPSECRET, SESSION)

# 获取商品详情(包含促销信息)
item_details = api.get_item_details(ITEM_ID, is_promotion=True)

if item_details:
    # 打印商品基本信息
    print(f"商品ID: {item_details['basic_info']['num_iid']}")
    print(f"商品标题: {item_details['basic_info']['title']}")
    print(f"价格: {item_details['basic_info']['price']}元")
    
    # 若有APP专属价则显示
    if item_details['basic_info']['is_app_exclusive']:
        print(f"APP专属价: {item_details['basic_info']['app_exclusive_price']}元")
        
    print(f"销量: {item_details['basic_info']['sales']}件")
    print(f"店铺: {item_details['shop_info']['shop_name']} ({item_details['shop_info']['shop_type']})")
    
    # 打印促销信息
    if item_details['promotion_info']['coupons']:
        print("\n可用优惠券:")
        for coupon in item_details['promotion_info']['coupons'][:3]:  # 只显示前3个
            print(f"- {coupon.get('title')}: {coupon.get('denomination')}元")
            
    # 打印SKU数量
    print(f"\nSKU数量: {len(item_details['sku_info']['sku'])}")
    
    ## 三、接口调用注意事项
  1. 调用限制与规范
  • QPS 限制:默认 QPS 为 10,超过会返回 429 错误
  • 每日调用量:根据应用等级不同,每日调用量从 1 万到 100 万不等
  • 数据缓存:相同商品的重复调用建议设置缓存,减少 API 调用次数
  • 合规使用:获取的商品数据不得用于恶意竞争、价格战等不正当用途
  1. 常见错误及解决方案
错误码 说明 解决方案
10001 签名错误 检查签名生成逻辑,确保参数排序和加密正确
110 session 无效或过期 重新获取用户授权 session
216100 商品 ID 不存在 检查 num_iid 是否正确
216110 没有权限访问该商品 检查应用是否已申请商品详情权限
429 调用频率超限 降低调用频率,实现请求限流机制
  1. 数据解析要点
  • APP 端商品详情的富文本格式与 PC 端不同,需要针对性处理
  • 部分字段(如 APP 专属价)可能为空,需做容错处理
  • 规格参数可能包含多层嵌套,解析时需注意层级关系
  • 促销信息可能随时间变化,需定期更新

四、应用场景与扩展

典型应用场景

  • 移动端电商导购 APP,展示淘宝商品详情
  • 比价工具,对比不同平台商品价格(含 APP 专属价)
  • 电商数据分析系统,采集商品销售和价格数据
  • 电商辅助工具,帮助卖家分析竞品信息

扩展建议

  • 实现请求重试机制,应对临时网络故障
  • 添加代理 IP 池,解决 IP 限制问题
  • 实现数据缓存策略,提高响应速度并减少 API 调用
  • 结合其他接口(如评论接口)获取更全面的商品信息
  • 开发商品监控功能,跟踪价格和库存变化

通过合理使用item_get_app接口,开发者可以获取淘宝移动端的商品详情数据,为用户提供更贴近移动端使用习惯的服务体验。使用时需遵守淘宝开放平台的相关规定,确保数据使用的合法性和合规性

相关推荐
围巾哥萧尘25 分钟前
AI智能旅游规划 让每次旅行都完美无缺🧣
trae
鼓掌MVP4 小时前
基于MCP与Trae框架的“人情账本”系统开发实践:用自然语言管理人际往来
trae
TimelessHaze7 小时前
【webpack】让面试官眼前一亮的webpack :从基础配置到高级优化
前端·webpack·trae
盏灯10 小时前
Trae:从设计到接口,全栈自动化IDE
人工智能·trae
bug菌10 小时前
🤔还在为代码调试熬夜?字节TRAE如何让我的开发效率翻三倍的神操作!
aigc·ai编程·trae
豆包MarsCode10 小时前
TRAE Rules 实践:两套规则,实现从设计图到代码的全自动化流程
trae
用户40993225021210 小时前
如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?
后端·ai编程·trae
bug菌10 小时前
TRAE IDE让你的编程效率翻十倍?我用了三个月后发现了这些秘密!
aigc·ai编程·trae
Goboy12 小时前
数独游戏:Trae 自动生成规则与UI,轻松体验逻辑挑战
ai编程·trae