速卖通开放平台(Aliexpress Open Platform,AOP)是官方提供的 API 对接渠道,商品相关接口是最核心的应用场景(如商品详情、价格、库存、销量查询等)。本文将从前期准备、环境配置、核心代码实现、常见接口示例等维度,完整讲解 Python 接入速卖通商品 API 的全过程。
一、前期核心准备
1. 开发者账号与应用创建
速卖通 API 接入需先完成开发者认证和应用配置,步骤如下:
| 步骤 | 操作指引 |
|---|---|
| 1. 注册账号 | 访问速卖通开放平台,使用企业 / 个人账号注册(企业账号权限更全) |
| 2. 开发者认证 | 完成实名认证(个人需身份证,企业需营业执照),审核通过后才能创建应用 |
| 3. 创建应用 | 进入「应用管理」→「创建应用」,选择应用类型(如「自用型应用」),填写应用信息(回调地址必填,可填测试地址如http://localhost:8080) |
| 4. 获取凭证 | 应用创建成功后,获取App Key和App 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、sort | sort 支持 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,违规会封禁应用 / 账号。
六、进阶优化
- 请求重试:使用
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) - 异步请求:使用
aiohttp替代requests,提升批量采集效率; - 日志与监控:记录请求参数、响应状态、耗时,便于排查问题;
- Token 自动刷新:对接 OAuth2.0 刷新 Token 接口,实现 Token 过期自动续期。
七、无 API 权限的替代方案
若无法申请速卖通开放平台权限,可考虑:
- 速卖通联盟 API:面向联盟推广者的 API,可获取商品基础信息(需注册联盟账号);
- 合规第三方服务商:如店小秘、芒果店长等,提供封装好的速卖通数据接口;
- 网页爬虫(谨慎):仅用于个人学习,需遵守
robots.txt和速卖通用户协议,且易被反爬检测。
总结
速卖通 API 接入的核心是凭证管理 + 签名生成 + 参数合规,优先使用第三方封装库可大幅降低开发成本;生产环境需重点关注签名正确性、调用限流、Token 续期等问题。建议先在开放平台沙箱环境完成接口测试,再上线生产环境。


8404

被折叠的 条评论
为什么被折叠?



