×

Java 获取淘宝/天猫推荐商品列表实战指南

admin admin 发表于2026-05-20 18:23:20 浏览15 评论0

抢沙发发表评论

一、方案选择:官方 API vs 第三方数据服务

1. 淘宝开放平台官方 API(推荐用于自有店铺)

淘宝开放平台(Taobao Open Platform, TOP)提供了官方 SDK,适合管理自有店铺的商品。
核心推荐相关接口:
  • taobao.item.recommend.get — 获取官方推荐结果
  • taobao.item.recommend.items.get — 获取商品关联推荐(用于挖掘商品间关联)
  • taobao.tbk.item.recommend.get — 淘宝联盟淘客商品推荐(需淘客认证)
限制: 需要注册开发者账号、创建应用、申请权限,且主要用于管理自有店铺数据。

2. 第三方数据服务 API(适合通用商品检索)

如果需要获取公开商品的推荐列表(非自有店铺),可使用第三方合规数据服务,如 JustOneAPI、万邦等。这些服务封装了淘宝/天猫的公开数据,提供标准化的 REST 接口。

二、方案一:使用淘宝官方 SDK(TOP 平台)

2.1 环境准备

  1. 注册开发者账号:访问 淘宝开放平台
  2. 创建应用:获取 AppKeyAppSecret
  3. 下载 Java SDK:在应用管理页面下载对应 SDK
  4. Maven 依赖(如手动导入 SDK):
xml
复制
<dependency>
    <groupId>com.taobao</groupId>
    <artifactId>taobao-sdk-java</artifactId>
    <version>2024.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/taobao-sdk-java.jar</systemPath></dependency>

2.2 Java 代码示例:获取商品关联推荐

java
复制
import com.taobao.api.ApiException;import com.taobao.api.DefaultTaobaoClient;import com.taobao.api.TaobaoClient;import com.taobao.api.request.ItemRecommendItemsGetRequest;import com.taobao.api.response.ItemRecommendItemsGetResponse;import com.taobao.api.domain.Item;import java.util.List;/**
 * 淘宝商品关联推荐获取示例
 * 使用官方 TOP SDK
 */public class TaobaoRecommendOfficial {

    // 沙箱环境地址,生产环境使用 https://gw.api.taobao.com/router/rest
    private static final String SERVER_URL = "https://gw.api.taobao.com/router/rest";
    private static final String APP_KEY = "your_app_key";
    private static final String APP_SECRET = "your_app_secret";
    private static final String SESSION_KEY = "your_session_key"; // 用户授权令牌

    public static void main(String[] args) {
        try {
            // 1. 初始化客户端
            TaobaoClient client = new DefaultTaobaoClient(SERVER_URL, APP_KEY, APP_SECRET);

            // 2. 构造请求对象
            ItemRecommendItemsGetRequest req = new ItemRecommendItemsGetRequest();
            req.setNumIid(652874751412L);  // 目标商品ID
            req.setFields("num_iid,title,price,pic_url,item_url"); // 需要返回的字段

            // 3. 执行请求(需要用户授权session)
            ItemRecommendItemsGetResponse rsp = client.execute(req, SESSION_KEY);

            // 4. 处理响应
            if (rsp.isSuccess()) {
                List<Item> items = rsp.getValues();
                System.out.println("获取到 " + items.size() + " 个推荐商品:");
                
                for (Item item : items) {
                    System.out.println("----------------------------------------");
                    System.out.println("商品ID: " + item.getNumIid());
                    System.out.println("标题: " + item.getTitle());
                    System.out.println("价格: " + item.getPrice());
                    System.out.println("图片: " + item.getPicUrl());
                    System.out.println("链接: " + item.getItemUrl());
                }
            } else {
                System.err.println("调用失败: " + rsp.getMsg());
                System.err.println("错误码: " + rsp.getSubCode());
                System.err.println("错误信息: " + rsp.getSubMsg());
            }

        } catch (ApiException e) {
            e.printStackTrace();
        }
    }}

2.3 淘宝联盟淘客推荐(需淘客认证)

如果你需要获取带佣金的推荐商品(如搭建选品库),可使用淘宝联盟 API:
java
复制
import com.taobao.api.TaobaoClient;import com.taobao.api.DefaultTaobaoClient;import com.taobao.api.request.TbkItemRecommendGetRequest;import com.taobao.api.response.TbkItemRecommendGetResponse;/**
 * 淘宝联盟商品推荐(淘客场景)
 */public class TaobaoTbkRecommend {

    private static final String SERVER_URL = "https://gw.api.taobao.com/router/rest";
    private static final String APP_KEY = "your_app_key";
    private static final String APP_SECRET = "your_app_secret";

    public static void main(String[] args) throws Exception {
        TaobaoClient client = new DefaultTaobaoClient(SERVER_URL, APP_KEY, APP_SECRET);
        
        TbkItemRecommendGetRequest req = new TbkItemRecommendGetRequest();
        req.setFields("num_iid,title,pict_url,small_images,reserve_price,zk_final_price,user_type,provcity,item_url");
        req.setNumIid(123456L);      // 基于该商品找相似推荐
        req.setCount(20);            // 返回数量
        req.setPlatform(1);          // 平台:1-PC, 2-无线
        
        TbkItemRecommendGetResponse rsp = client.execute(req);
        
        if (rsp.isSuccess()) {
            rsp.getResults().forEach(item -> {
                System.out.println("标题: " + item.getTitle());
                System.out.println("券后价: " + item.getZkFinalPrice());
                System.out.println("佣金比例: " + item.getCommissionRate());
            });
        }
    }}

三、方案二:使用第三方数据服务(HTTP 接口)

如果你需要快速接入且不需要管理自有店铺,可使用第三方 API 服务。以下以 JustOneAPI 为例演示 Java 调用。

3.1 Maven 依赖

xml
复制
<dependencies>
    <!-- HTTP 客户端 -->
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>4.12.0</version>
    </dependency>
    <!-- JSON 解析 -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.10.1</version>
    </dependency>
    <!-- Lombok(可选) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency></dependencies>

3.2 完整 Java 实现

java
复制
import com.google.gson.Gson;import com.google.gson.annotations.SerializedName;import lombok.Data;import okhttp3.HttpUrl;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import java.io.IOException;import java.util.List;import java.util.concurrent.TimeUnit;/**
 * 淘宝/天猫推荐商品列表获取(第三方 API 方案)
 * 基于 JustOneAPI 的搜索接口实现推荐逻辑
 */public class TaobaoRecommendClient {

    private static final String BASE_URL = "https://api.justoneapi.com";
    // 中国大陆用户可改用:http://47.117.133.51:30015
    private static final String API_KEY = "your_api_key";
    
    private final OkHttpClient httpClient;
    private final Gson gson;

    public TaobaoRecommendClient() {
        this.httpClient = new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .build();
        this.gson = new Gson();
    }

    /**
     * 根据关键词获取推荐商品列表
     * 
     * @param keyword 搜索关键词(如"手机"、"连衣裙")
     * @param sort 排序方式:_sale(销量), bid(价格升序), _bid(价格降序), _coefp(综合)
     * @param page 页码
     * @param isTmall 是否只返回天猫商品
     * @return 商品列表响应
     */
    public RecommendResponse getRecommendItems(String keyword, String sort, int page, boolean isTmall) 
            throws IOException {
        
        // 构建请求 URL
        HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL + "/api/taobao/search-item-list/v1").newBuilder();
        urlBuilder.addQueryParameter("token", API_KEY);
        urlBuilder.addQueryParameter("keyword", keyword);
        urlBuilder.addQueryParameter("sort", sort);
        urlBuilder.addQueryParameter("page", String.valueOf(page));
        if (isTmall) {
            urlBuilder.addQueryParameter("tmall", "true");
        }

        Request request = new Request.Builder()
                .url(urlBuilder.build())
                .get()
                .build();

        // 执行请求
        try (Response response = httpClient.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code: " + response);
            }
            
            String json = response.body().string();
            return gson.fromJson(json, RecommendResponse.class);
        }
    }

    /**
     * 基于商品 ID 获取相似推荐(关联推荐)
     */
    public RecommendResponse getSimilarItems(long itemId) throws IOException {
        // 先获取商品详情,再基于类目/关键词搜索相似商品
        // 实际项目中可结合多个接口实现精准推荐
        HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL + "/api/taobao/get-item-detail/v1").newBuilder();
        urlBuilder.addQueryParameter("token", API_KEY);
        urlBuilder.addQueryParameter("itemId", String.valueOf(itemId));

        Request request = new Request.Builder()
                .url(urlBuilder.build())
                .get()
                .build();

        try (Response response = httpClient.newCall(request).execute()) {
            String json = response.body().string();
            ItemDetailResponse detail = gson.fromJson(json, ItemDetailResponse.class);
            
            // 基于商品标题关键词进行二次搜索推荐
            if (detail != null && detail.getData() != null) {
                String title = detail.getData().getTitle();
                // 提取核心关键词(简化版,实际可用 NLP 分词)
                String keyword = title.split(" ")[0];
                return getRecommendItems(keyword, "_coefp", 1, false);
            }
            return null;
        }
    }

    // ==================== 数据模型 ====================

    @Data
    public static class RecommendResponse {
        private int code;
        private String message;
        private List<ProductItem> data;
        private String recordTime;
        
        public boolean isSuccess() {
            return code == 0;
        }
    }

    @Data
    public static class ProductItem {
        @SerializedName("item_id")
        private long itemId;
        
        private String title;
        private double price;
        
        @SerializedName("original_price")
        private double originalPrice;
        
        @SerializedName("promotion_price")
        private double promotionPrice;
        
        @SerializedName("pic_url")
        private String picUrl;
        
        @SerializedName("detail_url")
        private String detailUrl;
        
        private int sales;
        
        @SerializedName("shop_title")
        private String shopTitle;
        
        @SerializedName("seller_nick")
        private String sellerNick;
        
        @SerializedName("is_tmall")
        private boolean isTmall;
        
        @SerializedName("commission_rate")
        private double commissionRate;
        
        @SerializedName("coupon_info")
        private String couponInfo;
    }

    @Data
    public static class ItemDetailResponse {
        private int code;
        private DetailData data;
        
        @Data
        public static class DetailData {
            private String title;
            private double price;
        }
    }

    // ==================== 主程序 ====================

    public static void main(String[] args) {
        TaobaoRecommendClient client = new TaobaoRecommendClient();

        try {
            System.out.println("========== 获取关键词推荐商品 ==========");
            RecommendResponse response = client.getRecommendItems(
                    "iPhone 16",    // 关键词
                    "_sale",         // 按销量排序
                    1,               // 第1页
                    true             // 仅天猫
            );

            if (response != null && response.isSuccess()) {
                printItems(response.getData());
            } else {
                System.err.println("请求失败: " + (response != null ? response.getMessage() : "未知错误"));
            }

            System.out.println("\n========== 基于商品 ID 获取相似推荐 ==========");
            RecommendResponse similar = client.getSimilarItems(652874751412L);
            if (similar != null && similar.isSuccess()) {
                printItems(similar.getData());
            }

        } catch (IOException e) {
            System.err.println("网络请求异常: " + e.getMessage());
        }
    }

    private static void printItems(List<ProductItem> items) {
        if (items == null || items.isEmpty()) {
            System.out.println("暂无推荐商品");
            return;
        }

        System.out.printf("共获取到 %d 个推荐商品:%n%n", items.size());
        
        for (ProductItem item : items) {
            System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
            System.out.printf("商品ID: %d%n", item.getItemId());
            System.out.printf("标题: %s%n", item.getTitle());
            System.out.printf("平台: %s%n", item.isTmall() ? "天猫" : "淘宝");
            System.out.printf("原价: ¥%.2f%n", item.getOriginalPrice());
            System.out.printf("促销价: ¥%.2f%n", item.getPromotionPrice());
            System.out.printf("销量: %d%n", item.getSales());
            System.out.printf("店铺: %s%n", item.getShopTitle());
            System.out.printf("图片: %s%n", item.getPicUrl());
            System.out.printf("链接: %s%n", item.getDetailUrl());
            
            if (item.getCouponInfo() != null) {
                System.out.printf("优惠券: %s%n", item.getCouponInfo());
            }
            if (item.getCommissionRate() > 0) {
                System.out.printf("佣金比例: %.1f%%n", item.getCommissionRate() / 100);
            }
            System.out.println();
        }
    }}

四、方案三:使用万邦 API(OneBound)

万邦提供了专门的 item_recommend 接口,可直接获取推荐商品列表。
java
复制
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;/**
 * 万邦 API 获取推荐商品列表
 */public class OneBoundRecommendClient {

    private static final String API_URL = "https://api-gw.onebound.cn/taobao/item_recommend";
    private static final String API_KEY = "your_api_key";
    private static final String API_SECRET = "your_api_secret";

    public static void main(String[] args) throws Exception {
        // 推荐类型:可空,或传入特定类型标识
        String type = ""; 
        
        String url = String.format(
            "%s/?key=%s&secret=%s&type=%s",
            API_URL,
            API_KEY,
            API_SECRET,
            URLEncoder.encode(type, StandardCharsets.UTF_8)
        );

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Accept-Encoding", "gzip")
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        
        if (response.statusCode() == 200) {
            System.out.println("推荐商品数据:");
            System.out.println(response.body());
            // 使用 Gson/Jackson 解析 JSON
        } else {
            System.err.println("请求失败,状态码: " + response.statusCode());
        }
    }}

五、关键注意事项

5.1 合规与权限

表格
方案适用场景权限要求费用
官方 TOP SDK自有店铺管理开发者认证 + 应用审核大部分免费,部分按量计费
淘宝联盟 API淘客推广淘宝联盟账号 + 淘客认证免费
第三方数据服务公开商品检索注册获取 Token按调用量收费

5.2 限流与错误处理

官方 API 有严格的限流策略(如 1000 次/分钟),超出会返回 limit control 错误。
建议:
java
复制
// 添加重试机制和限流控制public class ApiRetryHelper {
    
    public static <T> T executeWithRetry(Callable<T> action, int maxRetries) throws Exception {
        int attempts = 0;
        while (true) {
            try {
                return action.call();
            } catch (ApiException e) {
                if (e.getSubCode().contains("limit") && attempts < maxRetries) {
                    attempts++;
                    Thread.sleep(1000 * attempts); // 指数退避
                } else {
                    throw e;
                }
            }
        }
    }}

5.3 安全规范

  • AppSecret 绝对保密,不要硬编码在代码中或上传到 GitHub
  • 使用环境变量或配置中心管理密钥
  • 用户数据严格遵守《个人信息保护法》

六、总结

表格
需求场景推荐方案核心接口
管理自有店铺商品推荐官方 TOP SDKitem.recommend.items.get
淘客选品/推广淘宝联盟 APItbk.item.recommend.get
通用商品搜索推荐第三方 HTTP APIsearch-item-list
快速原型开发万邦/JustOneAPIitem_recommend


群贤毕至

访客