×

速卖通平台关键字搜索商品列表列表接口实现指南:从接口分析到代码落地

Ace Ace 发表于2025-08-15 17:37:35 浏览57 评论0

抢沙发发表评论

在跨境电商开发中,速卖通平台的商品数据获取是许多开发者关注的焦点。本文将详细介绍如何实现速卖通关键字搜索商品列表接口,涵盖接口请求参数分析、签名机制、分页处理及完整代码实现,帮助开发者快速对接速卖通开放平台。

一、接口基本信息

速卖通提供的关键字搜索商品列表接口(aliexpress.open.api.queryproductlistbynick)属于开放平台的基础接口,主要用于通过关键字检索商品信息。


接口特点


  • 支持多条件组合搜索(关键字、价格区间、销量排序等)

  • 采用 RESTful 风格设计

  • 需要通过 App Key 和 App Secret 进行身份验证

  • 支持分页查询,最大页容量为 50 条

图片.png

点击获取key和secret

二、核心参数解析

  1. 公共参数
    • app_key:应用唯一标识

    • sign:API 请求签名

    • timestamp:请求时间戳(毫秒级)

    • format:响应格式(默认 JSON)

    • v:API 版本号(当前为 2.0)

  2. 业务参数
    • keywords:搜索关键字(必填)

    • page_no:页码(默认 1)

    • page_size:每页条数(1-50)

    • sort_type:排序方式(price_asc/price_desc/sales_desc)

    • min_price:最低价格

    • max_price:最高价格

三、签名机制实现

速卖通 API 采用 HMAC-MD5 签名算法,实现步骤如下:


  1. 将所有请求参数(包括公共参数和业务参数)按参数名 ASCII 码升序排序

  2. 拼接为 "参数名 = 参数值" 的键值对形式,并用 & 连接

  3. 在拼接字符串前后分别加上 app_secret

  4. 对最终字符串进行 HMAC-MD5 加密,得到签名值

四、完整代码实现

下面是使用 Python 实现的速卖通关键字搜索商品列表接口调用代码:


import requests
import time
import hashlib
import hmac
import urllib.parse
from typing import Dict, List, Optional
 
class AliexpressAPI:
    def __init__(self, app_key: str, app_secret: str):
        self.app_key = app_key
        self.app_secret = app_secret
        self.api_url = "https://gw.api.alibaba.com/openapi/param2/2.0/aliexpress.open.api.queryproductlistbynick"
    
    def _generate_sign(self, params: Dict[str, str]) -> str:
        """生成API请求签名"""
        # 按参数名ASCII升序排序
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        # 拼接参数
        query_string = "&".join([f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params])
        # 计算签名
        sign_str = self.app_secret + query_string + self.app_secret
        signature = hmac.new(
            self.app_secret.encode('utf-8'),
            sign_str.encode('utf-8'),
            hashlib.md5
        ).hexdigest().upper()
        return signature
    
    def search_products(self, 
                       keywords: str,
                       page_no: int = 1,
                       page_size: int = 20,
                       sort_type: Optional[str] = None,
                       min_price: Optional[float] = None,
                       max_price: Optional[float] = None) -> Dict:
        """
        搜索速卖通商品
        
        参数:
            keywords: 搜索关键字
            page_no: 页码
            page_size: 每页条数
            sort_type: 排序方式(price_asc/price_desc/sales_desc)
            min_price: 最低价格
            max_price: 最高价格
            
        返回:
            商品列表数据
        """
        # 公共参数
        params = {
            "app_key": self.app_key,
            "timestamp": str(int(time.time() * 1000)),
            "format": "json",
            "v": "2.0",
            "method": "aliexpress.open.api.queryproductlistbynick",
            "keywords": keywords,
            "page_no": str(page_no),
            "page_size": str(page_size)
        }
        
        # 添加可选参数
        if sort_type:
            params["sort_type"] = sort_type
        if min_price:
            params["min_price"] = str(min_price)
        if max_price:
            params["max_price"] = str(max_price)
        
        # 生成签名
        params["sign"] = self._generate_sign(params)
        
        try:
            # 发送请求
            response = requests.get(self.api_url, params=params, timeout=10)
            response.raise_for_status()  # 抛出HTTP错误
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"请求错误: {str(e)}")
            return {"error": str(e)}
 
# 使用示例
if __name__ == "__main__":
    # 替换为你的app_key和app_secret
    APP_KEY = "your_app_key"
    APP_SECRET = "your_app_secret"
    
    # 初始化API客户端
    api = AliexpressAPI(APP_KEY, APP_SECRET)
    
    # 搜索商品
    result = api.search_products(
        keywords="smartphone",
        page_no=1,
        page_size=20,
        sort_type="sales_desc",
        min_price=10.0,
        max_price=100.0
    )
    
    # 处理结果
    if "error" not in result:
        print(f"搜索到 {result.get('total_results', 0)} 个商品")
        for item in result.get("products", []):
            print(f"标题: {item.get('title')}")
            print(f"价格: {item.get('price')}")
            print(f"销量: {item.get('sales')}")
            print("---")
    else:
        print(f"搜索失败: {result['error']}")import requests
import time
import hashlib
import hmac
import urllib.parse
from typing import Dict, List, Optional

class AliexpressAPI:
    def __init__(self, app_key: str, app_secret: str):
        self.app_key = app_key
        self.app_secret = app_secret
        self.api_url = "https://gw.api.alibaba.com/openapi/param2/2.0/aliexpress.open.api.queryproductlistbynick"
    
    def _generate_sign(self, params: Dict[str, str]) -> str:
        """生成API请求签名"""
        # 按参数名ASCII升序排序
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        # 拼接参数
        query_string = "&".join([f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params])
        # 计算签名
        sign_str = self.app_secret + query_string + self.app_secret
        signature = hmac.new(
            self.app_secret.encode('utf-8'),
            sign_str.encode('utf-8'),
            hashlib.md5
        ).hexdigest().upper()
        return signature
    
    def search_products(self, 
                       keywords: str,
                       page_no: int = 1,
                       page_size: int = 20,
                       sort_type: Optional[str] = None,
                       min_price: Optional[float] = None,
                       max_price: Optional[float] = None) -> Dict:
        """
        搜索速卖通商品
        
        参数:
            keywords: 搜索关键字
            page_no: 页码
            page_size: 每页条数
            sort_type: 排序方式(price_asc/price_desc/sales_desc)
            min_price: 最低价格
            max_price: 最高价格
            
        返回:
            商品列表数据
        """
        # 公共参数
        params = {
            "app_key": self.app_key,
            "timestamp": str(int(time.time() * 1000)),
            "format": "json",
            "v": "2.0",
            "method": "aliexpress.open.api.queryproductlistbynick",
            "keywords": keywords,
            "page_no": str(page_no),
            "page_size": str(page_size)
        }
        
        # 添加可选参数
        if sort_type:
            params["sort_type"] = sort_type
        if min_price:
            params["min_price"] = str(min_price)
        if max_price:
            params["max_price"] = str(max_price)
        
        # 生成签名
        params["sign"] = self._generate_sign(params)
        
        try:
            # 发送请求
            response = requests.get(self.api_url, params=params, timeout=10)
            response.raise_for_status()  # 抛出HTTP错误
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"请求错误: {str(e)}")
            return {"error": str(e)}

# 使用示例
if __name__ == "__main__":
    # 替换为你的app_key和app_secret
    APP_KEY = "your_app_key"
    APP_SECRET = "your_app_secret"
    
    # 初始化API客户端
    api = AliexpressAPI(APP_KEY, APP_SECRET)
    
    # 搜索商品
    result = api.search_products(
        keywords="smartphone",
        page_no=1,
        page_size=20,
        sort_type="sales_desc",
        min_price=10.0,
        max_price=100.0
    )
    
    # 处理结果
    if "error" not in result:
        print(f"搜索到 {result.get('total_results', 0)} 个商品")
        for item in result.get("products", []):
            print(f"标题: {item.get('title')}")
            print(f"价格: {item.get('price')}")
            print(f"销量: {item.get('sales')}")
            print("---")
    else:
        print(f"搜索失败: {result['error']}")

五、代码解析

  1. 类结构设计
    • AliexpressAPI类封装了所有 API 调用相关方法

    • 构造函数接收app_keyapp_secret进行初始化

  2. 签名生成
    • _generate_sign方法实现了完整的签名生成逻辑

    • 使用urllib.parse.quote处理特殊字符,确保签名准确性

  3. 搜索方法
    • search_products方法封装了完整的搜索逻辑

    • 支持多种可选参数,满足不同搜索需求

    • 包含异常处理,提高代码健壮性

  4. 使用示例
    • 演示了如何初始化客户端并进行商品搜索

    • 展示了如何解析和处理返回结果

六、注意事项

  1. 接口调用频率限制:速卖通开放平台对 API 调用有频率限制,默认每分钟不超过 60 次

  2. 权限申请:部分高级筛选条件需要额外申请权限

  3. 错误处理:实际开发中应根据返回的错误码进行针对性处理

  4. 安全性:app_secret 应妥善保管,避免泄露

七、扩展建议

  1. 可以封装更多 API 接口,如商品详情、店铺信息等

  2. 实现请求缓存机制,减少重复请求

  3. 添加代理 IP 支持,应对 IP 限制问题

  4. 实现请求重试机制,提高接口稳定性


通过本文介绍的方法,开发者可以快速实现速卖通关键字搜索商品列表接口的调用,为跨境电商相关应用开发提供数据支持。在实际使用中,需遵守速卖通开放平台的使用规范,合理获取和使用商品数据。


群贤毕至

访客