本贴只展示部分结构,「 技术、数据、接口、系统问题欢迎留言私信获取系统演示和API调用  」

在电商选品、比价、货源溯源、跨境铺货等实际业务中,图片搜商品已经成为刚需能力。相比关键词搜索,图片搜索不受标题、语种、类目限制,能直接匹配同款 / 相似货源,是 1688 找货最高效的方式之一。

1688 官方图片搜索能力封装为 item_search_img API,基于深度学习图像特征匹配,支持传入图片 URL 检索相似商品,并返回结构化商品数据。本文从真实开发场景出发,去掉 AI 式套话,补充技术细节、修复代码问题,提供可直接上线使用的调用方案与最佳实践。


一、API 核心能力与适用场景

item_search_img 是面向开发者的以图搜货标准接口,核心能力:

  1. 图像特征提取通过 CNN 卷积神经网络提取商品的颜色、纹理、轮廓、结构特征,生成特征向量,不受水印、角度、光线过度干扰。
  2. 亿级商品库实时匹配与 1688 全量商品库进行相似度计算,返回同款 / 相似款,支持按销量、价格、新品排序。
  3. 结构化数据输出直接返回商品 ID、标题、价格、厂家、销量、店铺类型、商品链接等标准字段,无需解析网页。

真实适用场景

  • 电商一键找同款货源
  • 跨境独立站反向溯源 1688 供应商
  • 价格监控与竞品比价
  • 选品工具批量挖掘工厂货源
  • ERP / 打单系统图片识别商品

二、接入准备(开发者必看)

1. 账号与权限

  • 注册开放平台 / 聚合 API 平台账号(如 OneBound、阿里云 API 市场)
  • 完成企业 / 个人认证,创建应用
  • 获取调用凭证:API Key + Secret

2. 图片规范(决定匹配准确率)

  • 必须是公网可访问 URL(本地图片需上传 OSS / 图床)
  • 推荐:主体居中、无多余背景、清晰度高、无大面积遮挡
  • 支持:JPG/PNG/WebP,大小不超过 4MB
  • 不建议:截图、模糊图、拼接图、纯文字图

3. 必备前置知识

  • URL 编码:图片地址必须编码(特殊字符如 / ? & 会导致请求失败)
  • 接口限流:大多数平台限制 QPS=5~10,需做限流与重试
  • 签名机制:部分环境需要 MD5 签名校验

三、API 接口完整说明

请求信息

  • 请求地址:https://api-gw.onebound.cn/1688/item_search_img
  • 请求方式:GET(推荐)/ POST
  • 数据格式:JSON

核心参数(完整版)

表格

参数名 类型 必填 说明
key string 平台分配的 API 密钥
secret string 签名密钥
imgid string URL 编码后的图片地址
sort string 排序:sale-desc销量降序 /price-asc价格升序
page int 页码,默认 1
page_size int 每页条数,最大 40

通用返回结构

{

# API测试、系统演示控制台:http://console.open.onebound.cn/console/?i=Rookie

  "error_code": "0000",
  "reason": "ok",
  "items": {
    "total_results": 128,
    "item": [
      {
        "title": "商品标题",
        "price": "19.5",
        "sales": "2000+",
        "img_url": "图片",
        "detail_url": "1688商品链接",
        "company_name": "工厂/店铺名",
        "is_factory": true
      }
    ]
  }
}

四、多语言实战代码(可直接生产使用)

1. Python 完整版(含异常处理 + 编码 + 重试)

import requests
import urllib.parse
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 配置信息
API_KEY = "你的API_KEY"
API_SECRET = "你的SECRET"
IMAGE_URL = "https://example.com/your-product.jpg"

def search_1688_by_image(img_url, page=1, page_size=20, sort="sale-desc"):
    """
    1688图片搜索API(稳定生产版)
    """
    # 图片地址必须URL编码
    encoded_img = urllib.parse.quote(img_url)
    
    # 请求参数
    params = {
        "key": API_KEY,
        "secret": API_SECRET,
        "imgid": encoded_img,
        "sort": sort,
        "page": page,
        "page_size": page_size
    }

    # 重试策略(应对限流/网络波动)
    session = requests.Session()
    retry = Retry(total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503])
    session.mount("https://", HTTPAdapter(max_retries=retry))

    try:
        url = "https://api-gw.onebound.cn/1688/item_search_img"
        resp = session.get(url, params=params, timeout=15)
        resp.raise_for_status()
        data = resp.json()

        if data.get("error_code") == "0000":
            return {
                "total": data["items"]["total_results"],
                "items": data["items"]["item"]
            }
        else:
            return {"error": data.get("reason", "调用失败")}
    
    except Exception as e:
        return {"error": f"请求异常:{str(e)}"}

# 调用示例
if __name__ == "__main__":
    result = search_1688_by_image(IMAGE_URL)
    if "items" in result:
        print(f"匹配到 {result['total']} 个商品")
        for item in result["items"][:5]:
            print(f"【商品】{item['title']}")
            print(f"【价格】{item['price']} 元")
            print(f"【销量】{item['sales']}")
            print("-"*50)
    else:
        print(result["error"])

2. Java 生产版(OkHttp + 编码 + 异常处理)

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.net.URLEncoder;
import java.util.concurrent.TimeUnit;

public class _1688ImageSearch {
    private static final String API_KEY = "你的API_KEY";
    private static final String SECRET = "你的SECRET";

    public static JSONObject search(String imageUrl) {
        try {
            OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(15, TimeUnit.SECONDS)
                    .build();

            String encodedImg = URLEncoder.encode(imageUrl, "UTF-8");
            String url = "https://api-gw.onebound.cn/1688/item_search_img"
                    + "?key=" + API_KEY
                    + "&secret=" + SECRET
                    + "&imgid=" + encodedImg
                    + "&sort=sale-desc&page=1&page_size=20";

            Request request = new Request.Builder().url(url).build();
            Response response = client.newCall(request).execute();
            String body = response.body().string();

            JSONObject result = JSON.parseObject(body);
            return result;

        } catch (Exception e) {
            JSONObject error = new JSONObject();
            error.put("error", e.getMessage());
            return error;
        }
    }

    public static void main(String[] args) {
        JSONObject res = search("https://example.com/your-product.jpg");
        System.out.println(res.toJSONString());
    }
}

3. Node.js 版(Axios + 异步优雅写法)

const axios = require('axios');

const API_KEY = "你的API_KEY";
const SECRET = "你的SECRET";

async function searchByImage(imageUrl) {
    try {
        const encodedImg = encodeURIComponent(imageUrl);
        const url = `https://api-gw.onebound.cn/1688/item_search_img`;

        const res = await axios.get(url, {
            params: {
                key: API_KEY,
                secret: SECRET,
                imgid: encodedImg,
                sort: "sale-desc",
                page: 1,
                page_size: 20
            },
            timeout: 15000
        });

        const data = res.data;
        if (data.error_code === "0000") {
            return {
                total: data.items.total_results,
                items: data.items.item
            };
        } else {
            return { error: data.reason };
        }
    } catch (err) {
        return { error: err.message };
    }
}

// 测试调用
searchByImage("https://example.com/your-product.jpg")
    .then(console.log)
    .catch(console.error);

五、关键技术要点(避坑必备)

1. 图片 URL 编码(90% 新手失败原因)

图片地址中如果包含 ? & # 等字符,必须编码,否则接口无法识别。

2. 接口限流与重试

  • 错误码 429 = 请求频率超限
  • 必须使用指数退避重试
  • 单账号 QPS 控制在 5 以内

3. 结果过滤(提升业务精准度)

  • 过滤非工厂店(只保留 is_factory=true
  • 过滤低销量商品
  • 按价格区间筛选
  • 按发货地筛选

4. 合规要求

  • 不得使用侵权图片搜索
  • 不得用于恶意比价、恶意爬取、恶意下单
  • 商品数据仅限自身业务使用
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐