|
|
@@ -1,5 +1,6 @@
|
|
|
package com.tzld.supply.api;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.alibaba.fastjson.TypeReference;
|
|
|
import com.tzld.supply.model.entity.*;
|
|
|
@@ -13,6 +14,7 @@ import javax.annotation.PostConstruct;
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
import java.util.concurrent.Callable;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
@@ -54,9 +56,10 @@ public class SpiderApiService {
|
|
|
|
|
|
/**
|
|
|
* 重试执行方法
|
|
|
- * @param callable 业务逻辑回调(返回ResultWrapper,包含状态码和数据)
|
|
|
+ *
|
|
|
+ * @param callable 业务逻辑回调(返回ResultWrapper,包含状态码和数据)
|
|
|
* @param maxRetries 最大重试次数
|
|
|
- * @param delayMs 重试延迟(毫秒)
|
|
|
+ * @param delayMs 重试延迟(毫秒)
|
|
|
* @return 业务数据(T)
|
|
|
*/
|
|
|
private <T> T executeWithRetry(Callable<ResultWrapper<T>> callable, int maxRetries, long delayMs) {
|
|
|
@@ -90,6 +93,7 @@ public class SpiderApiService {
|
|
|
|
|
|
/**
|
|
|
* 查询内容热榜请求
|
|
|
+ *
|
|
|
* @param sortType 排序类型
|
|
|
* @param category 分类
|
|
|
* @param cursor 分页游标
|
|
|
@@ -123,6 +127,7 @@ public class SpiderApiService {
|
|
|
|
|
|
/**
|
|
|
* 搜索内容详情请求
|
|
|
+ *
|
|
|
* @param title 标题
|
|
|
* @return ContentSearchResponse.DataItem 响应对象
|
|
|
*/
|
|
|
@@ -165,10 +170,11 @@ public class SpiderApiService {
|
|
|
|
|
|
/**
|
|
|
* 搜索内容图片请求 baidu
|
|
|
+ *
|
|
|
* @param keyword 搜索关键词
|
|
|
- * @return ContentSearchResponse.DataItem 响应对象
|
|
|
+ * @return List<SpiderMediaItem> 响应对象
|
|
|
*/
|
|
|
- public List<SpiderBaiduImageItem> searchContentImage(String keyword) {
|
|
|
+ public List<SpiderMediaItem> searchContentImage(String keyword) {
|
|
|
// 使用通用重试方法执行,最多重试3次,延迟2000ms
|
|
|
return executeWithRetry(() -> {
|
|
|
// 1. 构造请求
|
|
|
@@ -196,9 +202,19 @@ public class SpiderApiService {
|
|
|
|
|
|
// 3. 解析数据并返回成功结果
|
|
|
SpiderContentSearchResponse<SpiderBaiduImageItem> contentSearchResponse =
|
|
|
- JSONObject.parseObject(jsonObject.getString("data"), new TypeReference<SpiderContentSearchResponse<SpiderBaiduImageItem>>() {});
|
|
|
+ JSONObject.parseObject(jsonObject.getString("data"), new TypeReference<SpiderContentSearchResponse<SpiderBaiduImageItem>>() {
|
|
|
+ });
|
|
|
List<SpiderBaiduImageItem> data = contentSearchResponse != null ? contentSearchResponse.getData() : null;
|
|
|
- return new ResultWrapper<>(0, data); // 状态码0表示成功
|
|
|
+ List<SpiderMediaItem> result = new ArrayList<>();
|
|
|
+ if (CollectionUtil.isNotEmpty(data)) {
|
|
|
+ for (SpiderBaiduImageItem item : data) {
|
|
|
+ SpiderMediaItem mediaItem = new SpiderMediaItem();
|
|
|
+ mediaItem.setTitle(item.getTitle());
|
|
|
+ mediaItem.setUrl(item.getUrl());
|
|
|
+ result.add(mediaItem);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new ResultWrapper<>(0, result); // 状态码0表示成功
|
|
|
} catch (IOException e) {
|
|
|
log.error("搜索内容图片请求异常", e);
|
|
|
throw e; // 抛出异常,由通用重试方法捕获并重试
|
|
|
@@ -208,10 +224,11 @@ public class SpiderApiService {
|
|
|
|
|
|
/**
|
|
|
* 搜索内容视频请求
|
|
|
+ *
|
|
|
* @param keyword 搜索关键词
|
|
|
- * @return List<SpiderHKVideoDetailItem> 响应对象
|
|
|
+ * @return List<SpiderMediaItem> 响应对象
|
|
|
*/
|
|
|
- public List<SpiderHKVideoDetailItem> searchContentVideo(String keyword) {
|
|
|
+ public List<SpiderMediaItem> searchContentVideo(String keyword) {
|
|
|
return executeWithRetry(() -> {
|
|
|
String url = baseUrl + "/crawler/hao_kan_shi_pin/keyword";
|
|
|
JSONObject param = new JSONObject();
|
|
|
@@ -235,7 +252,8 @@ public class SpiderApiService {
|
|
|
}
|
|
|
|
|
|
SpiderContentSearchResponse<SpiderHKVideoSearchItem> contentSearchResponse =
|
|
|
- JSONObject.parseObject(jsonObject.getString("data"), new TypeReference<SpiderContentSearchResponse<SpiderHKVideoSearchItem>>() {});
|
|
|
+ JSONObject.parseObject(jsonObject.getString("data"), new TypeReference<SpiderContentSearchResponse<SpiderHKVideoSearchItem>>() {
|
|
|
+ });
|
|
|
if (contentSearchResponse == null || contentSearchResponse.getData() == null) {
|
|
|
return new ResultWrapper<>(0, new ArrayList<>()); // 无数据仍返回成功状态码
|
|
|
}
|
|
|
@@ -244,7 +262,21 @@ public class SpiderApiService {
|
|
|
for (SpiderHKVideoSearchItem item : contentSearchResponse.getData()) {
|
|
|
videoDetailItems.add(searchContentVideoDetail(item.getVid())); // 嵌套调用也可复用重试逻辑
|
|
|
}
|
|
|
- return new ResultWrapper<>(0, videoDetailItems);
|
|
|
+ List<SpiderMediaItem> result = new ArrayList<>();
|
|
|
+ for (SpiderHKVideoDetailItem videoItem : videoDetailItems) {
|
|
|
+ if (CollectionUtil.isEmpty(videoItem.getVideoURLList())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ SpiderHKVideoDetailItem.VideoURLList videoURLList = videoItem.getVideoURLList().get(0);
|
|
|
+ SpiderMediaItem mediaItem = new SpiderMediaItem();
|
|
|
+ mediaItem.setUrl(videoURLList.getVideoURL());
|
|
|
+ if (Objects.nonNull(videoURLList.getVideoDuration())) {
|
|
|
+ mediaItem.setDuration(videoURLList.getVideoDuration().intValue());
|
|
|
+ }
|
|
|
+ mediaItem.setTitle(videoItem.getTitle());
|
|
|
+ result.add(mediaItem);
|
|
|
+ }
|
|
|
+ return new ResultWrapper<>(0, result);
|
|
|
} catch (IOException e) {
|
|
|
log.error("搜索内容视频请求异常", e);
|
|
|
throw e;
|
|
|
@@ -280,7 +312,8 @@ public class SpiderApiService {
|
|
|
|
|
|
// 3. 解析数据并返回成功结果
|
|
|
SpiderContentSearchResponse<SpiderHKVideoDetailItem> contentSearchResponse =
|
|
|
- JSONObject.parseObject(jsonObject.getString("data"), new TypeReference<SpiderContentSearchResponse<SpiderHKVideoDetailItem>>() {});
|
|
|
+ JSONObject.parseObject(jsonObject.getString("data"), new TypeReference<SpiderContentSearchResponse<SpiderHKVideoDetailItem>>() {
|
|
|
+ });
|
|
|
SpiderHKVideoDetailItem data = (contentSearchResponse != null && !contentSearchResponse.getData().isEmpty())
|
|
|
? contentSearchResponse.getData().get(0)
|
|
|
: null;
|