×

api开发 电商平台 数据挖掘

手把手教你调用淘宝 API:获取商品详情的 Node.js/Python 实战

admin admin 发表于2026-01-07 16:29:25 浏览10 评论0

抢沙发发表评论

在电商数据分析、比价工具开发、商品监控等场景中,调用淘宝 API 获取商品详情是高频需求。本文将从实战角度,带你完成淘宝开放平台的准备工作,并分别用 Node.js 和 Python 实现商品详情的获取,全程代码可直接复用。

一、前期准备工作

在调用 API 前,必须完成开放账号和应用配置,这是所有操作的基础:

1. 注册并创建应用

  1. 访问完成开发者账号注册与实名认证;

  2. 进入 “开发者中心 - 应用管理”,创建一个新应用(选择 “自有应用” 即可);

  3. 记录应用的Api KeyApi Secret(核心凭证,切勿泄露);

  4. 申请 “商品详情查询” 相关接口的权限(淘宝部分接口需要审核,耐心等待即可)。

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 更简洁。

四、常见问题与注意事项

  1. 签名错误:最常见问题,检查参数排序、拼接规则、App Secret 是否正确,时间戳是否为当前时间;

  2. 权限不足:确认已申请taobao.item.get接口的权限,未审核通过会提示 “权限不足”;

  3. 频率限制:淘宝 API 有调用频率限制,避免短时间内大量请求;

  4. 参数规范num_iid必须为字符串类型,避免因数字过长导致精度丢失;

  5. 环境问题:Python 需注意pycryptodome的安装(Windows 可能需要额外配置),Node.js 需确保依赖安装完整。

五、扩展与优化

  1. 参数封装:将 App Key/Secret 放入环境变量,避免硬编码泄露;

  2. 异常重试:添加重试机制,处理网络波动导致的请求失败;

  3. 数据解析:对返回的商品数据进行二次处理(如价格单位转换、图片链接提取);

  4. 批量查询:封装批量获取商品详情的函数,适配多商品 ID 场景。

总结

  1. 调用淘宝 API 的核心是正确生成签名,需严格遵循 “参数升序排序→拼接→MD5 加密” 的规则;

  2. Node.js 和 Python 实现的核心逻辑一致,仅语法和依赖库不同,可根据技术栈选择;

  3. 实战前需完成开放平台的应用配置和权限申请,这是接口调用成功的前提。

通过本文的代码和步骤,你可以快速实现淘宝商品详情的获取,在此基础上可扩展出电商数据分析、商品监控等更多实用功能。


少长咸集

群贤毕至

访客