如何通过1688开放平台API获取指定店铺所有商品

3 阅读3分钟

场景需求: 在开发电商ERP、数据采集工具或竞品分析系统时,经常需要获取1688平台上某个店铺的全部商品信息(如标题、价格、SKU、库存等)。本文将介绍如何通过1688开放平台提供的官方API实现这一功能。


一、核心接口:alibaba.product.getSellerProductList

这是1688开放平台提供的用于获取卖家商品列表的API。通过合理配置请求参数和分页处理,即可获取全量商品数据。

接口地址: https://api.1688.com/router/rest

请求方式: POST
数据格式: application/x-www-form-urlencoded


二、关键实现步骤

1. 准备环境
  • 注册1688开放平台账号,创建应用并获取 appKeyappSecret
  • 引导卖家完成授权,获取店铺的 access_token(需 seller_view 权限)。
2. 基础请求参数
base_params = {
    'method': 'alibaba.product.getSellerProductList',
    'app_key': 'YOUR_APP_KEY',
    'access_token': 'SELLER_ACCESS_TOKEN',
    'timestamp': str(int(time.time() * 1000)),  # 毫秒时间戳
    'format': 'json',
    'v': '2.0',
    'sign_method': 'md5'
}

3. 分页控制参数
  • page_no: 当前页码(从1开始)
  • page_size: 每页条数(建议不超过50)
# 示例:请求第2页,每页30条
page_params = {
    'page_no': 2,
    'page_size': 30
}

4. 签名生成

所有参数需按字母序排序后拼接,加上 appSecret 进行MD5签名:

def generate_sign(params, app_secret):
    param_str = '&'.join([f'{k}{v}' for k, v in sorted(params.items())])
    full_str = f'{app_secret}{param_str}{app_secret}'
    return hashlib.md5(full_str.encode()).hexdigest().upper()


三、完整请求示例(Python)

import requests
import time
import hashlib

def fetch_all_products(app_key, app_secret, access_token, max_page=50):
    all_products = []
    page_no = 1
    
    while page_no <= max_page:
        # 1. 构造基础参数
        params = {
            'method': 'alibaba.product.getSellerProductList',
            'app_key': app_key,
            'access_token': access_token,
            'timestamp': str(int(time.time() * 1000)),
            'format': 'json',
            'v': '2.0',
            'sign_method': 'md5',
            'page_no': page_no,
            'page_size': 50
        }
        
        # 2. 生成签名
        params['sign'] = generate_sign(params, app_secret)
        
        # 3. 发送请求
        resp = requests.post('https://api.1688.com/router/rest', data=params)
        data = resp.json()
        
        # 4. 处理异常
        if 'error' in data:
            print(f"Error: {data['error']['msg']} (Code: {data['error']['code']})")
            break
        
        # 5. 存储当前页商品
        products = data['result']['productInfos']['productInfo']
        all_products.extend(products)
        
        # 6. 分页终止判断
        if len(products) < params['page_size']:
            break
            
        page_no += 1
        time.sleep(0.5)  # 避免请求过频
    
    return all_products


四、响应数据结构解析

成功响应示例:

{
  "result": {
    "productInfos": {
      "productInfo": [
        {
          "productId": 1234567890,
          "subject": "商品标题",
          "price": "99.00",
          "unit": "件",
          "status": "published"
        },
        // ... 其他商品
      ]
    },
    "totalCount": 120  // 店铺商品总数
  }
}


五、注意事项

  1. 频率限制:单个应用默认每秒10次请求,需根据 totalCount 控制分页节奏。

  2. 字段覆盖:若需获取详情(如描述、SKU),需二次调用 alibaba.product.get 接口。

  3. 授权有效期access_token 有效期通常为30天,需实现刷新机制。

  4. 错误码处理

    • isv.missing-parameter: 参数缺失
    • isv.invalid-access-token: 令牌失效
    • isp.api-qps-limit: 请求超频

六、优化建议

  • 异步抓取:使用生产者-消费者模型提升采集效率。
  • 本地缓存:存储 productId 避免重复获取详情。
  • 增量同步:通过 modify_stamp 参数仅拉取变更商品。

通过上述实现,可稳定获取店铺商品数据。建议详细阅读1688API文档,根据业务需求扩展字段处理逻辑。