×

淘宝商品详情接口实战:全流程拆解+SKU 规格解析+异常兜底(Python 生产版)

Ace Ace 发表于2026-07-20 17:29:16 浏览11 评论0

抢沙发发表评论

一、接口调用核心前置准备
对接淘宝商品详情接口(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 过期自动续期,限流自动休眠重试,避免程序批量崩溃。

点击获取key和secret
三、完整可运行代码(分模块封装)

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 数据,解析时需做非空判断,防止程序报索引异常。

群贤毕至

访客