
|
参数类别 |
关键参数 |
说明 |
示例值 |
|
接口标识 |
method |
固定为商品详情接口名 |
suning.custom.product.get |
|
认证参数 |
appKey |
应用唯一标识(开放平台获取) |
12345678 |
|
认证参数 |
sign |
接口签名(按苏宁规则生成) |
A8F2D7C9E1B3567890ABCDEF1234 |
|
业务参数 |
productCode |
商品编码(苏宁商品唯一 ID) |
000000000123456789 |
|
业务参数 |
field |
需返回的字段(按需选择) |
productName,price,stock,spec |
|
格式参数 |
format |
返回数据格式(默认 json) |
json |
|
版本参数 |
version |
接口版本(固定为 v1.2) |
v1.2 |
import hashlibimport timeimport requestsimport osdef generate_suning_sign(params, app_secret):"""生成苏宁接口签名(SHA256算法)"""# 1. 按参数名ASCII升序排序(核心!顺序错则签名失败)sorted_params = sorted(params.items(), key=lambda x: x[0])# 2. 拼接为“key=value&key=value”格式sign_str = "&".join([f"{k}={v}" for k, v in sorted_params])# 3. 末尾拼接appSecret,SHA256加密后转大写sign_str += app_secretreturn hashlib.sha256(sign_str.encode("utf-8")).hexdigest().upper()def get_suning_product_detail(product_code):"""获取苏宁商品详情(多维度数据)"""# 从环境变量取敏感信息(安全最佳实践)app_key = os.getenv("SUNING_APP_KEY")app_secret = os.getenv("SUNING_APP_SECRET")# 1. 构造请求参数params = {"method": "suning.custom.product.get","appKey": app_key,"timestamp": time.strftime("%Y%m%d%H%M%S"),"format": "json","version": "v1.2","productCode": product_code,# 多维度字段:基础信息+价格+库存+规格"field": "productName,brandName,price,marketPrice,stock,specInfo,shopName"}# 2. 生成签名params["sign"] = generate_suning_sign(params, app_secret)# 3. 发起请求(苏宁接口需用HTTPS POST)try:response = requests.post(url="https://open.suning.com/api/http/sopRequest",data=params,timeout=8,verify=True)response.raise_for_status() # 捕获HTTP错误(如403、500)result = response.json()except requests.exceptions.RequestException as e:raise Exception(f"接口请求失败:{str(e)}")# 4. 处理错误响应if result.get("code") != "1":raise Exception(f"API错误:{result.get('msg', '未知错误')}")# 5. 返回多维度数据return result.get("body", {}).get("product", {})# 调用示例if __name__ == "__main__":try:product_data = get_suning_product_detail(product_code="000000000123456789")# 打印核心维度数据print(f"商品名称:{product_data.get('productName', '')}")print(f"品牌:{product_data.get('brandName', '')}")print(f"售价/市场价:{product_data.get('price', '')}元/{product_data.get('marketPrice', '')}元")print(f"库存:{product_data.get('stock', 0)}件")print(f"规格信息:{product_data.get('specInfo', '')}")except Exception as e:print(f"调用失败:{str(e)}")import jsondef structure_suning_data(raw_data):"""将苏宁原始数据结构化处理"""if not raw_data:return {}# 规格信息解析(JSON字符串转字典)spec_info = raw_data.get("specInfo", "{}")try:spec_dict = json.loads(spec_info)except json.JSONDecodeError:spec_dict = {"备注": "规格信息解析失败"}# 库存处理(-1表示充足,转为999+)stock = raw_data.get("stock", 0)stock_display = "999+" if stock == -1 else str(stock)# 结构化输出return {"商品编码": raw_data.get("productCode", ""),"商品名称": raw_data.get("productName", "").replace("【", "").replace("】", ""),"品牌": raw_data.get("brandName", ""),"售价": float(raw_data.get("price", 0)) if raw_data.get("price") else 0.0,"市场价": float(raw_data.get("marketPrice", 0)) if raw_data.get("marketPrice") else 0.0,"库存": stock_display,"规格": spec_dict,"店铺名称": raw_data.get("shopName", ""),"更新时间": time.strftime("%Y-%m-%d %H:%M:%S")}# 使用示例structured_data = structure_suning_data(product_data)print("结构化后数据:", json.dumps(structured_data, ensure_ascii=False, indent=2))
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047598/viewspace-3095991/ ,如需转载,请注明出处,否则将追究法律责任。