品牌做控价,第一步是搞清楚:你拿到的 "价格",和你真正要盯的 "成交价" 之间有没有差距。
淘宝页面上的价格分好几层:一口价、SKU 价、促销价。控价要看的是当前展示的最低可购价,也就是取最低 SKU 价和促销价里更小的那个,而不是只看页面标价 —— 否则商家挂个标价再放个低价 SKU,监控就失真了。
说明:本文只覆盖页面价(标价 / 促销价 / SKU 价)的采集与判定。实际成交中还有叠加优惠导致的实际到手价,那是另一套数据源,本文不展开。
一、先认清 "淘宝商品详情 API" 的真相
网上流传的 taobao.item_get、taobao.item_get_full 这类带下划线的接口名,不是淘宝开放平台(TOP)的官方接口,而是第三方聚合 API 服务商的命名。官方 TOP 的接口名用点号,例如:
表格
| 官方接口 | 用途 | 授权要求 |
|---|---|---|
taobao.item.get |
单商品详情(标题 / 价格 / 库存 / SKU) | 企业开发者 + 对应类目权限 |
taobao.item.seller.get |
本店商品全量详情 | 需卖家授权 |
taobao.epp.item.get |
商品详情查询 | 免费、免授权(部分类目可用) |
taobao.tbk.item.details.get |
淘宝客商品详情 | 免授权,需开通淘宝客 |
关键现实:官方 TOP 的商品详情接口对 "查询他店商品做价格监控" 并不友好,普通个人开发者基本申请不下来,权限按应用类目审核。所以行业里实际跑控价,走的是三条路:
- 自有 / 授权店铺:用
taobao.item.seller.get拿自己店铺,最合规; - 有官方授权的第三方数据服务商(聚合 API,就是那些带下划线接口名的真正提供方):统一申请了企业权限,按次付费调用,是当前控价厂商的主流做法;
- 合规采集:自建采集器处理反爬和风控(成本高、有风险,不建议从零做)。
下面代码按 "第三方聚合 API 风格" 写,因为这是实际能跑起来的形态;签名逻辑和官方 TOP 一致(MD5 + 参数排序)。
二、控价要采哪些字段
表格
| 字段 | 含义 | 控价用途 |
|---|---|---|
num_iid |
商品 ID | 唯一标识,做关联和去重 |
price |
一口价 / 标价 | 基线参考 |
sku[].price |
各规格价格 | 找最低 SKU 价 |
promotion_price |
促销价 | 与 SKU 最低价取小 |
nick / seller_id |
店铺名 / 卖家 ID | 定位违规卖家 |
sales |
销量 | 判断违规卖家是否在放量 |
三、系统流程
商品池(链接/SPU)
→ 定时调度(拉取)
→ 调详情API取价格字段
→ 计算最低展示价(最低SKU价 vs 促销价 取小)
→ 与"控价红线"比对
→ 低于红线 → 告警 + 归档证据
→ 生成报表(按店铺/链接/SKU)
四、核心代码示例(Python)
import hashlib, time, requests
APP_KEY, APP_SECRET = "你的key", "你的secret"
API_URL = "https://eco.taobao.com/router/rest"
def sign(params):
# 参数按 key 的 ASCII 升序拼接,首尾包上 AppSecret,MD5 转大写
s = APP_SECRET + "".join(f"{k}{v}" for k in sorted(params.items())) + APP_SECRET
return hashlib.md5(s.encode()).hexdigest().upper()
def get_item_price(num_iid):
params = {
"method": "taobao.item.get", # 按实际开通的接口名替换
"app_key": APP_KEY, "format": "json", "v": "2.0",
"sign_method": "md5",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"num_iid": num_iid,
"fields": "num_iid,title,price,promotion_price,sku,nick,seller_id,sales",
}
params["sign"] = sign(params)
r = requests.post(API_URL, params=params, timeout=8)
return r.json().get("item_get_response", {}).get("item", {})
def lowest_sku_price(item):
"""取所有 SKU 中的最低价"""
skus = item.get("sku") or []
prices = [float(s["price"]) for s in skus if s.get("price")]
return min(prices) if prices else float(item.get("price", 0))
def display_price(item):
"""最低展示价:SKU 最低价与促销价取小"""
base = lowest_sku_price(item)
promo = item.get("promotion_price")
if promo:
base = min(base, float(promo))
return round(base, 2)
# 主逻辑:低于控价红线就告警
RED_LINE = 49.90
item = get_item_price("680123456789")
fp = display_price(item)
if fp < RED_LINE:
print(f"[告警] {item['nick']} {item['num_iid']} 展示价 {fp} 低于红线 {RED_LINE}")
else:
print(f"[正常] 展示价 {fp}")
批量场景用列表接口(一次最多 20 个商品 ID)减少请求数,别一个商品一个 HTTP。
五、稳定性与限流(最容易翻车的地方)
- 签名:参数必须按 ASCII 升序,顺序错了直接报签名错误;AppSecret 走环境变量,别写死在代码里。
- 限流:第三方接口一般按 QPS 和日配额双重限制(常见约 30 次 / 分钟、1000 次 / 日)。用令牌桶做本地限流,全量同步放凌晨低峰。
- 缓存分级:价格 / SKU 这类高频变动的 TTL 设 60 秒,标题 / 主图这类静态数据 TTL 设 300 秒,省大量配额。
- 重试策略:网络超时 / 5xx 最多重试 3 次,指数退避;429 限流要等退避,别死磕。
- 异常兜底:接口失败时降级用缓存旧价并打标记,宁可显示 "待更新" 也不要显示错误价格误导运营。
六、合规红线(技术贴里必须说)
- 接口合规:只用官方 TOP 或有官方授权的第三方服务,别用破解 / 逆向接口,授权不可用就买不到稳定数据。
- 控价行为合规:中国《反垄断法》及平台经济领域反垄断指南对转售价格维持(RPM,强制卖家不得低于某价销售)有明确约束。控价要做的是证据采集和违规治理—— 处理假货、串货、未授权店铺,而不是强制统一售价,否则控价本身可能违法。建议把 "低于红线" 定位为 "预警",把治理动作落到平台投诉等合规路径上,而非对经销商施压限价。
七、一句话总结
控价系统的技术核心就三件事:拿到当前展示的最低价格(盯 SKU 和促销价,别只盯标价)、稳定不超限流、把 "低价" 变成可追溯的证据。选对数据通道(授权第三方 > 自建爬虫),算对展示价,剩下的就是调度和报表的工程活。