1688 商品详情接口深度解析:从百川签名突破到供应链数据重构

一、接口核心机制与 B 端风控体系拆解

1688 商品详情接口(核心接口alibaba.item.get,基于阿里百川开放平台架构)作为 B2B 电商供应链数据核心入口,采用「百川签名验证 + 商家等级权限校验 + IP 白名单绑定」的三重防护架构,区别于淘宝 C 端接口的动态加密逻辑,其 B 端特性显著:

1. 接口链路与核心参数

1688 商品详情数据通过「基础信息接口 + 规格库存接口 + 供应链接口 + 商家资质接口」的链式调用实现,核心参数及生成逻辑如下(含阿里百川专属参数):

|---------|------------------------------------------------------------------|----------|----------------------|
| 参数名称 | 生成逻辑 | 核心作用 | 风控特征 |
| itemId | 商品唯一标识(必填,1688 专属长 ID 格式) | 定位目标商品 | 需与offerId关联验证 |
| app_key | 阿里百川开放平台申请的应用 ID | 标识请求来源 | 未备案 APP_KEY 直接拒绝 |
| sign | 基于app_key+secret+timestamp+ 参数集的 MD5 加密(百川签名算法) | 验证请求合法性 | 签名时效 5 分钟,参数顺序影响有效性 |
| session | 商家 / 买家登录态标识(B 端必填) | 验证访问权限 | 游客态仅返回公开信息,无批发价 / 库存 |
| fields | 数据字段筛选器(如 "item_title,price,stock") | 控制返回字段粒度 | 未指定字段仅返回基础信息,减少数据传输 |
| domain | 站点标识(1688=1688.com,alibaba = 国际站) | 区分数据源 | 跨站点请求直接触发 IP 封禁 |

2. 关键突破点

  • 阿里百川签名逆向:1688 采用标准百川签名体系,但新增sign_method和version参数校验,传统 C 端签名逻辑完全失效,需严格遵循百川算法规范;
  • B 端权限分层:不同商家等级(普通会员 / 诚信通 / 实力商家)返回的字段差异达 40%,实力商家可获取工厂地址、产能等供应链核心数据;
  • 库存数据脱敏破解:1688 对非合作买家隐藏真实库存,仅显示 "≥100 件" 等模糊值,需通过规格接口联动计算真实库存;
  • 风控阈值差异化:B 端接口对 IP 白名单要求严格,非白名单 IP 单日请求超 50 次触发封禁,白名单 IP 可提升至 1000 次 / 日。

二、创新技术方案实现

1. 百川签名生成器(核心突破)

严格遵循阿里百川签名算法,实现动态签名生成与权限适配,突破 B 端签名校验限制:

复制代码

import hashlib

import time

import json

import urllib.parse

from typing import Dict, Optional

class BaichuanSignGenerator:

def __init__(self, app_key: str, app_secret: str):

self.app_key = app_key # 百川开放平台申请

self.app_secret = app_secret # 应用密钥(需妥善保管)

self.sign_method = "md5" # 1688仅支持MD5签名

self.version = "2.0" # 百川API版本

def generate_sign(self, params: Dict) -> str:

"""

生成阿里百川标准签名

:param params: 接口请求参数(不含sign)

:return: 加密后的sign值

"""

# 1. 新增百川固定参数

params["app_key"] = self.app_key

params["sign_method"] = self.sign_method

params["version"] = self.version

params["timestamp"] = str(int(time.time())) # 秒级时间戳(区别于C端毫秒级)

# 2. 按key字典序排序(必须严格排序,否则签名失效)

sorted_params = sorted(params.items(), key=lambda x: x[0])

# 3. 拼接参数字符串(key=value&key=value格式)

param_str = urllib.parse.urlencode(sorted_params)

# 4. 核心加密串:app_secret + 参数字符串 + app_secret(百川专属格式)

raw_str = f"{self.app_secret}{param_str}{self.app_secret}"

# 5. MD5加密并转大写

sign = hashlib.md5(raw_str.encode()).hexdigest().upper()

return sign, params["timestamp"]

def verify_sign(self, params: Dict, sign: str) -> bool:

"""验证签名有效性(用于调试)"""

generated_sign, _ = self.generate_sign(params.copy())

return generated_sign == sign

2. 多权限商品详情采集器

适配 B 端不同权限等级,实现基础信息 + 规格库存 + 供应链数据的全链路采集:

复制代码

import requests

from fake_useragent import UserAgent

import re

class AlibabaItemDetailScraper:

def __init__(self, app_key: str, app_secret: str, session: Optional[str] = None, proxy: Optional[str] = None):

self.app_key = app_key

self.app_secret = app_secret

self.session = session # 登录态session(诚信通账号最佳)

self.proxy = proxy

self.sign_generator = BaichuanSignGenerator(app_key, app_secret)

self.session = self._init_session()

# 1688接口域名配置(区分正式/测试环境)

self.api_domain = "https://gw.api.1688.com/openapi"

def _init_session(self) -> requests.Session:

"""初始化请求会话(模拟B端浏览器环境)"""

session = requests.Session()

# B端专属请求头(模拟1688商家后台访问)

session.headers.update({

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 AlibabaApp/1.0",

"Accept": "application/json, text/plain, */*",

"Referer": "https://work.1688.com/",

"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",

"x-ali-platform": "pc",

"x-ali-source": "workbench"

})

# 代理配置(建议使用高匿代理,避免IP暴露)

if self.proxy:

session.proxies = {"http": self.proxy, "https": self.proxy}

return session

def _fetch_base_info(self, item_id: str) -> Dict:

"""获取商品基础信息(必填接口)"""

params = {

"method": "alibaba.item.get",

"itemId": item_id,

"fields": "item_title,item_type,price,original_price,brand_name,seller_login_id,shop_name,shop_id"

}

# 生成签名

sign, timestamp = self.sign_generator.generate_sign(params)

params["sign"] = sign

params["timestamp"] = timestamp

# 若有登录态,添加session参数

if self.session:

params["session"] = self.session

response = self.session.get(

f"{self.api_domain}/gateway.htm",

params=params,

timeout=15,

allow_redirects=False

)

return response.json()

def _fetch_spec_stock(self, item_id: str) -> Dict:

"""获取商品规格与真实库存(突破库存脱敏)"""

params = {

"method": "alibaba.item.spec.get",

"itemId": item_id,

"fields": "spec_group,spec_id,stock,sku_code"

}

sign, timestamp = self.sign_generator.generate_sign(params)

params["sign"] = sign

params["timestamp"] = timestamp

if self.session:

params["session"] = self.session

response = self.session.get(

f"{self.api_domain}/gateway.htm",

params=params,

timeout=15

)

return self._parse_real_stock(response.json())

def _parse_real_stock(self, spec_data: Dict) -> Dict:

"""解析真实库存(破解"≥100件"脱敏显示)"""

result = {"spec_list": [], "total_stock": 0}

spec_groups = spec_data.get("result", {}).get("spec_group", [])

for group in spec_groups:

spec_items = group.get("spec_item", [])

for item in spec_items:

# 真实库存可能藏在sku_ext字段中,需解析JSON字符串

sku_ext = item.get("sku_ext", "{}")

try:

sku_ext_json = json.loads(sku_ext)

real_stock = sku_ext_json.get("stock", item.get("stock", 0))

except:

real_stock = item.get("stock", 0)

spec_info = {

"spec_id": item.get("spec_id", ""),

"spec_name": item.get("spec_name", ""),

"sku_code": item.get("sku_code", ""),

"real_stock": real_stock,

"price": item.get("price", "")

}

result["spec_list"].append(spec_info)

result["total_stock"] += real_stock

return result

def _fetch_supply_chain(self, seller_id: str) -> Dict:

"""获取供应链核心数据(仅诚信通账号可访问)"""

if not self.session:

return {"error": "需登录诚信通账号获取供应链数据"}

params = {

"method": "alibaba.seller.supplychain.get",

"sellerId": seller_id,

"fields": "factory_address,production_capacity,moq,lead_time,payment_terms"

}

sign, timestamp = self.sign_generator.generate_sign(params)

params["sign"] = sign

params["timestamp"] = timestamp

params["session"] = self.session

response = self.session.get(

f"{self.api_domain}/gateway.htm",

params=params,

timeout=15

)

return response.json()

def fetch_full_detail(self, item_id: str) -> Dict:

"""采集完整商品详情(基础信息+规格库存+供应链数据)"""

# 1. 采集基础信息

base_info = self._fetch_base_info(item_id)

if "error_response" in base_info:

return {"error": base_info["error_response"]["msg"], "item_id": item_id}

# 2. 采集规格库存

spec_stock = self._fetch_spec_stock(item_id)

# 3. 采集供应链数据(若有登录态)

supply_chain = {}

seller_id = base_info.get("result", {}).get("shop_id", "")

if self.session and seller_id:

supply_chain = self._fetch_supply_chain(seller_id)

# 4. 整合数据

return self._structurize_data(base_info, spec_stock, supply_chain)

def _structurize_data(self, base_info: Dict, spec_stock: Dict, supply_chain: Dict) -> Dict:

"""结构化输出完整数据"""

base_result = base_info.get("result", {})

return {

"item_id": base_result.get("itemId", ""),

"basic_info": {

"title": base_result.get("item_title", ""),

"item_type": base_result.get("item_type", ""), # 现货/定制

"price": base_result.get("price", ""),

"original_price": base_result.get("original_price", ""),

"brand": base_result.get("brand_name", ""),

"seller": {

"login_id": base_result.get("seller_login_id", ""),

"shop_name": base_result.get("shop_name", ""),

"shop_id": base_result.get("shop_id", "")

}

},

"spec_stock_info": spec_stock,

"supply_chain_info": supply_chain.get("result", supply_chain),

"crawl_time": time.strftime("%Y-%m-%d %H:%M:%S")

}

3. 供应链数据重构器(创新点)

整合 1688 B 端核心数据,实现供应商评级、采购风险评估、性价比分析等商业价值挖掘:

复制代码

from collections import defaultdict

import json

class AlibabaSupplyChainReconstructor:

def __init__(self, item_detail: Dict):

self.item_detail = item_detail

self.reconstructed_report = {}

def evaluate_seller_level(self) -> str:

"""供应商等级评估(基于店铺类型+供应链数据)"""

shop_name = self.item_detail["basic_info"]["seller"]["shop_name"]

supply_chain = self.item_detail["supply_chain_info"]

# 关键词匹配实力商家/诚信通标识

if any(keyword in shop_name for keyword in ["实力商家", "工厂直供", "源头工厂"]):

return "A级(优质供应商)"

elif supply_chain.get("factory_address") and supply_chain.get("production_capacity"):

return "B级(正规工厂)"

else:

return "C级(普通商家)"

def calculate_cost_effectiveness(self) -> float:

"""性价比评分(0-10分,结合价格、库存、品牌)"""

basic_info = self.item_detail["basic_info"]

spec_stock = self.item_detail["spec_stock_info"]

# 价格得分(3分):低于同类均价得满分

price = float(basic_info.get("price", 0))

price_score = 3 if price 00 else 2 if price else 1

# 库存得分(3分):库存充足度

total_stock = spec_stock.get("total_stock", 0)

stock_score = 3 if total_stock >= 1000 else 2 if total_stock >= 100 else 1

# 品牌得分(4分):有品牌得满分

brand_score = 4 if basic_info.get("brand") else 2

return price_score + stock_score + brand_score

def assess_purchase_risk(self) -> Dict:

"""采购风险评估(MOQ、交货期、付款方式)"""

supply_chain = self.item_detail["supply_chain_info"]

moq = supply_chain.get("moq", "未知")

lead_time = supply_chain.get("lead_time", "未知")

payment_terms = supply_chain.get("payment_terms", "未知")

risk_level = "低风险"

risk_reasons = []

# 风险判断逻辑

if moq != "未知" and int(moq) > 500:

risk_level = "中风险"

risk_reasons.append(f"最小起订量过高({moq}件)")

if lead_time != "未知" and "30天" in lead_time:

risk_reasons.append(f"交货期较长({lead_time})")

if payment_terms != "未知" and "全款" in payment_terms:

risk_reasons.append(f"付款方式风险高({payment_terms})")

if len(risk_reasons) >= 2:

risk_level = "高风险"

return {

"risk_level": risk_level,

"risk_reasons": risk_reasons,

"moq": moq,

"lead_time": lead_time,

"payment_terms": payment_terms

}

def generate_report(self) -> Dict:

"""生成供应链数据重构报告"""

self.reconstructed_report = {

"item_summary": {

"item_id": self.item_detail["item_id"],

"title": self.item_detail["basic_info"]["title"],

"seller_level": self.evaluate_seller_level(),

"cost_effectiveness_score": self.calculate_cost_effectiveness(),

"total_stock": self.item_detail["spec_stock_info"]["total_stock"]

},

"purchase_risk_assessment": self.assess_purchase_risk(),

"spec_recommendation": self._get_best_spec(),

"report_time": time.strftime("%Y-%m-%d %H:%M:%S")

}

return self.reconstructed_report

def _get_best_spec(self) -> Dict:

"""推荐最优采购规格(性价比最高)"""

spec_list = self.item_detail["spec_stock_info"]["spec_list"]

if not spec_list:

return {"recommendation": "无可用规格"}

# 计算每个规格的性价比(价格越低、库存越高越优)

spec_scores = []

for spec in spec_list:

try:

相关推荐
奋进的芋圆9 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin9 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20059 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉10 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国10 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_9418824810 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈10 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_9911 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹11 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理
专注_每天进步一点点11 小时前
【java开发】写接口文档的札记
java·开发语言