电子说
一、核心前提:1688 开放平台接入(必须完成)
这是所有接口调用的基础,没有完成这一步,后续代码无法正常运行。
步骤 1:注册并实名认证开发者账号
访问1688 开放平台官网,点击右上角「注册 / 登录」,使用支付宝或淘宝账号登录。
登录后进入「开发者中心」,完成实名认证(个人 / 企业均可):
个人认证:上传身份证正反面,完成人脸核验(1-2 个工作日审核通过)。
企业认证:上传营业执照、法人信息,审核周期稍长(1-3 个工作日)。
注意:未完成实名认证的账号,无法创建应用和调用任何接口。
步骤 2:创建应用,获取接口凭证
实名认证通过后,在开发者中心点击「应用管理」→「创建应用」。
填写应用信息:应用名称(自定义,如「1688 类目查询工具」)、应用描述、应用类型(选择「工具应用」或「第三方应用」,个人开发者选「工具应用」即可)。
提交应用后,等待平台审核(一般 1-2 个工作日),审核通过后,即可在应用详情页获取两个核心凭证:
app_key:应用的唯一标识(类似账号 ID)。
app_secret:应用的密钥(类似密码,严禁泄露给他人,不要硬编码到公开代码中)。
步骤 3:申请类目接口调用权限
进入应用详情页,点击「权限管理」→「申请权限」。
在权限列表中,搜索「alibaba.category.get」(商品类目查询接口),勾选该权限并提交申请。
该接口为免费公开权限,一般提交后即时通过(无需人工审核),通过后即可正常调用。
确认权限:在「已拥有权限」中,能看到「alibaba.category.get」,即表示权限申请成功。
二、技术落地:调用接口获取商品类目(Python 版)
前置准备:安装依赖库
本次实现仅需一个requests库(用于发送 HTTP 请求),打开终端执行以下命令安装:
bash
运行
pip install requests
完整可运行代码
该代码已封装好签名逻辑、请求逻辑和层级化解析逻辑,你只需替换app_key和app_secret即可运行。
python
运行
import requests
import hashlib
import time
# ---------------------- 配置区(替换为你自己的应用凭证) ----------------------
# 从1688开放平台应用详情页获取的app_key和app_secret
APP_KEY = "你的_app_key"
APP_SECRET = "你的_app_secret"
# ----------------------------------------------------------------------------
# 1688商品类目接口地址(固定不变)
CATEGORY_API_URL = "https://gw.open.1688.com/openapi/param2/2/portals.open/api/getCategory"
def generate_1688_sign(params, app_secret):
"""
生成1688 API要求的MD5签名(核心步骤,签名错误会导致请求失败)
签名规则:app_secret + 按字母序拼接的参数键值对 + app_secret → MD5加密 → 转大写
"""
# 1. 按参数名进行字母序排序(1688接口强制要求,否则签名无效)
sorted_param_items = sorted(params.items())
# 2. 拼接参数字符串(无分隔符,直接键值相连,如"app_key123timestamp1699999999999")
param_concat_str = ''.join([f"{key}{value}" for key, value in sorted_param_items])
# 3. 构造完整的签名原始字符串
sign_raw_str = app_secret + param_concat_str + app_secret
# 4. 生成MD5签名并转大写
md5_hash = hashlib.md5(sign_raw_str.encode("utf-8"))
return md5_hash.hexdigest().upper()
def get_1688_product_categories():
"""
调用1688接口,获取完整的商品类目树数据
"""
# 1. 构造接口必填参数(参数名和取值均为1688接口固定要求,不可修改)
request_params = {
"method": "alibaba.category.get", # 接口方法名,固定不变
"app_key": APP_KEY, # 你的应用ID
"timestamp": str(int(time.time() * 1000)), # 13位毫秒级时间戳(防止请求过期)
"format": "json", # 返回数据格式,固定为json
"v": "2.0", # 接口版本,固定为2.0
"sign_method": "md5" # 签名方式,固定为md5
}
# 2. 生成签名并添加到请求参数中
request_params["sign"] = generate_1688_sign(request_params, APP_SECRET)
# 3. 发送GET请求(类目接口支持GET,更简单易操作)
try:
# 发送请求,设置30秒超时(防止网络卡顿导致程序挂起)
response = requests.get(CATEGORY_API_URL, params=request_params, timeout=30)
# 检查HTTP请求状态码(200表示请求成功,非200抛出异常)
response.raise_for_status()
# 解析返回的JSON数据并返回
return response.json()
except requests.exceptions.RequestException as e:
print(f"❌ 请求类目接口失败:{str(e)}")
return None
def print_category_tree(categories, level=0):
"""
递归打印类目树(层级化展示,方便查找目标类目ID)
:param categories: 类目列表(接口返回的children数组)
:param level: 类目层级(用于缩进,提升可读性)
"""
for category in categories:
# 提取类目核心信息(使用get方法,防止字段缺失导致程序报错)
cat_id = category.get("categoryId", "未知ID")
cat_name = category.get("name", "未知名称")
cat_level = category.get("level", "未知层级")
is_leaf = category.get("isLeaf", False) # 是否为叶子类目(无下级子类目)
# 构造叶子类目标签
leaf_tag = "【叶子类目】" if is_leaf else "【可下钻】"
# 构造层级缩进(每级增加2个空格)
indent = " " * level
# 打印类目信息
print(f"{indent}[{cat_level}级] {cat_name}(ID:{cat_id}){leaf_tag}")
# 递归打印子类目(如果当前类目有子类目)
if "children" in category and category["children"]:
print_category_tree(category["children"], level + 1)
# ---------------------- 主程序入口 ----------------------
if __name__ == "__main__":
print("
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !