
|
类别 |
核心信息 |
说明 |
|
接口标识 |
名称:获取商品详情地址:https://api.1688.com/router/json |
固定请求地址,仅支持 HTTP POST |
|
请求方式 |
POST |
需设置Content-Type: application/x-www-form-urlencoded |
|
权限要求 |
开发者认证 + 应用审核 + OAuth2.0 令牌 |
个人 / 企业账号均可,企业账号权限更全 |
|
响应格式 |
JSON |
包含原始数据与错误信息(如error_response) |
|
参数类型 |
参数名 |
说明 |
是否必填 |
|
公共参数 |
app_key |
应用唯一标识(开放平台获取) |
是 |
|
公共参数 |
access_token |
OAuth2.0 授权令牌 |
是 |
|
公共参数 |
sign |
HMAC-SHA256 签名(按阿里算法生成) |
是 |
|
业务参数 |
product_id |
商品 ID(从 1688 商品页 URL 提取) |
是 |
|
可选参数 |
fields |
需返回字段(如product_id,price,company) |
否(默认返回全字段) |
|
字段类别 |
字段名 |
用途 |
|
价格信息 |
price.price_ranges |
价格梯度(如 “采购 10 件 ¥20,50 件 ¥18”) |
|
规格库存 |
sku |
SKU 列表(含各规格价格、库存) |
|
供应商信息 |
company |
信用等级、所在地、成立年限(筛供应商) |
|
销售数据 |
sales.monthly_sales |
月销量(判断商品热度) |
|
物流信息 |
logistics.shipping_from |
发货地(估算物流成本) |
import timeimport requestsimport hmacimport hashlibfrom datetime import datetimeclass AlibabaProductClient:def __init__(self, app_key, app_secret, access_token):self.app_key = app_keyself.app_secret = app_secretself.access_token = access_tokenself.api_url = "https://api.1688.com/router/json"# 生成阿里签名(避坑:参数ASCII升序,编码UTF-8)def _generate_sign(self, params):sorted_params = sorted(params.items(), key=lambda x: x[0])sign_str = "&".join([f"{k}{v}" for k, v in sorted_params]) + self.app_secretreturn hmac.new(sign_str.encode("utf-8"),digestmod=hashlib.sha256).hexdigest().upper()# 获取商品详情(支持字段筛选)def get_detail(self, product_id, fields=None):# 1. 构造参数params = {"app_key": self.app_key,"method": "alibaba.product.get","format": "json","sign_method": "hmac-sha256","timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"version": "1.0","access_token": self.access_token,"product_id": product_id}if fields:params["fields"] = ",".join(fields) if isinstance(fields, list) else fields# 2. 加签名params["sign"] = self._generate_sign(params)# 3. 发请求try:resp = requests.post(self.api_url, data=params, timeout=20,headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"})resp.raise_for_status()result = resp.json()# 处理错误if "error_response" in result:err = result["error_response"]raise Exception(f"Err{err['code']}: {err['msg']}")return result["alibaba_product_get_response"]["product"]except Exception as e:print(f"调用失败:{str(e)}")return Noneclass AlibabaDataParser:# 解析价格梯度(B2B核心需求)@staticmethoddef parse_price(price_data):if not price_data:return {"price_ranges": []}# 提取批量价格ranges = []for item in price_data.get("price_ranges", []):ranges.append({"quantity": int(item.get("quantity", 0)),"price": float(item.get("price", 0))})return {"price_ranges": sorted(ranges, key=lambda x: x["quantity"])}# 解析SKU(多规格场景必用)@staticmethoddef parse_sku(sku_data):if not sku_data:return {"has_sku": False, "sku_list": []}sku_list = []for sku in sku_data:sku_list.append({"sku_id": sku.get("sku_id", ""),"specs": [{"name": s.get("name", ""),"value": s.get("value", "")} for s in sku.get("specs", [])],"price": float(sku.get("price", 0)),"stock": int(sku.get("stock", 0))})return {"has_sku": True, "sku_list": sku_list}def single_product_demo():# 替换为自己的凭证APP_KEY = "你的app_key"APP_SECRET = "你的app_secret"ACCESS_TOKEN = "你的access_token"PRODUCT_ID = "624658978912" # 示例商品ID# 初始化客户端client = AlibabaProductClient(APP_KEY, APP_SECRET, ACCESS_TOKEN)# 只查需要的字段(减少数据量)fields = ["product_id", "title", "price", "sku", "company", "sales"]raw_data = client.get_detail(PRODUCT_ID, fields)if raw_data:# 解析关键数据price_info = AlibabaDataParser.parse_price(raw_data["price"])sku_info = AlibabaDataParser.parse_sku(raw_data["sku"])# 打印结果print(f"商品:{raw_data['title']}")print(f"价格梯度:{price_info['price_ranges']}")print(f"供应商:{raw_data['company']['company_name']}(信用:{raw_data['company']['credit_rating']})")if __name__ == "__main__":single_product_demo()from concurrent.futures import ThreadPoolExecutordef batch_product_demo(product_ids):APP_KEY = "你的app_key"APP_SECRET = "你的app_secret"ACCESS_TOKEN = "你的access_token"client = AlibabaProductClient(APP_KEY, APP_SECRET, ACCESS_TOKEN)# 并发≤2(避429超限)with ThreadPoolExecutor(max_workers=2) as executor:results = []for pid in product_ids:results.append(executor.submit(client.get_detail, pid))# 处理结果for fut in results:data = fut.result()if data:print(f"成功获取:{data['title']}(月销:{data['sales']['monthly_sales']})")# 调用batch_product_demo(["624658978912", "623547891256"])|
错误码 |
原因 |
解决办法 |
|
10000 |
缺product_id |
检查商品 ID 是否传值 |
|
10002 |
签名错误 |
确认参数 ASCII 升序、app_secret正确 |
|
110 |
令牌过期 |
用refresh_token刷新或重新授权 |
|
429 |
频率超限 |
增加请求间隔(≥1 秒),并发≤2 |
|
403 |
权限不足 |
开放平台申请 “商品详情接口” 权限 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047598/viewspace-3095943/ ,如需转载,请注明出处,否则将追究法律责任。