在电商数据分析、比价工具开发、商品监控等场景中,调用淘宝 API 获取商品详情是高频需求。本文将从实战角度,带你完成淘宝开放平台的准备工作,并分别用 Node.js 和 Python 实现商品详情的获取,全程代码可直接复用。
一、前期准备工作
在调用 API 前,必须完成开放账号和应用配置,这是所有操作的基础:
1. 注册并创建应用
- 访问完成开发者账号注册与实名认证;
- 进入 “开发者中心 - 应用管理”,创建一个新应用(选择 “自有应用” 即可);
- 记录应用的
Api Key和Api Secret(核心凭证,切勿泄露); - 申请 “商品详情查询” 相关接口的权限(淘宝部分接口需要审核,耐心等待即可)。
2. 核心概念说明
Api Key:应用唯一标识,相当于用户名;Api Secret:应用密钥,相当于密码,用于接口签名;sign:接口请求的签名,由参数 + App Secret 按规则加密生成,防止请求被篡改;num_iid:淘宝商品 ID,是获取商品详情的核心参数(可从商品链接中提取,如https://item.taobao.com/item.htm?id=123456789中的123456789)。
二、Node.js 实现:获取淘宝商品详情
1. 环境与依赖
确保已安装 Node.js(建议 v14+),安装核心依赖:
npm install axios crypto-js --save
axios:用于发送 HTTP 请求;crypto-js:用于生成接口签名。
2. 完整代码实现
const axios = require('axios');
const CryptoJS = require('crypto-js');
// 配置信息(替换为你的实际信息)
const config = {
appKey: '你的App Key',
appSecret: '你的App Secret',
apiUrl: 'https://eco.taobao.com/router/rest' // 淘宝API网关地址
};
/**
* 生成淘宝API签名
* @param {Object} params 接口请求参数
* @param {string} appSecret 应用密钥
* @returns {string} 签名结果
*/
function generateSign(params, appSecret) {
// 1. 按参数名ASCII升序排序
const sortedKeys = Object.keys(params).sort();
let signStr = appSecret;
// 2. 拼接参数名和值
sortedKeys.forEach(key => {
if (params[key] !== '') {
signStr += key + params[key];
}
});
signStr += appSecret;
// 3. MD5加密并转大写
return CryptoJS.MD5(signStr).toString().toUpperCase();
}
/**
* 获取淘宝商品详情
* @param {string} numIid 商品ID
* @returns {Promise<Object>} 商品详情数据
*/
async function getTaobaoItemDetail(numIid) {
try {
// 1. 构造请求参数
const params = {
method: 'taobao.item.get', // 商品详情接口名
app_key: config.appKey,
format: 'json', // 返回格式
v: '2.0', // API版本
timestamp: new Date().toISOString().replace(/T|Z/g, ' ').trim(), // 时间戳
num_iid: numIid, // 商品ID
fields: 'num_iid,title,price,item_img,detail_url,sell_count' // 需要返回的字段
};
// 2. 生成签名
params.sign = generateSign(params, config.appSecret);
// 3. 发送GET请求
const response = await axios.get(config.apiUrl, { params });
// 4. 处理返回结果
if (response.data.error_response) {
throw new Error(`接口调用失败:${response.data.error_response.msg}`);
}
return response.data.item_get_response.item;
} catch (error) {
console.error('获取商品详情失败:', error.message);
throw error;
}
}
// 测试调用
(async () => {
try {
const itemDetail = await getTaobaoItemDetail('123456789'); // 替换为实际商品ID
console.log('商品详情:', JSON.stringify(itemDetail, null, 2));
} catch (error) {
console.error('测试调用失败:', error);
}
})();
3. 代码关键说明
generateSign函数:严格按照淘宝 API 的签名规则实现,核心是参数升序排序 + 拼接 + MD5 加密,这是调用成功的关键;getTaobaoItemDetail函数:封装了参数构造、签名生成、请求发送和结果处理的完整流程;fields参数:可按需调整,淘宝 API 支持返回商品标题、价格、销量、图片、详情链接等数十个字段。
三、Python 实现:获取淘宝商品详情
1. 环境与依赖
确保已安装 Python(建议 3.7+),安装核心依赖:
pip install requests pycryptodome
requests:发送 HTTP 请求;pycryptodome:生成 MD5 签名(替代老旧的 crypto 库)。
2. 完整代码实现
import requests
import time
import hashlib
from urllib.parse import urlencode
# 配置信息(替换为你的实际信息)
CONFIG = {
"app_key": "你的App Key",
"app_secret": "你的App Secret",
"api_url": "https://eco.taobao.com/router/rest"
}
def generate_sign(params, app_secret):
"""
生成淘宝API签名
:param params: 接口请求参数(字典)
:param app_secret: 应用密钥
:return: 签名结果(大写)
"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数名和值
sign_str = app_secret
for key, value in sorted_params:
if value != "":
sign_str += f"{key}{value}"
sign_str += app_secret
# 3. MD5加密并转大写
md5 = hashlib.md5()
md5.update(sign_str.encode("utf-8"))
return md5.hexdigest().upper()
def get_taobao_item_detail(num_iid):
"""
获取淘宝商品详情
:param num_iid: 商品ID
:return: 商品详情字典
"""
try:
# 1. 构造请求参数
params = {
"method": "taobao.item.get",
"app_key": CONFIG["app_key"],
"format": "json",
"v": "2.0",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"num_iid": num_iid,
"fields": "num_iid,title,price,item_img,detail_url,sell_count"
}
# 2. 生成签名
params["sign"] = generate_sign(params, CONFIG["app_secret"])
# 3. 发送GET请求
response = requests.get(CONFIG["api_url"], params=params)
response.raise_for_status() # 抛出HTTP异常
result = response.json()
# 4. 处理返回结果
if "error_response" in result:
raise Exception(f"接口调用失败:{result['error_response']['msg']}")
return result["item_get_response"]["item"]
except Exception as e:
print(f"获取商品详情失败:{str(e)}")
raise
# 测试调用
if __name__ == "__main__":
try:
item_detail = get_taobao_item_detail("123456789") # 替换为实际商品ID
print("商品详情:")
for key, value in item_detail.items():
print(f"{key}: {value}")
except Exception as e:
print(f"测试调用失败:{e}")
3. 代码关键说明
generate_sign函数:逻辑与 Node.js 版本一致,适配 Python 的语法特性;time.strftime:生成符合淘宝要求的时间戳格式;requests.get:自动处理参数拼接,无需手动编码,比 Node.js 更简洁。
四、常见问题与注意事项
- 签名错误:最常见问题,检查参数排序、拼接规则、App Secret 是否正确,时间戳是否为当前时间;
- 权限不足:确认已申请
taobao.item.get接口的权限,未审核通过会提示 “权限不足”; - 频率限制:淘宝 API 有调用频率限制,避免短时间内大量请求;
- 参数规范:
num_iid必须为字符串类型,避免因数字过长导致精度丢失; - 环境问题:Python 需注意
pycryptodome的安装(Windows 可能需要额外配置),Node.js 需确保依赖安装完整。
五、扩展与优化
- 参数封装:将 App Key/Secret 放入环境变量,避免硬编码泄露;
- 异常重试:添加重试机制,处理网络波动导致的请求失败;
- 数据解析:对返回的商品数据进行二次处理(如价格单位转换、图片链接提取);
- 批量查询:封装批量获取商品详情的函数,适配多商品 ID 场景。
总结
- 调用淘宝 API 的核心是正确生成签名,需严格遵循 “参数升序排序→拼接→MD5 加密” 的规则;
- Node.js 和 Python 实现的核心逻辑一致,仅语法和依赖库不同,可根据技术栈选择;
- 实战前需完成开放平台的应用配置和权限申请,这是接口调用成功的前提。
通过本文的代码和步骤,你可以快速实现淘宝商品详情的获取,在此基础上可扩展出电商数据分析、商品监控等更多实用功能。