一、接口调用核心前置准备 点击获取key和secret
对接淘宝商品详情接口(taobao.item.get),需先完成淘宝开放平台企业实名认证,创建应用并获取
AppKey、AppSecret,同时通过 OAuth2.0获取
access_token(有效期30天)。区别于简易教程,本文采用“公共参数+业务参数分离”思路,提前封装签名工具类,规避参数拼接混乱导致的鉴权失败问题,适配生产环境批量调用场景。
二、核心技术要点拆解
1. **签名生成规则**:按参数 ASCII 升序排序,拼接成无间隔字符串后,通过 HMAC-MD5加密生成签名,需注意时间戳格式为`YYYY-MM-DD HH:MM:SS`,与淘宝服务器时差不超过5分钟,否则签名直接失效。
2. **SKU 规格解析**:接口返回的 SKU 数据为嵌套结构,需单独解析规格名称、对应价格、库存,解决网上教程仅提取基础信息、忽略多规格商品数据的问题,适配电商选品、比价场景。
3. **异常兜底机制**:针对 token 过期、商品下架、签名错误、接口限流四类高频异常,设置分级处理逻辑,token 过期自动续期,限流自动休眠重试,避免程序批量崩溃。
三、完整可运行代码(分模块封装)import requests
import hmac
import hashlib
import time
import json
from urllib.parse import quote
# 签名工具类,独立封装便于复用
class TaobaoSignUtil:
@staticmethod
def generate_sign(params, app_secret):
sorted_params = sorted(params.items(), key=lambda x: x[0])
sign_str = "".join([f"{k}{quote(str(v), safe='')}" for k, v in sorted_params])
return hmac.new(app_secret.encode(), sign_str.encode(), hashlib.md5).hexdigest().upper()
# 商品详情核心客户端
class TaobaoItemDetailClient:
def __init__(self, app_key, app_secret, access_token):
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token
self.api_url = "https://gw.api.taobao.com/router/rest"
self.session = requests.Session()
def get_item_detail(self, num_iid):
# 公共参数+业务参数分离
public_params = {
"app_key": self.app_key,
"method": "taobao.item.get",
"format": "json",
"v": "2.0",
"sign_method": "hmac",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"access_token": self.access_token
}
business_params = {"num_iid": num_iid, "fields": "num_iid,title,price,stock,sku_list,pic_url,sales"}
all_params = {**public_params, **business_params}
# 生成签名
all_params["sign"] = TaobaoSignUtil.generate_sign(all_params, self.app_secret)
try:
resp = self.session.get(self.api_url, params=all_params, timeout=15)
res_data = resp.json()
# 异常分级处理
if res_data.get("error_response"):
err_code = res_data["error_response"].get("code")
if err_code == 10010: # token过期
self.access_token = self.refresh_token() # 此处需补充token续期逻辑
return self.get_item_detail(num_iid)
return {"code": -1, "msg": res_data["error_response"]["sub_msg"]}
# 解析SKU规格
item = res_data.get("item_get_response", {}).get("item", {})
sku_list = []
for sku in item.get("sku_list", {}).get("sku", []):
sku_list.append({
"sku_id": sku.get("sku_id"),
"spec": sku.get("spec_name"),
"price": float(sku.get("price")),
"stock": int(sku.get("stock", 0))
})
# 结构化返回数据
return {
"code": 200,
"data": {
"item_id": item.get("num_iid"),
"title": item.get("title"),
"price": float(item.get("price")),
"stock": int(item.get("stock", 0)),
"sales": int(item.get("sales", 0)),
"main_img": item.get("pic_url"),
"sku_info": sku_list
}
}
except Exception as e:
return {"code": -2, "msg": f"调用异常:{str(e)}"}
# 调用示例
if __name__ == "__main__":
client = TaobaoItemDetailClient(
app_key="你的AppKey",
app_secret="你的AppSecret",
access_token="你的AccessToken"
)
result = client.get_item_detail("淘宝商品num_iid")
print(json.dumps(result, ensure_ascii=False, indent=2))
四、实战避坑指南
1. 禁止将 AppSecret 暴露在前端,生产环境需将密钥存储在服务器配置文件中,通过后端接口中转调用。
2. fields 参数可按需指定返回字段,减少数据传输量,避免返回冗余信息影响接口响应速度。
3. 部分虚拟商品、下架商品无 SKU 数据,解析时需做非空判断,防止程序报索引异常。