淘宝开放平台提供了丰富的 API 接口,其中获取商品到手价(含优惠券、满减等优惠后的实际价格)需要调用商品详情相关接口。以下是基于淘宝联盟 API 和商品详情 API 的实现方案。
一、核心接口与认证机制
- 相关 API 接口
获取商品到手价主要依赖两个接口:
淘宝商品详情接口(item_get) :获取商品基础价格、优惠券信息;
淘宝联盟单品详情接口(tbk_item_info_get) :获取推广佣金、优惠叠加后的实际到手价(需联盟权限)。
- 认证机制
淘宝 API 采用AppKey + AppSecret + 会话密钥(session) 认证:
开发者需在淘宝开发平台注册应用,获取AppKey和AppSecret;
部分接口需要用户授权,通过 OAuth 2.0 获取session(会话密钥);
所有请求需包含签名(sign),通过AppSecret对参数加密生成。
二、Python 脚本实现
以下脚本实现通过淘宝联盟 API 获取商品到手价,包含签名生成、接口调用和价格解析。
import requests
import json
import time
import hashlib
import logging
from requests.exceptions import RequestException
from typing import Dict, Optional
配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
class TaobaoAPI:
def init(self, app_key: str, app_secret: str, session: Optional[str] = None):
"""
初始化淘宝API客户端
:param app_key: 应用AppKey
:param app_secret: 应用AppSecret
:param session: 用户会话密钥(部分接口需要)
"""
self.app_key = app_key
self.app_secret = app_secret
self.session = session
self.base_url = "https://eco.taobao.com/router/rest" # 淘宝API网关
self.format = "json"
self.v = "2.0" # API版本
def _generate_sign(self, params: Dict[str, str]) -> str:
"""生成签名(淘宝API签名规则)"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接为keyvaluekeyvalue格式
sign_str = "".join([f"{k}{v}" for k, v in sorted_params])
# 3. 首尾拼接app_secret
sign_str = self.app_secret + sign_str + self.app_secret
# 4. MD5加密并转为大写
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
def call(self, method: str, biz_params: Optional[Dict] = None) -> Optional[Dict]:
"""
通用API调用方法
:param method: 接口方法名(如taobao.tbk.item.info.get)
:param biz_params: 业务参数
:return: 接口返回的业务数据
"""
# 1. 构建公共参数
common_params = {
"app_key": self.app_key,
"method": method,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": self.format,
"v": self.v,
"sign_method": "md5"
}
if self.session:
common_params["session"] = self.session
# 2. 合并参数
all_params = {**common_params,** (biz_params or {})}
# 3. 生成签名
sign = self._generate_sign(all_params)
all_params["sign"] = sign
# 4. 发送请求
try:
response = requests.get(
self.base_url,
params=all_params,
timeout=15
)
response.raise_for_status()
# 5. 解析响应
result = response.json()
logging.info(f"API调用成功:{method},响应:{json.dumps(result, ensure_ascii=False)[:200]}...")
# 6. 处理错误(淘宝API错误在error_response节点)
if "error_response" in result:
error = result["error_response"]
logging.error(f"业务错误:{error.get('msg')}(错误码:{error.get('code')})")
return None
# 7. 返回业务数据(格式为"方法名+_response")
response_key = f"{method.replace('.', '_')}_response"
return result.get(response_key, {})
except RequestException as e:
logging.error(f"请求异常:{str(e)},接口:{method}")
return None
except json.JSONDecodeError:
logging.error(f"响应格式错误:{response.text[:200]}...,接口:{method}")
return None
def get_item_final_price(self, num_iid: str) -> Optional[Dict]:
"""
获取商品到手价(包含优惠券、满减等)
:param num_iid: 商品数字ID(淘宝商品唯一标识)
:return: 价格信息字典(含原价、到手价、优惠券等)
"""
# 1. 调用淘宝联盟接口获取优惠后价格
method = "taobao.tbk.item.info.get"
biz_params = {
"num_iids": num_iid,
"fields": "num_iid,title,pict_url,price,zk_final_price,coupon_info"
}
result = self.call(method, biz_params)
if not result:
return None
# 2. 解析到手价(zk_final_price为优惠后价格,coupon_info为优惠券信息)
item = result.get("results", {}).get("n_tbk_item", [])[0] or {}
return {
"num_iid": item.get("num_iid"),
"title": item.get("title"),
"original_price": item.get("price"), # 原价
"final_price": item.get("zk_final_price"), # 到手价(含优惠)
"coupon_info": item.get("coupon_info"), # 优惠券信息
"pict_url": item.get("pict_url") # 商品主图
}
示例调用
if name == "main":
# 替换为你的实际参数(从淘宝开放平台获取)
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
SESSION = "your_session" # 非必需,部分接口需要
# 初始化客户端
taobao_api = TaobaoAPI(app_key=APP_KEY, app_secret=APP_SECRET, session=SESSION)
# 获取商品到手价(替换为实际商品ID)
num_iid = "6543217890" # 示例商品数字ID
price_info = taobao_api.get_item_final_price(num_iid)
if price_info:
print(f"商品标题:{price_info['title']}")
print(f"原价:{price_info['original_price']} 元")
print(f"到手价:{price_info['final_price']} 元")
print(f"优惠券:{price_info['coupon_info'] or '无'}")
关键说明
接口选择与权限:
基础商品信息(如原价、标题)通过接口获取,无需特殊权限;
优惠后到手价需通过京东联盟的接口,需在京东联盟平台申请权限并绑定应用。
签名规则:
京东 API 签名需将所有参数(含公共参数和业务参数的 JSON 字符串)按 ASCII 排序,拼接为格式,末尾加后用 MD5 加密(大写)。
核心参数解析:
sku_id:商品 SKU ID,可从商品详情页 URL 提取;
final_price:到手价,已包含商品本身折扣、优惠券、满减等所有优惠;
area:地区编码(如1_72_2799_0代表北京),不同地区的价格和优惠可能不同。
错误处理:
常见错误码:1000(签名错误)、2000(权限不足)、3000(参数错误),需根据msg字段排查问题;
联盟接口限流较严格(默认 QPS=5),超限返回429错误,需控制调用频率。
扩展建议
批量查询:通过skuIds参数传入多个 SKU ID(用逗号分隔),一次获取多个商品价格;
地区适配:通过 IP 解析用户所在地区,动态设置area参数,获取精准的地区性价格;
优惠叠加:解析coupon_info和promotion_info,展示优惠详情(如 “满 200 减 30”+“店铺 9 折”)。 通过上述脚本,可实现京东商品到手价的精准获取,适用于电商比价工具、导购平台、价格监控系统等场景