普通视图

发现新文章,点击刷新页面。
昨天 — 2025年4月18日首页

请给出淘宝商品详情API接口的使用示例

2025年4月18日 15:17

以下是一个使用淘宝商品详情API接口(taobao.item.get)的完整示例,包含请求参数配置、签名生成和HTTP请求发送的代码。示例以Python语言实现:


Python示例代码

python
import requests

import hashlib

import time

from urllib.parse import urlencode

 

# 配置参数

app_key = "your_app_key"  # 替换为你的AppKey

app_secret = "your_app_secret"  # 替换为你的AppSecret

url = "https://eco.taobao.com/router/rest"

 

# 请求参数

params = {

    "method": "taobao.item.get",

    "app_key": app_key,

    "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),  # 当前时间戳

    "format": "json",

    "v": "2.0",

    "sign_method": "md5",

    "num_iid": "123456789",  # 商品ID,替换为实际商品ID

    "fields": "num_iid,title,price,nick,pic_url,detail_url"  # 返回字段

}

 

# 生成签名

def generate_sign(params, secret):

    """生成淘宝API签名"""

    sorted_params = sorted(params.items())  # 按字典序排序

    base_string = ''.join([f"{k}{v}" for k, v in sorted_params]) + secret  # 拼接参数+密钥

    return hashlib.md5(base_string.encode('utf-8')).hexdigest().upper()

 

# 添加签名到参数

params['sign'] = generate_sign(params, app_secret)

 

# 发送HTTP请求

def call_taobao_api(url, params):

    """

    调用淘宝API并返回结果

    """

    try:

        response = requests.get(url, params=params)

        response.raise_for_status()  # 检查HTTP请求是否成功

        return response.json()  # 返回JSON格式的响应

    except requests.exceptions.RequestException as e:

        print(f"HTTP请求失败: {e}")

        return None

 

# 调用API并打印结果

result = call_taobao_api(url, params)

if result:

    print("API调用成功,返回结果:")

    print(result)

else:

    print("API调用失败。")

代码说明

  1. 参数配置

    • method:固定为taobao.item.get
    • num_iid:商品ID,需替换为实际商品的ID。
    • fields:指定返回的字段,如title(标题)、price(价格)等。
  2. 签名生成

    • 按字典序排序参数,拼接成字符串后附加AppSecret,使用MD5加密生成签名。
  3. HTTP请求

    • 使用requests库发送GET请求,携带所有参数(包括签名)。
  4. 错误处理

    • 捕获网络错误或API返回的错误码,并进行相应处理。

运行结果示例

假设商品ID为123456789,运行代码后可能返回如下结果:

成功返回

json
{

  "item_get_response": {

    "item": {

      "num_iid": "123456789",

      "title": "示例商品标题",

      "price": "88.88",

      "nick": "卖家昵称",

      "pic_url": "https://img.alicdn.com/xxx.jpg",

      "detail_url": "https://item.taobao.com/item.htm?id=123456789"

    }

  }

}

失败返回

json
{

  "error_response": {

    "code": 15,

    "msg": "用户未授权访问该应用"

  }

}

注意事项

  1. 时间戳格式timestamp需为yyyy-MM-dd HH:mm:ss格式。
  2. 签名规则:必须严格按淘宝API签名规则生成。
  3. 字段选择fields参数可指定需要返回的字段,避免请求不必要的数据。

通过以上代码,开发者可以快速调用淘宝商品详情API接口,获取商品的详细信息,并将其集成到自己的应用中。

昨天以前首页

基于 Java 的淘宝 API 调用实践:商品详情页 JSON 数据结构解析与重构

一、引言

在电商领域,淘宝拥有海量的商品数据。通过调用淘宝 API 可以获取商品详情页的 JSON 数据,这对于商家进行市场分析、竞品调研等具有重要意义。本文将详细介绍如何使用 Java 调用淘宝 API,获取商品详情页的 JSON 数据,并对其进行解析与重构。

二、前期准备

在开始之前,需要完成以下准备工作:

  1. 淘宝入驻:在淘宝平台注册账号,创建应用,获取 apiKey 和 apiSecret,这是调用淘宝 API 的必要凭证。
  2. 引入依赖库:使用 Maven 或 Gradle 引入必要的依赖库,如 HttpClient 用于发送 HTTP 请求,Jackson 用于 JSON 数据的处理。以下是 Maven 依赖示例:
<dependencies>
    <!-- HttpClient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
    <!-- Jackson -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.0</version>
    </dependency>
</dependencies>

 

三、淘宝API 调用

淘宝 API 调用需要进行签名,以确保请求的合法性。以下是 Java 实现签名和调用 API 的代码:

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class TaobaoApiCaller {
    private static final String API_URL = "http://gw.api.taobao.com/router/rest";
    private String appKey;
    private String appSecret;

    public TaobaoApiCaller(String appKey, String appSecret) {
        this.appKey = appKey;
        this.appSecret = appSecret;
    }

    public String callApi(Map<String, String> params) throws IOException {
        params.put("app_key", appKey);
        params.put("timestamp", new Date().toString());
        params.put("format", "json");
        params.put("v", "2.0");
        params.put("sign_method", "md5");

        String sign = generateSign(params);
        params.put("sign", sign);

        StringBuilder urlBuilder = new StringBuilder(API_URL);
        urlBuilder.append("?");
        for (Map.Entry<String, String> entry : params.entrySet()) {
            urlBuilder.append(entry.getKey())
                    .append("=")
                    .append(URLEncoder.encode(entry.getValue(), "UTF-8"))
                    .append("&");
        }
        urlBuilder.deleteCharAt(urlBuilder.length() - 1);

        HttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(urlBuilder.toString());
        HttpResponse response = httpClient.execute(httpGet);
        return EntityUtils.toString(response.getEntity());
    }

    private String generateSign(Map<String, String> params) {
        List<Map.Entry<String, String>> paramList = new ArrayList<>(params.entrySet());
        paramList.sort(Map.Entry.comparingByKey());

        StringBuilder signStr = new StringBuilder(appSecret);
        for (Map.Entry<String, String> entry : paramList) {
            signStr.append(entry.getKey()).append(entry.getValue());
        }
        signStr.append(appSecret);

        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(signStr.toString().getBytes());
            StringBuilder result = new StringBuilder();
            for (byte b : digest) {
                String hex = Integer.toHexString(b & 0xFF);
                if (hex.length() == 1) {
                    result.append("0");
                }
                result.append(hex);
            }
            return result.toString().toUpperCase();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

 

四、商品详情页 JSON 数据解析与重构

获取到商品详情页的 JSON 数据后,需要对其进行解析和重构。以下是一个简单的示例:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class JsonParserAndReconstructor {
    public static Map<String, Object> parseAndReconstruct(String json) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(json);

        Map<String, Object> reconstructedData = new HashMap<>();
        // 假设商品详情数据在某个特定节点下,这里需要根据实际情况修改
        JsonNode itemNode = rootNode.path("item_get_response").path("item");
        if (!itemNode.isMissingNode()) {
            reconstructedData.put("itemId", itemNode.path("item_id").asText());
            reconstructedData.put("title", itemNode.path("title").asText());
            reconstructedData.put("price", itemNode.path("price").asDouble());
            // 可以根据需要添加更多字段
        }
        return reconstructedData;
    }
}

 

五、完整示例代码

以下是一个完整的 Java 示例,展示如何调用淘宝 API 获取商品详情页的 JSON 数据,并对其进行解析和重构:

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

class TaobaoApiCaller {
    private static final String API_URL = "http://gw.api.taobao.com/router/rest";
    private String appKey;
    private String appSecret;

    public TaobaoApiCaller(String appKey, String appSecret) {
        this.appKey = appKey;
        this.appSecret = appSecret;
    }

    public String callApi(Map<String, String> params) throws IOException {
        params.put("app_key", appKey);
        params.put("timestamp", new Date().toString());
        params.put("format", "json");
        params.put("v", "2.0");
        params.put("sign_method", "md5");

        String sign = generateSign(params);
        params.put("sign", sign);

        StringBuilder urlBuilder = new StringBuilder(API_URL);
        urlBuilder.append("?");
        for (Map.Entry<String, String> entry : params.entrySet()) {
            urlBuilder.append(entry.getKey())
                    .append("=")
                    .append(URLEncoder.encode(entry.getValue(), "UTF-8"))
                    .append("&");
        }
        urlBuilder.deleteCharAt(urlBuilder.length() - 1);

        HttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(urlBuilder.toString());
        HttpResponse response = httpClient.execute(httpGet);
        return EntityUtils.toString(response.getEntity());
    }

    private String generateSign(Map<String, String> params) {
        List<Map.Entry<String, String>> paramList = new ArrayList<>(params.entrySet());
        paramList.sort(Map.Entry.comparingByKey());

        StringBuilder signStr = new StringBuilder(appSecret);
        for (Map.Entry<String, String> entry : paramList) {
            signStr.append(entry.getKey()).append(entry.getValue());
        }
        signStr.append(appSecret);

        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(signStr.toString().getBytes());
            StringBuilder result = new StringBuilder();
            for (byte b : digest) {
                String hex = Integer.toHexString(b & 0xFF);
                if (hex.length() == 1) {
                    result.append("0");
                }
                result.append(hex);
            }
            return result.toString().toUpperCase();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

class JsonParserAndReconstructor {
    public static Map<String, Object> parseAndReconstruct(String json) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(json);

        Map<String, Object> reconstructedData = new HashMap<>();
        JsonNode itemNode = rootNode.path("item_get_response").path("item");
        if (!itemNode.isMissingNode()) {
            reconstructedData.put("itemId", itemNode.path("item_id").asText());
            reconstructedData.put("title", itemNode.path("title").asText());
            reconstructedData.put("price", itemNode.path("price").asDouble());
        }
        return reconstructedData;
    }
}

public class TaobaoApiExample {
    public static void main(String[] args) {
        String appKey = "your_app_key";
        String appSecret = "your_app_secret";
        TaobaoApiCaller apiCaller = new TaobaoApiCaller(appKey, appSecret);

        Map<String, String> params = new HashMap<>();
        params.put("method", "taobao.item.get");
        params.put("fields", "item_id,title,price");
        params.put("num_iid", "123456"); // 替换为实际的商品 ID

        try {
            String jsonResponse = apiCaller.callApi(params);
            Map<String, Object> reconstructedData = JsonParserAndReconstructor.parseAndReconstruct(jsonResponse);
            System.out.println(reconstructedData);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}    

 

六、总结

通过以上步骤,你可以使用 Java 调用淘宝 API 获取商品详情页的 JSON 数据,并对其进行解析和重构。在实际应用中,需要根据淘宝 API 的文档和实际返回的 JSON 数据结构进行调整。同时,要注意遵守淘宝平台的使用规则,避免因违规操作导致账号被封禁。

❌
❌