淘宝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 = "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'])}")
## 三、接口调用注意事项
- 调用限制与规范
- 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
接口,开发者可以获取淘宝移动端的商品详情数据,为用户提供更贴近移动端使用习惯的服务体验。使用时需遵守淘宝开放平台的相关规定,确保数据使用的合法性和合规性。