在跨境电商和供应链选品的场景中,"有图无货号"是最常见的痛点——你在亚马逊、TikTok Shop 或展会上看到一款潜力商品,只有图片却不知道源头工厂在哪里。1688 的图搜接口(俗称"拍立淘")正是解决这个问题的"核武器":上传一张商品图片,系统通过图像识别技术自动匹配 1688 平台上的同款或相似货源,返回商品 ID、批发价、起订量、供应商等完整结构化数据。
一、接口定位:什么是 1688 图搜接口?
1688 图搜接口是 1688 开放平台提供的官方图像检索能力,基于深度学习图像识别技术,支持通过图片 URL 或 Base64 编码,快速匹配平台内的 B2B 商品 。
核心特点:
| 项目 | 说明 |
|---|---|
| 接口名称 | alibaba.ai.vision.product.search / alibaba.image.search.offer.match / 1688.item_search_img(不同文档版本命名略有差异) |
| 请求方式 | POST(推荐,支持大图 Base64)/ GET(传 URL) |
| 协议 | HTTPS |
| 数据格式 | JSON |
| 认证方式 | AppKey + AppSecret + MD5 签名 |
| 权限要求 | 企业开发者认证 + 接口白名单申请(个人账号无法申请) |
| 匹配类型 | 同款(exact)/ 相似(similar) 与淘宝 C 端拍立淘的区别: 表格 |
| 维度 | 1688 B 端图搜 | 淘宝 C 端拍立淘 |
|---|---|---|
| 接口名 | alibaba.ai.vision.product.search | taobao.item.search.img |
| 开放对象 | 企业开发者(需营业执照) | 企业/个人(权限受限) |
| 返回数据 | 批发价、MOQ、工厂资质、现货/定制 | 零售价、销量、店铺评分 |
| 识别维度 | 外观 + 材质 + 规格 + 供应链属性 | 外观 + 风格 + 搭配 |
| 核心用途 | 货源采购、工厂比价、供应链选品 | 零售比价、穿搭识图 |
二、接入门槛:为什么个人开发者用不了?
1688 图搜接口属于视觉技术类接口,权限管控比普通商品接口严格得多 。
2.1 准入流程
Step 1:企业开发者认证
- 登录 1688 开放平台(open.1688.com)
- 使用企业营业执照注册开发者账号
- 提交对公账户信息,1~3 个工作日审核
- 个人账号仅支持基础测试,无商业使用权限
- Step 2:创建应用
- 应用类型选择"采购管理""供应链优化"或"视觉识别工具"
- 填写场景说明(如"企业采购以图搜货,通过商品图片匹配 1688 货源")
- Step 3:申请图搜接口权限
- 进入应用详情 → 接口权限 → 申请新接口
- 搜索关键词:图片搜索 / searchByImage / 以图搜货
- 提交使用说明,明确"图片来源为企业采购样品、展会素材或公开竞品图片,不涉及侵权"
- 此接口通常需人工审核,1~3 个工作日邮件通知结果
- Step 4:沙箱测试 → 生产上线
- 审核通过后,先在沙箱环境用测试图片验证连通性
- 确认无误后切换生产网关
三、图片规范:识别率的关键
图搜接口的识别准确率,50% 取决于图片质量。
| 规范项 | 要求 | 优化建议 |
|---|---|---|
| 格式 | JPG / PNG | 不推荐 GIF,避免透明通道干扰 |
| 大小 | ≤ 2MB | 推荐 ≤ 500KB,提升传输速度和接口稳定性 |
| 分辨率 | ≥ 200×200 | 低于此值识别率显著下降 |
| 内容 | 商品主体清晰 | 白底/纯色背景图识别率提升 40% |
| 遮挡 | 无水印、无文字、无拼接 | 文字和水印会干扰特征提取 |
| 传参方式 | Base64 编码 或 公网 URL | Base64 更稳定(避免 URL 失效),但需注意编码后体积 图片预处理代码(Python + Pillow): Python |
from PIL import Image
import io
import base64
def preprocess_image(image_path: str, max_size_kb: int = 500, target_size: tuple = (800, 800)) -> str:
"""
图片预处理:压缩、裁剪、转Base64
"""
with Image.open(image_path) as img:
# 1. 转RGB(去除透明通道)
if img.mode in ('RGBA', 'P'):
img = img.convert('RGB')
# 2. 等比缩放,最大边不超过 target_size
img.thumbnail(target_size, Image.Resampling.LANCZOS)
# 3. 压缩至目标大小
quality = 95
while True:
buffer = io.BytesIO()
img.save(buffer, format='JPEG', quality=quality, optimize=True)
size_kb = buffer.tell() / 1024
if size_kb <= max_size_kb or quality <= 30:
break
quality -= 5
# 4. 转Base64,去除换行和空格
base64_str = base64.b64encode(buffer.getvalue()).decode('utf-8')
return base64_str.replace("\n", "").replace(" ", "")
四、接口调用:完整技术实现
4.1 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
method | String | 是 | 接口方法名,如 alibaba.ai.vision.product.search |
app_key | String | 是 | 应用唯一标识 |
timestamp | String | 是 | 毫秒级时间戳(13位)或 yyyy-MM-dd HH:mm:ss |
v | String | 是 | API 版本,通常 2.0 |
format | String | 是 | 固定 json |
sign_method | String | 是 | 固定 md5 |
sign | String | 是 | MD5 大写签名 |
image / imgid | String | 是 | 图片 Base64 编码 或 公网 URL |
imageType | String | 否 | base64 或 url,明确传图方式 |
matchType | String | 否 | exact(同款)/ similar(相似),默认 similar |
page / pageNum | Integer | 否 | 页码,从 1 开始 |
pageSize | Integer | 否 | 每页条数,最大 50 |
sort / sortType | String | 否 | _sale(销量)/ _price(价格)/ booked |
4.2 MD5 签名规则
与 1688 其他接口一致 :
import hashlib
def generate_1688_sign(params: dict, app_secret: str) -> str:
"""
生成1688 MD5签名
"""
# 过滤空值和 sign 本身
filtered = {k: v for k, v in params.items() if v is not None and k != 'sign'}
# 按 key ASCII 升序排序
sorted_params = sorted(filtered.items(), key=lambda x: x[0])
# 拼接成 key=value&key=value,值需URL编码
import urllib.parse
param_str = '&'.join([f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params])
# 首尾拼接 app_secret
sign_str = f"{app_secret}{param_str}{app_secret}"
# MD5 大写
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
4.3 完整调用示例(Python)
import requests
import hashlib
import time
import base64
import urllib.parse
from typing import Dict, List, Optional
class Ali1688ImageSearch:
"""
1688 拍立淘/图搜接口封装
"""
def __init__(self, app_key: str, app_secret: str):
self.app_key = app_key
self.app_secret = app_secret
# 网关地址以官方最新文档为准
self.gateway = "https://gw.open.1688.com/openapi/param2/2/portals.open/api/alibaba.image.search.offer.match"
def _sign(self, params: Dict) -> str:
"""MD5 签名"""
filtered = {k: v for k, v in params.items() if v is not None and k != 'sign'}
sorted_params = sorted(filtered.items(), key=lambda x: x[0])
param_str = '&'.join([f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params])
sign_str = f"{self.app_secret}{param_str}{self.app_secret}"
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
def search_by_image(self,
image_input: str,
is_base64: bool = True,
match_type: str = "exact",
sort: str = "_sale",
page_size: int = 20) -> Optional[Dict]:
"""
以图搜货
:param image_input: Base64字符串 或 图片URL
:param is_base64: True表示Base64,False表示URL
:param match_type: exact=同款, similar=相似
:param sort: _sale=销量, _price=价格
:param page_size: 每页条数,最大50
"""
# 组装参数
params = {
"method": "alibaba.image.search.offer.match",
"app_key": self.app_key,
"timestamp": str(int(time.time() * 1000)),
"format": "json",
"v": "2.0",
"sign_method": "md5",
"image": image_input,
"imageType": "base64" if is_base64 else "url",
"matchType": match_type,
"sortType": sort,
"pageNum": "1",
"pageSize": str(min(page_size, 50)),
"needSupplyInfo": "true" # 返回供应链字段
}
params["sign"] = self._sign(params)
try:
resp = requests.post(self.gateway, data=params, timeout=(5, 15))
resp.raise_for_status()
result = resp.json()
if "error_response" in result:
err = result["error_response"]
raise Exception(f"接口错误 [{err.get('code')}]: {err.get('msg')}")
return result.get("alibaba_image_search_offer_match_response", {}).get("result", {})
except requests.exceptions.Timeout:
print("接口超时:建议压缩图片至500KB以内")
return None
except Exception as e:
print(f"请求失败: {e}")
return None
def extract_offers(self, result: Dict) -> List[Dict]:
"""解析并标准化返回结果"""
offers = []
raw_offers = result.get("offerList", [])
for raw in raw_offers:
# 处理批发价区间(如 "10.00-15.00" 或单值)
price_range = raw.get("priceRange", "0.00")
if "-" in str(price_range):
min_price, max_price = map(float, str(price_range).split("-"))
else:
min_price = max_price = float(price_range)
# 处理起订量(如 "10+")
moq_str = str(raw.get("moq", "0")).replace("+", "")
moq = int(moq_str) if moq_str.isdigit() else 0
offers.append({
"offerId": raw.get("offerId"),
"title": raw.get("title", ""),
"similarity": float(raw.get("similarity", 0)), # 相似度 0~1
"minPrice": min_price,
"maxPrice": max_price,
"moq": moq,
"supplierName": raw.get("supplierName", ""),
"supplyType": raw.get("supplyType", ""), # 现货/定制
"mainImage": raw.get("mainImage", ""),
"detailUrl": raw.get("detailUrl", "")
})
return offers
# 使用示例
if __name__ == "__main__":
client = Ali1688ImageSearch("your_app_key", "your_app_secret")
# 方式1:本地图片转Base64
with open("product.jpg", "rb") as f:
img_b64 = base64.b64encode(f.read()).decode('utf-8').replace("\n", "")
result = client.search_by_image(img_b64, is_base64=True, match_type="exact")
if result:
offers = client.extract_offers(result)
print(f"共找到 {len(offers)} 个匹配商品")
# 按相似度过滤(≥0.85视为同款)
same_style = [o for o in offers if o["similarity"] >= 0.85]
print(f"同款商品 {len(same_style)} 个")
for item in same_style[:5]:
print(f"• {item['title']} | ¥{item['minPrice']}-{item['maxPrice']} | MOQ:{item['moq']} | 相似度:{item['similarity']:.0%}")
五、返回数据结构解析
图搜接口返回的核心字段与普通商品搜索不同,更侧重供应链属性:
{
"alibaba_image_search_offer_match_response": {
"result": {
"totalCount": 156,
"pageNum": 1,
"pageSize": 20,
"offerList": [
{
"offerId": "123456789012345",
"title": "2026新款 磁吸无线充电宝 10000mAh 超薄便携",
"mainImage": "https://cbu01.alicdn.com/...",
"similarity": 0.92,
"priceRange": "32.00-45.00",
"moq": "50",
"supplyType": "现货",
"supplierName": "深圳市XX电子有限公司",
"supplierId": "b2b-123456",
"detailUrl": "https://detail.1688.com/offer/123456789012345.html",
"bookedCount": 1860,
"isFactory": true
}
]
}
}
}
关键字段说明:
表格
| 字段 | 说明 | 运营价值 |
|---|---|---|
similarity | 相似度得分,0~1 | ≥0.85 通常视为同款,0.6~0.85 为相似款,<0.6 建议过滤 |
priceRange | 批发价区间 | 判断毛利空间,注意是阶梯价范围 |
moq | 最小起订量 | 判断是否匹配你的资金实力和业务模式 |
supplyType | 现货 / 定制 | 现货适合快速铺货,定制适合建立品牌壁垒 |
supplierName | 供应商名称 | 初步判断是工厂还是贸易公司 |
isFactory | 是否源头工厂 | true = 工厂直营,价格谈判空间更大 |
bookedCount | 成交笔数 | 验证市场需求真实性 |
六、五大业务场景落地指南
场景 1:跨境选品——从海外热销到国内货源
流程:
- 在亚马逊/TikTok Shop/Temu 发现月销 5000+ 的潜力商品
- 下载其主图,调用 1688 图搜接口
- 过滤 similarity ≥ 0.85 的同款,按 minPrice 排序
- 提取 Top 5 的 offerId,再调 alibaba.product.get 获取完整 SKU、库存、运费模板
- 计算毛利空间,确定采购方案
- 价值: 将"凭感觉选品"变成"用数据验证选品",找到经过市场验证的爆款源头。
场景 2:竞品监控——追踪对手货源
流程:
- 定期抓取竞争对手店铺的商品主图
- 批量调用图搜接口,反向查找其 1688 供应商
- 监控供应商的价格变动和库存深度
- 发现对手断货时,快速卡位抢占市场
场景 3:铺货采集——从 1688 到多平台
流程:
- 在 1688 看到一款潜力商品,保存其主图
- 用图搜接口找到 3~5 家同款供应商,比价后选定最优货源
- 调用商品详情接口获取完整标题、图片、SKU、详情 HTML
- 清洗翻译后,通过 Shopee/Lazada/独立站 API 自动刊登
场景 4:侵权检测——保护自有设计
流程:
- 上传自有设计图或产品实拍图
- 调用图搜接口搜索 1688 上的相似商品
- 发现 similarity > 0.9 且非授权店铺 → 疑似侵权
- 提取证据,发起知识产权投诉
场景 5:展会/样品溯源——快速找工厂
流程:
- 在展会拿到样品,拍照上传
- 图搜接口返回 1688 上的同款货源
- 直接联系工厂,跳过中间贸易商
- 对比多家工厂的 MOQ、定制能力和报价
七、供应链匹配排序算法
图搜接口返回的结果默认按相似度排序,但在实际采购中,相似度不是唯一决策因子。建议引入复合评分模型 :
Python
def optimize_supply_chain_sort(offers: List[Dict], weights: Dict = None) -> List[Dict]:
"""
供应链匹配复合排序
默认权重:相似度(50%) > 起订量(30%) > 供应类型(20%)
"""
weights = weights or {"similarity": 0.5, "moq": 0.3, "supply_type": 0.2}
# 计算最大 MOQ 用于归一化
max_moq = max([o["moq"] for o in offers]) if offers else 1000
for offer in offers:
# 相似度得分(0~50分)
sim_score = offer["similarity"] * 100 * weights["similarity"]
# 起订量得分(MOQ越小得分越高,0~30分)
moq_score = (1 - min(offer["moq"] / max_moq, 1)) * 100 * weights["moq"]
# 供应类型得分(现货=20分,定制=10分)
if offer["supplyType"] == "现货":
type_score = 100 * weights["supply_type"]
elif offer["supplyType"] == "定制":
type_score = 50 * weights["supply_type"]
else:
type_score = 25 * weights["supply_type"]
offer["compositeScore"] = round(sim_score + moq_score + type_score, 2)
# 按综合得分降序,得分相同按相似度降序
return sorted(offers, key=lambda x: (-x["compositeScore"], -x["similarity"]))
使用场景:- 测款期(资金有限):调高 moq 权重,优先选支持小批量采购的供应商
- 稳定期(追求利润):调高 similarity 权重,确保货源与目标商品高度一致
- 紧急补货(追求速度):调高 supply_type 权重,优先选"现货"供应商
八、踩坑清单与最佳实践
8.1 权限与申请
| 坑 | 现象 | 解决方案 |
|---|---|---|
| 未申请权限直接调用 | 返回 403 no permission / invalid method | 必须在控制台提交"图片搜索"权限申请,等 1~3 个工作日人工审核 |
| 个人账号申请 | 无法看到视觉技术类接口 | 必须企业营业执照认证 |
| 沙箱/生产混用 | 沙箱返回空数据 | 审核通过后切生产网关,沙箱仅做连通性验证 |
8.2 图片与识别
| 坑 | 现象 | 解决方案 |
|---|---|---|
| 图片过大 | 超时或 IllegalParam imageData | 压缩至 ≤ 500KB,JPG 优先 |
| Base64 带换行/前缀 | 签名不匹配或解析失败 | 去除 \n、\r、空格,不要带 data:image/jpeg;base64, 前缀 |
| 图片有水印/文字 | 识别率低,返回不相关商品 | 使用白底/纯色背景、无遮挡的商品主体图 |
| 分辨率过低 | 返回结果少或相似度低 | 确保 ≥ 200×200,推荐 800×800 |
8.3 签名与调用
| 坑 | 现象 | 解决方案 |
|---|---|---|
| QPS 超限 | 返回 429 或请求被限流 | 图片搜索默认 QPS ≤ 5/s,建议 TokenBucket 限速设 3~4,失败后指数退避 |
| 签名大小写错误 | 返回 Invalid signature | MD5 结果必须转 大写 |
| 参数值未 URL 编码 | 中文标题导致签名不匹配 | 拼接签名串时,参数值必须做 URL 编码 |
| 时间戳过期 | 返回 Invalid timestamp | 使用毫秒级时间戳,服务器时间与北京时间误差 < 500ms |
8.4 数据解读
| 坑 | 现象 | 解决方案 |
|---|---|---|
| 只看相似度不看价格 | 相似度 0.95 但价格比竞品贵 50% | 必须结合 priceRange 和 moq 做综合决策 |
| 忽视 supplyType | 选了相似度最高的,结果是"定制"需 30 天交货 | 紧急需求优先选"现货",长期合作再考虑"定制" |
| priceRange 是区间 | 误把最低价当实际采购价 | 按实际采购量读取对应阶梯价 |
九、完整选品链路:从图片到采购决策
海外平台热销商品/展会样品/竞品图片
│
▼
┌─────────────────────┐
│ 图片预处理 │
│ (压缩→去底→转Base64) │
└─────────────────────┘
│
▼
┌─────────────────────┐
│ 1688 图搜接口 │
│ (alibaba.image.search)│
└─────────────────────┘
│
▼
┌─────────────────────┐
│ 结果过滤 │
│ similarity ≥ 0.85 │
│ 按 compositeScore 排序 │
└─────────────────────┘
│
▼
┌─────────────────────┐
│ 商品详情接口 │
│ (alibaba.product.get) │
│ 获取 SKU/MOQ/库存/运费 │
└─────────────────────┘
│
▼
┌─────────────────────┐
│ 供应商背调 │
│ 诚信通年限/工厂认证/评价 │
└─────────────────────┘
│
▼
┌─────────────────────┐
│ 采购决策 │
│ 测款→起量→锁产能 │
└─────────────────────┘
十、总结:图搜接口的底层价值
1688 图搜接口的核心价值,在于打破了"语言描述"和"关键词匹配"的局限:
- 传统选品:你需要知道商品叫"磁吸充电宝",才能在 1688 搜到
- 图搜选品:你只需要有一张商品图片,系统就能自动识别外观特征,找到同款货源
- 这对于跨境电商卖家尤其重要——很多海外热销品的英文名称、当地叫法,与国内工厂的关键词体系完全不同。图搜接口绕过了这个"语言鸿沟",直接用视觉特征连接供应链。
技术心法:图搜不是万能的。它解决的是"找得到"的问题,但"值不值得采"还需要结合价格、MOQ、库存、供应商资质做二次判断。把图搜接口当作选品漏斗的"第一层筛子",而不是最终决策依据。
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系

