淘宝item_get_app接口是淘宝开放平台提供的用于获取淘宝 APP 端商品详情原始数据的接口,相比 PC 端接口,它能返回更贴近移动端展示的商品信息,包括 APP 专属价格、移动端促销活动、APP 端详情页结构等。该接口主要服务于需要对接淘宝移动端商品数据的开发者,适用于电商导购、比价工具、数据分析等场景。
一、接口核心特性分析
- 接口定位与功能
接口名称:item_get_app(淘宝 APP 商品详情获取)
功能:获取淘宝商品在移动端的完整详情数据,包括基础信息、价格、库存、规格、详情页内容、促销活动等
数据特点:返回 APP 端特有的数据结构,与 PC 端item_get接口在字段和格式上有差异
权限要求:需要申请 "商品详情" 相关权限,个人开发者和企业开发者均可申请 - 认证机制
采用淘宝开放平台统一的appkey + appsecret + session三重认证机制:
appkey和appsecret:通过开放平台注册应用获得
session:通过用户授权获得的访问令牌,代表用户授权应用访问其数据
签名机制:参数按 ASCII 升序排序后拼接,结合 appsecret 进行 MD5 加密生成签名 - 核心参数与响应结构
核心请求参数
参数名 类型 是否必填 说明
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 = "https://eco.taobao.com/router/rest"
self.session = requests.Session()
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 # 保留原始数据
}
三、接口调用注意事项
- 调用限制与规范
QPS 限制:默认 QPS 为 10,超过会返回 429 错误
每日调用量:根据应用等级不同,每日调用量从 1 万到 100 万不等
数据缓存:相同商品的重复调用建议设置缓存,减少 API 调用次数
合规使用:获取的商品数据不得用于恶意竞争、价格战等不正当用途 - 常见错误及解决方案
错误码 说明 解决方案
10001 签名错误 检查签名生成逻辑,确保参数排序和加密正确
110 session 无效或过期 重新获取用户授权 session
216100 商品 ID 不存在 检查 num_iid 是否正确
216110 没有权限访问该商品 检查应用是否已申请商品详情权限
429 调用频率超限 降低调用频率,实现请求限流机制 数据解析要点
APP 端商品详情的富文本格式与 PC 端不同,需要针对性处理
部分字段(如 APP 专属价)可能为空,需做容错处理
规格参数可能包含多层嵌套,解析时需注意层级关系
促销信息可能随时间变化,需定期更新
四、应用场景与扩展
典型应用场景
移动端电商导购 APP,展示淘宝商品详情
比价工具,对比不同平台商品价格(含 APP 专属价)
电商数据分析系统,采集商品销售和价格数据
电商辅助工具,帮助卖家分析竞品信息
扩展建议
实现请求重试机制,应对临时网络故障
添加代理 IP 池,解决 IP 限制问题
实现数据缓存策略,提高响应速度并减少 API 调用
结合其他接口(如评论接口)获取更全面的商品信息
开发商品监控功能,跟踪价格和库存变化
通过合理使用item_get_app接口,开发者可以获取淘宝移动端的商品详情数据,为用户提供更贴近移动端使用习惯的服务体验。使用时需遵守淘宝开放平台的相关规定,确保数据使用的合法性和合规性。示例调用
if name == "main":
替换为实际参数(从淘宝开放平台获取)
APPKEY = "your_appkey"
APPSECRET = "your_appsecret"
SESSION = "your_session"
ITEM_ID = "6543217890" # 淘宝商品ID初始化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'])}")