注册认证 → 创建应用 → 申请权限 → 准备图片 → 构造请求 → 解析响应
第一步:注册认证 & 创建应用
| 操作 | 网址 | 说明 |
|---|---|---|
| 注册开发者账号 | 淘宝开放平台 | 支持个人/企业认证 |
| 实名认证 | 开发者中心 | 个人传身份证,企业传营业执照 |
| 创建应用 | 开发者中心 → 应用管理 | 填写应用名称、场景(如"电商比价工具") |
| 获取密钥 | 应用创建成功后 | 获得 App Key 和 App Secret 🔑 |
第二步:申请接口权限
在应用管理中申请 taobao.item.search.img(拍立淘)权限:
- 填写使用场景:如"商品比价"、"智能推荐"、"竞品分析"
- 审核周期:1~3 个工作日
- 等级要求:开发者等级需达 L1级(通过基础考试)
第三步:准备图片
| 方式 | 说明 | 推荐度 |
|---|---|---|
| 图片URL | 公网可访问的图片地址(如 https://img.alicdn.com/xxx.jpg) |
⭐⭐⭐⭐⭐ |
| Base64编码 | 本地图片转Base64,去除前缀 data:image/jpeg;base64, |
⭐⭐⭐ |
📸 图片要求:JPG/PNG 格式,≤2MB,分辨率 ≥800×800,商品主体占比 ≥60%,避免水印/复杂背景
第四步:构造请求(核心)
🔧 请求地址
`https://eco.taobao.com/router/rest (推荐)
https://api.taobao.com/imgsearch/item_search_img.do
`
📦 请求参数
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
app_key |
✅ | String | 你的 App Key |
method |
✅ | String | 固定为 taobao.item.search.img |
timestamp |
✅ | String | yyyy-MM-dd HH:mm:ss,与服务器误差≤10分钟 |
format |
✅ | String | 固定为 json |
v |
✅ | String | 固定为 2.0 |
sign_method |
✅ | String | 固定为 md5 |
image |
✅ | String | 图片URL 或 Base64编码 |
page |
❌ | Number | 页码,默认1,最大100 |
page_size |
❌ | Number | 每页数量,默认20,最大100 |
sort |
❌ | String | sales/price_asc/price_desc |
shop_type |
❌ | String | tmall(天猫)/taobao(淘宝) |
cat |
❌ | String | 商品类目ID(如女装:50010788) |
🔐 签名生成(最关键!)
签名规则(MD5加密):
`1. 收集所有参数(排除 sign 本身)
2. 按参数名 ASCII 码升序排序
3. 拼接:param1value1param2value2...
4. 首尾加上 AppSecret:AppSecret + 拼接串 + AppSecret
5. MD5 加密 → 转大写 → 即为 sign 值
`
第五步:完整代码实现(Python)
python
`import requests
import hashlib
import time
import base64
# ============= 配置区 =============
APP_KEY = "你的AppKey"
APP_SECRET = "你的AppSecret"
IMAGE_URL = "https://example.com/product.jpg" # 或本地图片路径
# ==================================
def generate_sign(params, app_secret):
"""生成MD5签名"""
sorted_params = sorted(params.items(), key=lambda x: x[0])
param_str = ''.join([f"{k}{v}" for k, v instr = app_secret + param_str + app_secret
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
def search_by_image(image_url):
"""以图搜商品 - 核心函数"""
url = "https://eco.taobao.com/router/rest"
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
params = {
"app_key": APP_KEY,
"method": "taobao.item.search.img",
"timestamp": timestamp,
"format": "json",
"v": "2.0",
"sign_method": "md5",
"image": image_url, # 图片URL
"page": 1,
"page_size": 20,
"sort": "sales", # 按销量排序
}
# 生成签名
params["sign"] = generate_sign(params, APP_SECRET)
# 发送POST请求
response = requests.post(url, data=params)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"请求失败: {response.status_code}, {response.text}")
# ============= 执行调用 =============
result = search_by_image(IMAGE_URL)
# ============= 解析结果 =============
if result.get("error_response"):
print(f"❌ 错误: {result['error_response']['msg']}")
else:
items = result.get("item_search_img_response", {}).get("items", {}).get("item", [])
print(f"✅ 共找到 {len(items)} 个相似商品\n")
for i, item in enumerate(items, 1):
print(f"--- 商品 {i} ---")
print(f" 📦 标题: {item.get('title')}")
print(f" 💰 价格: ¥{item.get('price')}")
print(f" 📊 销量: {item.get('sales', 'N/A')}")
print(f" 🎯 相似度: {item.get('match_rate', 'N/A')}")
print(f" 🔗 链接: {item.get('detail_url')}")
print(f" 📸 图片: {item.get('pic_url')}")
print()
`
📤 本地图片转Base64调用
python
`def image_to_base64(image_path):
with open(image_path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
# 调用
img_base64 = image_to_base64("test.jpg")
result = search_by_image(img_base64) # 传入Base64字符串
`
第六步:响应数据结构
json
`{
"item_search_img_response": {
"items": {
"total_results": 128,
"item": [
{
"title": "2025夏季新款连衣裙女法式气质收腰显瘦",
"num_iid": "782345612345",
"price": "199.00",
"pic_url": "https://img.alicdn.com/bao/uploaded/xxx.jpg",
"detail_url": "https://item.taobao.com/item.htm?id=782345612345",
"match_rate": "0.95",
"sales": 2560,
"nick": "时尚女装旗舰店",
"shop_type": "tmall"
}
]
},
"request_id": "q6x3vcy5t84d"
}
}
`
| 字段 | 含义 |
|---|---|
title |
商品标题 |
num_iid |
商品唯一ID |
price |
售价 |
pic_url |
商品主图 |
detail_url |
商品详情页链接 |
match_rate |
相似度评分(0~1) |
sales |
月销量 |
nick |
店铺名称 |
shop_type |
tmall/taobao |
⚠️ 常见错误 & 解决方案
| 错误码 | 含义 | 解决方案 |
|---|---|---|
isp.no-permission |
权限不足 | 检查是否已申请 item_search.img 权限 |
isp.limit-exceeded |
调用超限 | 免费版约500次/天,添加指数退避重试 |
| 签名错误 | 签名验证失败 | 检查参数排序 + 时间戳(±5分钟有效) |
| 错误码 7 | 图片格式不支持 | 转换为 JPG/PNG,≤500KB |
| 错误码 15 | 图片尺寸过大 | 压缩至 800×800 以上即可 |
📊 调用配额参考
| 开发者等级 | 每日配额 | QPS |
|---|---|---|
| 免费版 | ~500次/天 | ≤5 |
| L1企业认证 | ~1万次/天 | ≤20 |
| L2高级认证 | ~10万次/天 | ≤100 |
💡 提示:如需更高频调用,可购买 API 套餐(10万次/月起)
🔄 第三方替代方案(无需官方权限)
如果官方权限申请困难,可使用第三方数据服务平台:
| 平台 | 接口 | 特点 |
|---|---|---|
| OneBound(万邦) | 1688.item_search_img |
支持1688以图搜货,有免费额度 |
| 数据威 / 店侦探 | 拍立淘API | 付费订阅,数据准确 |
| Taobaoapi2014 | 淘宝拍立淘 | 提供API Key直接调用 |
✅ 快速检查清单
- 淘宝开放平台已注册并完成实名认证
- 应用已创建,App Key / Secret 已获取
- item_search.img 权限已申请并审核通过
- 图片为 JPG/PNG,≤2MB,主体清晰
- 签名按 ASCII 升序 + MD5 规则正确生成
- 时间戳与服务器误差 ≤10 分钟
- 请求方式使用 POST(避免GET参数过长)
按以上流程操作,即可稳定获取淘宝商品信息!🎯