一、方案选择:官方 API vs 第三方数据服务
1. 淘宝开放平台官方 API(推荐用于自有店铺)
核心推荐相关接口:
taobao.item.recommend.get— 获取官方推荐结果taobao.item.recommend.items.get— 获取商品关联推荐(用于挖掘商品间关联)
限制: 需要注册开发者账号、创建应用、申请权限,且主要用于管理自有店铺数据。
2. 第三方数据服务 API(适合通用商品检索)
二、方案一:使用淘宝官方 SDK(TOP 平台)
2.1 环境准备
- 注册开发者账号:访问 淘宝开放平台
- 创建应用:获取
AppKey和AppSecret - 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 淘宝联盟淘客推荐(需淘客认证)
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 接口)
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)
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 限流与错误处理
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 SDK | item.recommend.items.get |
| 淘客选品/推广 | 淘宝联盟 API | tbk.item.recommend.get |
| 通用商品搜索推荐 | 第三方 HTTP API | search-item-list |
| 快速原型开发 | 万邦/JustOneAPI | item_recommend |