速卖通商品 API 接口接入实战(Python 版)

速卖通开放平台(Aliexpress Open Platform,AOP)是官方提供的 API 对接渠道,商品相关接口是最核心的应用场景(如商品详情、价格、库存、销量查询等)。本文将从前期准备、环境配置、核心代码实现、常见接口示例等维度,完整讲解 Python 接入速卖通商品 API 的全过程。

一、前期核心准备

1. 开发者账号与应用创建

速卖通 API 接入需先完成开发者认证和应用配置,步骤如下:

步骤操作指引
1. 注册账号访问速卖通开放平台,使用企业 / 个人账号注册(企业账号权限更全)
2. 开发者认证完成实名认证(个人需身份证,企业需营业执照),审核通过后才能创建应用
3. 创建应用进入「应用管理」→「创建应用」,选择应用类型(如「自用型应用」),填写应用信息(回调地址必填,可填测试地址如http://localhost:8080
4. 获取凭证应用创建成功后,获取App KeyApp Secret(核心凭证,需妥善保管)
5. 授权获取 Token商品接口需用户授权(卖家 / 买家维度),通过 OAuth2.0 流程获取access_token(自用型应用可通过「一键授权」快速获取)

2. 关键凭证说明

凭证名称作用获取位置
App Key应用唯一标识应用详情页「基本信息」
App Secret签名密钥应用详情页「基本信息」(需点击显示)
access_token接口调用授权令牌OAuth2.0 授权回调 / 一键授权页面
API 网关地址接口请求域名开放平台文档(通用:https://api-sg.aliexpress.com

3. 接口文档参考

核心商品接口文档:

  • 商品详情接口
  • 商品搜索接口
  • 商品库存查询

二、环境准备

速卖通 API 支持 HTTP/HTTPS 请求,推荐使用封装库简化开发,核心依赖安装:

bash

运行

# 第三方封装库(简化签名和请求)
pip install aliexpress-openapi
# 基础请求库(原生实现用)
pip install requests
pip install pycryptodome  # 部分接口需加解密

三、核心实现:速卖通商品 API 接入

方式 1:使用第三方封装库(推荐,简化签名)

aliexpress-openapi是适配速卖通 AOP 的 Python 封装库,自动处理签名、Token 验证、参数编码等,大幅降低开发成本。

1. 基础配置与初始化

python

运行

from aliexpress_openapi import AliExpressApi

# -------------------------- 替换为自己的凭证 --------------------------
APP_KEY = "你的App Key"
APP_SECRET = "你的App Secret"
ACCESS_TOKEN = "你的access_token"
# ---------------------------------------------------------------------

# 初始化API客户端(不同地区网关不同,默认新加坡网关)
api = AliExpressApi(
    app_key=APP_KEY,
    app_secret=APP_SECRET,
    access_token=ACCESS_TOKEN,
    gateway="https://api-sg.aliexpress.com"  # 新加坡:sg,美国:us,欧洲:eu
)
2. 示例 1:查询商品详情(按商品 ID)

python

运行

def get_product_detail(product_id: str) -> dict:
    """
    查询速卖通商品详情
    :param product_id: 速卖通商品ID(数字串,如1234567890)
    :return: 商品详情字典
    """
    try:
        # 调用商品详情接口(接口名参考开放平台文档)
        response = api.execute(
            method="aliexpress.solution.product.detail.get",  # 接口方法名
            params={
                "product_id": product_id,
                "language": "en",  # 返回语言:en/zh-CN/ru等
                "currency": "USD"  # 价格币种:USD/CNY/EUR等
            }
        )
        return response
    except Exception as e:
        print(f"查询商品详情失败:{e}")
        return {}

# 测试调用
if __name__ == "__main__":
    test_product_id = "1005005808863025"  # 测试商品ID(可替换)
    detail = get_product_detail(test_product_id)
    if detail and detail.get("code") == 200:
        # 解析核心字段
        product_info = detail.get("data", {})
        print("商品标题:", product_info.get("product_title"))
        print("商品价格:", product_info.get("sale_price"))
        print("商品主图:", product_info.get("main_image_url"))
        print("库存数量:", product_info.get("stock_quantity"))
        print("商品描述:", product_info.get("product_description"))
    else:
        print("获取商品详情失败,响应:", detail)
3. 示例 2:商品搜索(按关键词)

python

运行

def search_products(keyword: str, page_no: int = 1, page_size: int = 20) -> dict:
    """
    按关键词搜索速卖通商品
    :param keyword: 搜索关键词(如"phone case")
    :param page_no: 页码
    :param page_size: 每页条数(最大50)
    :return: 搜索结果
    """
    try:
        response = api.execute(
            method="aliexpress.solution.product.search",
            params={
                "keywords": keyword,
                "page_no": page_no,
                "page_size": page_size,
                "sort": "SALE_DESC"  # 排序:SALE_DESC(销量降序)、PRICE_ASC(价格升序)等
            }
        )
        return response
    except Exception as e:
        print(f"商品搜索失败:{e}")
        return {}

# 测试搜索
if __name__ == "__main__":
    search_result = search_products("wireless earphones", page_no=1)
    if search_result and search_result.get("code") == 200:
        products = search_result.get("data", {}).get("products", [])
        print(f"共搜索到 {len(products)} 个商品:")
        for idx, product in enumerate(products):
            print(f"{idx+1}. 标题:{product.get('product_title')} | 价格:{product.get('sale_price')} | ID:{product.get('product_id')}")

方式 2:原生 HTTP 请求实现(无第三方库)

若不想依赖第三方库,可手动实现签名和请求(速卖通 API 采用 MD5 签名机制),核心步骤:构造参数→生成签名→发送请求。

1. 签名生成函数

python

运行

import time
import hashlib
import requests
from urllib.parse import urlencode, quote_plus

def generate_sign(params: dict, app_secret: str) -> str:
    """
    生成速卖通API签名(MD5)
    :param params: 请求参数(不含sign)
    :param app_secret: 应用Secret
    :return: 签名字符串
    """
    # 1. 参数按ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 2. 拼接为key=value格式,无分隔符
    sign_str = app_secret
    for k, v in sorted_params:
        if v is not None and v != "":
            sign_str += f"{k}{v}"
    sign_str += app_secret
    # 3. MD5加密并转大写
    sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
    return sign

def ali_api_request(method: str, params: dict, app_key: str, app_secret: str, access_token: str, gateway: str) -> dict:
    """
    原生发送速卖通API请求
    :param method: 接口方法名(如aliexpress.solution.product.detail.get)
    :param params: 业务参数
    :param app_key: App Key
    :param app_secret: App Secret
    :param access_token: access_token
    :param gateway: API网关地址
    :return: 接口响应
    """
    # 1. 构造公共参数
    common_params = {
        "app_key": app_key,
        "method": method,
        "format": "json",
        "v": "2.0",
        "timestamp": str(int(time.time() * 1000)),  # 毫秒级时间戳
        "sign_method": "md5",
        "access_token": access_token
    }
    # 2. 合并公共参数和业务参数
    all_params = {**common_params, **params}
    # 3. 生成签名
    all_params["sign"] = generate_sign(all_params, app_secret)
    # 4. 发送GET请求(速卖通API优先GET)
    try:
        response = requests.get(
            url=gateway,
            params=all_params,
            timeout=15
        )
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"请求失败:{e}")
        print(f"响应内容:{response.text if 'response' in locals() else '无'}")
        return {}

# 测试原生调用(商品详情)
if __name__ == "__main__":
    # 配置项
    APP_KEY = "你的App Key"
    APP_SECRET = "你的App Secret"
    ACCESS_TOKEN = "你的access_token"
    GATEWAY = "https://api-sg.aliexpress.com"
    
    # 调用商品详情接口
    result = ali_api_request(
        method="aliexpress.solution.product.detail.get",
        params={
            "product_id": "1005005808863025",
            "language": "en",
            "currency": "USD"
        },
        app_key=APP_KEY,
        app_secret=APP_SECRET,
        access_token=ACCESS_TOKEN,
        gateway=GATEWAY
    )
    print("原生请求响应:", result)

四、核心接口参数说明

接口方法名功能核心参数备注
aliexpress.solution.product.detail.get商品详情product_id、language、currency返回标题、价格、库存、图片、描述等
aliexpress.solution.product.search商品搜索keywords、page_no、page_size、sortsort 支持 SALE_DESC/PRICE_ASC/PRICE_DESC
aliexpress.solution.product.inventory.get库存查询product_id、sku_id(可选)支持单个 / 批量商品库存
aliexpress.solution.product.price.get价格查询product_id、sku_id(可选)返回原价、折扣价、币种等

五、常见问题与注意事项

1. 签名错误(高频问题)

  • 参数排序:必须按 ASCII 升序排序,否则签名无效;
  • 编码问题:参数值含特殊字符(如中文、空格)需 UTF-8 编码,quote_plus处理;
  • 时间戳:必须为毫秒级,且与服务器时间误差≤5 分钟;
  • 大小写:签名结果需转大写,参数名必须与文档一致(速卖通 API 参数名区分大小写)。

2. 权限与 Token 问题

  • access_token过期:默认有效期 30 天,需重新授权;
  • 接口权限:部分接口仅对企业账号 / 特定应用类型开放,需在开放平台「接口管理」中申请权限;
  • 测试环境:新应用需先在沙箱环境测试,再切换到生产环境。

3. 调用限制

  • 频率限制:单应用默认 QPS(每秒调用次数)≤5,超限会返回429 Too Many Requests
  • 配额限制:部分接口有每日调用次数限制,可在开放平台「应用监控」查看配额;
  • 建议:添加请求间隔(time.sleep(0.2)),批量请求时做限流处理。

4. 数据解析注意事项

  • 多语言 / 币种:接口返回结果会根据language/currency参数适配,需按需设置;
  • SKU 维度:商品多 SKU 时,价格 / 库存需按 SKU_ID 解析;
  • 字段缺失:部分商品字段(如促销价)可能为空,需做空值判断。

5. 合规性要求

  • 数据用途:速卖通 API 数据仅允许用于应用内展示 / 分析,禁止批量爬取、转售;
  • 调用标识:需在应用中注明「数据来源:速卖通开放平台」;
  • 反爬机制:禁止模拟请求、伪造 IP,违规会封禁应用 / 账号。

六、进阶优化

  1. 请求重试:使用tenacity库实现失败重试(针对网络波动、临时限流):

    python

    运行

    from tenacity import retry, stop_after_attempt, wait_fixed
    
    @retry(stop=stop_after_attempt(3), wait=wait_fixed(2))
    def get_product_detail_with_retry(product_id: str):
        return get_product_detail(product_id)
    
  2. 异步请求:使用aiohttp替代requests,提升批量采集效率;
  3. 日志与监控:记录请求参数、响应状态、耗时,便于排查问题;
  4. Token 自动刷新:对接 OAuth2.0 刷新 Token 接口,实现 Token 过期自动续期。

七、无 API 权限的替代方案

若无法申请速卖通开放平台权限,可考虑:

  1. 速卖通联盟 API:面向联盟推广者的 API,可获取商品基础信息(需注册联盟账号);
  2. 合规第三方服务商:如店小秘、芒果店长等,提供封装好的速卖通数据接口;
  3. 网页爬虫(谨慎):仅用于个人学习,需遵守robots.txt和速卖通用户协议,且易被反爬检测。

总结

速卖通 API 接入的核心是凭证管理 + 签名生成 + 参数合规,优先使用第三方封装库可大幅降低开发成本;生产环境需重点关注签名正确性、调用限流、Token 续期等问题。建议先在开放平台沙箱环境完成接口测试,再上线生产环境。

### API 接口列表及名称 为了方便开发者调用,通提供了多种API接口来满足不同的开发需求。以下是部分常用的API接口及其功能介绍: #### 商接口 - `item_search`:用于搜索商信息[^4]。 此接口允许用户根据关键词、类别等多种条件查询符合条件的商列表。 - `item_get`:获取单个商详情[^3]。 开发者可以通过此接口传入特定的商ID,从而精确地检索到该商的具体资料,包括但不限于图片链接、价格、库存状态等重要属性。 #### 店铺类接口 - `item_search_shop`:店铺内商搜索。 针对指定商家的店内产进行筛选和浏览,有助于提高用户体验以及促进交易达成率。 #### 类目管理接口 - `cat_get`:获得AliExpress分类详情。 提供了关于平台上的各类目的结构化元数据访问权限,使得第三方应用能够更好地理解并利用这些资源构建更丰富的购物体验。 除了上述列举的主要几项服务外,还有更多其他类型的API可供选用,具体可以参阅官方文档了解完整的接口清单和服务细节[^1]。 ```python # 示例代码展示如何发起一次简单的 item_get 请求 import requests def get_item_details(item_id, api_key, secret_key): url = f"https://gw.api.alibaba.com/openapi/param2/1/api_proxy/item_get/{item_id}?key={api_key}&secret={secret_key}" response = requests.get(url) data = response.json() return data['result'] print(get_item_details('123456789', 'your_api_key_here', 'your_secret_key_here')) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值