淘宝商品详情接口:面向 ERP 入库的数据校验与容错实现
网上多数淘宝详情接口示例,只完成调用接口打印返回结果,很少考虑真实业务场景:大促接口抖动、部分规格字段缺失、图片数组空值、sku 列表顺序错乱等问题。直接把原始返回入库,会出现部分商品数据残缺、SKU 与价格不匹配的线上故障。本文侧重业务校验层,对淘宝开放平台 taobao.item.get 接口做二次封装,增加字段合法性校验、空值兜底、SKU 数据对齐逻辑,输出标准化结构体,适配商品同步、库存价格拉取的业务场景。
前置准备
登录淘宝开放平台创建应用,获取 appkey、appsecret,申请 taobao.item.get 接口权限。接口调用需要生成签名,入参需要传入商品 num_iid。调用存在流量配额,大促时段错误码高频,需要做好重试策略。
依赖:requests,pip install requests
`python
import requests
import time
import hashlib
class TaobaoDetailClient:
def init(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.gateway = "https://gw.api.taobao.com/router/rest"
def _make_sign(self, param_dict):
sorted_items = sorted(param_dict.items())
raw = self.app_secret + "".join([f"{k}{v}" for k, v in sorted_items]) + self.app_secret
return hashlib.md5(raw.encode("utf-8")).hexdigest().upper()
def get_std_item_detail(self, num_iid):
params = {
"method": "taobao.item.get",
"app_key": self.app_key,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "2.0",
"num_iid": num_iid,
"fields": "num_iid,title,price,nick,num,sku,item_img,outer_id"
}
params["sign"] = self._make_sign(params)
try:
resp = requests.get(self.gateway, params=params, timeout=12)
resp.raise_for_status()
data = resp.json()
except requests.exceptions.RequestException as e:
return {"success": False, "error": f"网络异常:{str(e)}"}
if "error_response" in data:
return {"success": False, "error": data["error_response"].get("msg","接口返回错误")}
item_raw = data.get("item_get_response",{}).get("item",{})
# 业务层校验兜底
sku_list = item_raw.get("skus",{}).get("sku",[]) if item_raw.get("skus") else []
img_list = [x.get("url") for x in item_raw.get("item_imgs",{}).get("item_img",[]) if x.get("url")]
res = {
"success": True,
"num_iid": item_raw.get("num_iid"),
"title": item_raw.get("title",""),
"shop_nick": item_raw.get("nick",""),
"price": float(item_raw.get("price",0)),
"stock_num": int(item_raw.get("num",0)),
"main_images": img_list,
"sku_data": [{"sku_id":s.get("sku_id"),"price":s.get("price"),"stock":s.get("quantity")} for s in sku_list],
"outer_id": item_raw.get("outer_id","")
}
return res
if name == "main":
client = TaobaoDetailClient(app_key="your_key",app_secret="your_secret")
result = client.get_std_item_detail(num_iid=700000000000)
print(result)`
代码核心解析
- 签名内部封装:内部实现 MD5 签名逻辑,不用依赖第三方 SDK,方便项目迁移。
- 分层异常拦截:区分网络异常、平台返回业务错误,错误信息统一封装,上层业务直接读取 error 字段。
3.SKU、图片做过滤清洗:过滤空图片地址,规整 SKU 列表,避免空数组直接入库造成字段异常。 - 输出轻量化:剔除大量无用业务扩展字段,只保留 ERP 同步必需字段,减少存储压力。
对接踩坑要点
1.fields 参数按需填写,不要一次性拉取全部字段,会增大接口响应耗时,还容易触发流量限制。 - 商品下架、删除时接口会返回业务错误码,业务代码需要做捕获,标记商品状态。
3.SKU 数组有可能为空,无规格商品不能直接遍历 sku_data,要增加判空逻辑。 - 大促期间网关抖动,短时间连续报错不要高频重试,建议间隔 1‑3 秒。







