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:

相关推荐
缘来是庄3 小时前
找不到符号
java·intellij-idea
jiayong233 小时前
IntelliJ IDEA 使用指南
java·ide·intellij-idea
AM越.3 小时前
Java设计模式超详解--状态设计模式
java·开发语言·设计模式
古城小栈3 小时前
教育科技:AI+Java 智能题库系统开发实践
java·人工智能·科技
BD_Marathon3 小时前
【JavaWeb】乱码问题_HTML_Tomcat日志_sout乱码问题
java·tomcat·html
冰冰菜的扣jio3 小时前
JVM中的垃圾回收详解
java·jvm
小肖爱笑不爱笑3 小时前
2025/12/16 HTML CSS
java·开发语言·css·html·web
未若君雅裁3 小时前
JVM核心原理总结
java·jvm
q_19132846953 小时前
基于SpringBoot2+Vue2的装修报价网站
java·vue.js·spring boot·mysql·计算机毕业设计·演示文稿