From 8a2a4a6bfb6fc4b1c620c1598304cf0dd04b3575 Mon Sep 17 00:00:00 2001 From: "862857010@qq.com" <862857010@> Date: Mon, 28 Aug 2023 15:57:03 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=8A=96=E9=9F=B3=E8=8E=B7=E5=8F=96=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E7=94=A8=E6=88=B7=E8=A7=86=E9=A2=91=202.=E6=8A=96?= =?UTF-8?q?=E9=9F=B3=E7=82=B9=E5=87=BB=E8=A7=86=E9=A2=91=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E6=8A=96=E9=9F=B3=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DouyingConfigController.java | 37 ++++++- .../com/cjy/douyin/domain/GetVideoVO.java | 27 +++++ .../java/com/cjy/douyin/domain/VideoInfo.java | 26 +++++ .../douyin/mapper/DouyingConfigMapper.java | 4 + .../douyin/service/IDouyingConfigService.java | 103 +++++++++--------- .../impl/DouyingConfigServiceImpl.java | 7 ++ .../douyunconfig/DouyingConfigMapper.xml | 8 +- .../ruoyi/common/utils/http/HttpUtils.java | 35 ++++++ .../com/ruoyi/quartz/mapper/DouYinMapper.java | 9 ++ .../service/impl/DouYinServiceImpl.java | 48 +++++--- .../com/ruoyi/quartz/task/DouYinTask.java | 1 + .../com/ruoyi/quartz/util/DouYinUTils.java | 8 +- .../resources/mapper/quartz/DouyinMapper.xml | 12 ++ 13 files changed, 254 insertions(+), 71 deletions(-) create mode 100644 cjy-project/src/main/java/com/cjy/douyin/domain/GetVideoVO.java create mode 100644 cjy-project/src/main/java/com/cjy/douyin/domain/VideoInfo.java diff --git a/cjy-project/src/main/java/com/cjy/douyin/controller/DouyingConfigController.java b/cjy-project/src/main/java/com/cjy/douyin/controller/DouyingConfigController.java index 1ec5463c..2be39642 100644 --- a/cjy-project/src/main/java/com/cjy/douyin/controller/DouyingConfigController.java +++ b/cjy-project/src/main/java/com/cjy/douyin/controller/DouyingConfigController.java @@ -1,11 +1,19 @@ package com.cjy.douyin.controller; +import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletResponse; +import com.alibaba.fastjson2.JSONObject; +import com.cjy.douyin.domain.GetVideoVO; +import com.cjy.douyin.domain.VideoInfo; import com.cjy.media.domain.WeiboConfig; import com.cjy.media.util.WeiBoEncryption; +import com.ruoyi.common.utils.http.HttpUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -115,8 +123,35 @@ public class DouyingConfigController extends BaseController { DouyingConfig douyingConfig = douyingConfigService.selectDouyingConfigById(id); String state = WeiBoEncryption.encrypt(douyingConfig.getClientId().toString(), rule); String authUrl = "https://open.douyin.com/platform/oauth/connect?client_key=" + douyingConfig.getClientId() + "&state=" + state + "&redirect_uri=" - + URLEncoder.encode(douyingConfig.getRedirectUri(), "UTF-8") + "&scope=user_info,data.external.user&response_type=code"; + + URLEncoder.encode(douyingConfig.getRedirectUri(), "UTF-8") + "&scope=user_info,data.external.user,video.data.bind,video.list.bind&response_type=code"; return success(authUrl); } + /** + * 获取视频id + * @param getVideoVO + * @return + * @throws Exception + */ + @PostMapping(value = "getVideo") + public AjaxResult getVideo(@RequestBody GetVideoVO getVideoVO) throws Exception { + + String accessToken = douyingConfigService.selectDouyinAuthorizedInfoByOpenId(getVideoVO.getOpenId()); + List idList = new ArrayList<>(); + idList.add(getVideoVO.getId()); + JSONObject json = this.videoData(getVideoVO.getOpenId(), idList, accessToken); + JSONObject videoListDataJson = JSONObject.parseObject(json.get("data").toString()); + + List dataJsonList = videoListDataJson.getList("list", VideoInfo.class); + return success(dataJsonList.get(0).getShareUrl()); + } + + public JSONObject videoData(String openId, List itemIds, String accessToken) { + String videoDataURL = "https://open.douyin.com/api/douyin/v1/video/video_data?open_id=" + openId; + Map paramsMap = new HashMap<>(); + paramsMap.put("item_ids", itemIds); + String response = HttpUtils.callPostDouYinAPI(videoDataURL, paramsMap, accessToken); + JSONObject json = JSONObject.parseObject(response); + return json; + } } diff --git a/cjy-project/src/main/java/com/cjy/douyin/domain/GetVideoVO.java b/cjy-project/src/main/java/com/cjy/douyin/domain/GetVideoVO.java new file mode 100644 index 00000000..b22ca972 --- /dev/null +++ b/cjy-project/src/main/java/com/cjy/douyin/domain/GetVideoVO.java @@ -0,0 +1,27 @@ +package com.cjy.douyin.domain; + +/** + * @author liangjiawei + * @createDate 2023/8/28 + */ +public class GetVideoVO { + + private String id; + private String openId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } +} diff --git a/cjy-project/src/main/java/com/cjy/douyin/domain/VideoInfo.java b/cjy-project/src/main/java/com/cjy/douyin/domain/VideoInfo.java new file mode 100644 index 00000000..f2cbad33 --- /dev/null +++ b/cjy-project/src/main/java/com/cjy/douyin/domain/VideoInfo.java @@ -0,0 +1,26 @@ +package com.cjy.douyin.domain; + +/** + * @author liangjiawei + * @createDate 2023/8/28 + */ +public class VideoInfo { + private String title; + private String shareUrl; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getShareUrl() { + return shareUrl; + } + + public void setShareUrl(String shareUrl) { + this.shareUrl = shareUrl; + } +} diff --git a/cjy-project/src/main/java/com/cjy/douyin/mapper/DouyingConfigMapper.java b/cjy-project/src/main/java/com/cjy/douyin/mapper/DouyingConfigMapper.java index c9f30f46..2ca215a0 100644 --- a/cjy-project/src/main/java/com/cjy/douyin/mapper/DouyingConfigMapper.java +++ b/cjy-project/src/main/java/com/cjy/douyin/mapper/DouyingConfigMapper.java @@ -1,6 +1,8 @@ package com.cjy.douyin.mapper; import java.util.List; +import java.util.Map; + import com.cjy.douyin.domain.DouyingConfig; /** @@ -58,4 +60,6 @@ public interface DouyingConfigMapper * @return 结果 */ public int deleteDouyingConfigByIds(Long[] ids); + + String selectDouyinAuthorizedInfoByOpenId(String openid); } diff --git a/cjy-project/src/main/java/com/cjy/douyin/service/IDouyingConfigService.java b/cjy-project/src/main/java/com/cjy/douyin/service/IDouyingConfigService.java index dc8b68b5..f8690826 100644 --- a/cjy-project/src/main/java/com/cjy/douyin/service/IDouyingConfigService.java +++ b/cjy-project/src/main/java/com/cjy/douyin/service/IDouyingConfigService.java @@ -1,61 +1,64 @@ package com.cjy.douyin.service; import java.util.List; +import java.util.Map; + import com.cjy.douyin.domain.DouyingConfig; /** * 抖音配置Service接口 - * + * * @author liangjiawei * @date 2023-08-10 */ -public interface IDouyingConfigService -{ - /** - * 查询抖音配置 - * - * @param id 抖音配置主键 - * @return 抖音配置 - */ - public DouyingConfig selectDouyingConfigById(Long id); - - /** - * 查询抖音配置列表 - * - * @param douyingConfig 抖音配置 - * @return 抖音配置集合 - */ - public List selectDouyingConfigList(DouyingConfig douyingConfig); - - /** - * 新增抖音配置 - * - * @param douyingConfig 抖音配置 - * @return 结果 - */ - public int insertDouyingConfig(DouyingConfig douyingConfig); - - /** - * 修改抖音配置 - * - * @param douyingConfig 抖音配置 - * @return 结果 - */ - public int updateDouyingConfig(DouyingConfig douyingConfig); - - /** - * 批量删除抖音配置 - * - * @param ids 需要删除的抖音配置主键集合 - * @return 结果 - */ - public int deleteDouyingConfigByIds(Long[] ids); - - /** - * 删除抖音配置信息 - * - * @param id 抖音配置主键 - * @return 结果 - */ - public int deleteDouyingConfigById(Long id); +public interface IDouyingConfigService { + /** + * 查询抖音配置 + * + * @param id 抖音配置主键 + * @return 抖音配置 + */ + public DouyingConfig selectDouyingConfigById(Long id); + + /** + * 查询抖音配置列表 + * + * @param douyingConfig 抖音配置 + * @return 抖音配置集合 + */ + public List selectDouyingConfigList(DouyingConfig douyingConfig); + + /** + * 新增抖音配置 + * + * @param douyingConfig 抖音配置 + * @return 结果 + */ + public int insertDouyingConfig(DouyingConfig douyingConfig); + + /** + * 修改抖音配置 + * + * @param douyingConfig 抖音配置 + * @return 结果 + */ + public int updateDouyingConfig(DouyingConfig douyingConfig); + + /** + * 批量删除抖音配置 + * + * @param ids 需要删除的抖音配置主键集合 + * @return 结果 + */ + public int deleteDouyingConfigByIds(Long[] ids); + + /** + * 删除抖音配置信息 + * + * @param id 抖音配置主键 + * @return 结果 + */ + public int deleteDouyingConfigById(Long id); + + String selectDouyinAuthorizedInfoByOpenId(String openid); } diff --git a/cjy-project/src/main/java/com/cjy/douyin/service/impl/DouyingConfigServiceImpl.java b/cjy-project/src/main/java/com/cjy/douyin/service/impl/DouyingConfigServiceImpl.java index 8a945c52..cf782d6b 100644 --- a/cjy-project/src/main/java/com/cjy/douyin/service/impl/DouyingConfigServiceImpl.java +++ b/cjy-project/src/main/java/com/cjy/douyin/service/impl/DouyingConfigServiceImpl.java @@ -1,6 +1,8 @@ package com.cjy.douyin.service.impl; import java.util.List; +import java.util.Map; + import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -92,4 +94,9 @@ public class DouyingConfigServiceImpl implements IDouyingConfigService { return douyingConfigMapper.deleteDouyingConfigById(id); } + + @Override + public String selectDouyinAuthorizedInfoByOpenId(String openid) { + return douyingConfigMapper.selectDouyinAuthorizedInfoByOpenId(openid); + } } diff --git a/cjy-project/src/main/resources/mapper/douyunconfig/DouyingConfigMapper.xml b/cjy-project/src/main/resources/mapper/douyunconfig/DouyingConfigMapper.xml index f92a7ed7..3287d27f 100644 --- a/cjy-project/src/main/resources/mapper/douyunconfig/DouyingConfigMapper.xml +++ b/cjy-project/src/main/resources/mapper/douyunconfig/DouyingConfigMapper.xml @@ -54,7 +54,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + + insert into douying_config diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java index dcfc39a4..2b663687 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -267,6 +267,41 @@ public class HttpUtils { con.setRequestMethod("POST"); con.setDoOutput(true); con.setRequestProperty("Content-Type", "application/json"); + OutputStream os = con.getOutputStream(); + os.write(requestBody.toString().getBytes()); + os.flush(); + os.close(); + + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuilder response = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + System.out.println("response " + response.toString()); + return response.toString(); + } else { + System.out.println("Error occurred. Response code: " + responseCode); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + public static String callPostDouYinAPI(String url, Map params, String accessToken) { + try { + URL obj = new URL(url); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + con.setRequestMethod("POST"); + con.setDoOutput(true); + con.setRequestProperty("Content-Type", "application/json"); + con.setRequestProperty("access-token", accessToken); + + // 构建请求体 + JSONObject requestBody = new JSONObject(params); OutputStream os = con.getOutputStream(); os.write(requestBody.toString().getBytes()); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DouYinMapper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DouYinMapper.java index 8f4da8d9..7a74f942 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DouYinMapper.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DouYinMapper.java @@ -77,4 +77,13 @@ public interface DouYinMapper { * @return */ int addDouYinVideoInFoList(@Param("list") List list,@Param("openId") String openId,@Param("organCode") String organCode); + + /** + * 单条插入 + * @param douYinVideoInFoDTO + * @param openId + * @param organCode + * @return + */ + int addDouYinVideoInFo(@Param("data") DouYinVideoInFoDTO douYinVideoInFoDTO ,@Param("openId") String openId,@Param("organCode") String organCode); } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/DouYinServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/DouYinServiceImpl.java index 87429e95..f3d90ff5 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/DouYinServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/DouYinServiceImpl.java @@ -9,6 +9,7 @@ import com.ruoyi.quartz.domain.dto.*; import com.ruoyi.quartz.mapper.DouYinMapper; import com.ruoyi.quartz.service.DouYinService; import com.ruoyi.quartz.util.DouYinUTils; +import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,6 +21,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @author liangjiawei @@ -263,30 +265,34 @@ public class DouYinServiceImpl implements DouYinService { @Override public void getDouYinVideoInfo() { List douYinAuthorizedInfoDTOList = this.getAllDouYinAuthorizedInfo(); - int cursor = 0; + Long cursor = 0L; int count = 10; int isResume = 0; - List addList = new ArrayList(); + + List newAddList = new ArrayList(); for (DouYinAuthorizedInfoDTO item : douYinAuthorizedInfoDTOList) { while (isResume == 0) { JSONObject videoList = DouYinUTils.videoListURL(item.getOpenId(), cursor, count, item.getAccessToken()); - JSONObject videoListDataJson = JSONObject.parseObject(videoList.toString()); - if (videoListDataJson.get("error_code").equals("0")) { - cursor = videoListDataJson.getByte("cursor"); - if (!videoListDataJson.get("has_more").equals("true")) { + JSONObject videoListDataJson = JSONObject.parseObject(videoList.get("data").toString()); + if (videoListDataJson.get("error_code").toString().equals("0")) { + cursor = Long.parseLong(videoListDataJson.get("cursor").toString()); + if (videoListDataJson.get("has_more").toString().equals("false")) { isResume = 1; } //处理数据插入 List dataJsonList = videoListDataJson.getList("list", DouYinVideoInFoDTO.class); - if (addList.size() < 1000) { - addList.addAll(dataJsonList); + + if (newAddList.size() < 1000) { + newAddList.addAll(dataJsonList.stream().filter(i->i.getVideoStatus().equals("1")).collect(Collectors.toList())); } else { //批量插入视频信息 - douYinMapper.addDouYinVideoInFoList(addList, item.getOpenId(), item.getOrganCode()); +// douYinMapper.addDouYinVideoInFoList(newAddList, item.getOpenId(), item.getOrganCode()); + this.addDouYinVideoInFo(newAddList, item.getOpenId(), item.getOrganCode()); //清空 - dataJsonList.clear(); + newAddList.clear(); //添加 - addList.addAll(dataJsonList); + newAddList.addAll(dataJsonList.stream().filter(i->i.getVideoStatus().equals("1")).collect(Collectors.toList())); + } } else { DouyinErrorLogDTO douyinErrorLogDTO = new DouyinErrorLogDTO(); @@ -294,11 +300,23 @@ public class DouYinServiceImpl implements DouYinService { douyinErrorLogDTO.setDescribe("获取分享数量异常"); douYinMapper.adddouyinErrorLog(douyinErrorLogDTO); } - if (!addList.isEmpty()) { - //批量插入视频信息 - douYinMapper.addDouYinVideoInFoList(addList, item.getOpenId(), item.getOrganCode()); - } + + } + if (!newAddList.isEmpty()) { + //批量插入视频信息 + this.addDouYinVideoInFo(newAddList, item.getOpenId(), item.getOrganCode()); +// douYinMapper.addDouYinVideoInFoList(newAddList, item.getOpenId(), item.getOrganCode()); } } } + + public void addDouYinVideoInFo(List list, @Param("openId") String openId, @Param("organCode") String organCode){ + list.stream().forEach(item->{ + try { + douYinMapper.addDouYinVideoInFo(item,openId,organCode); + }catch (Exception e){ + e.printStackTrace(); + } + }); + } } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DouYinTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DouYinTask.java index 69055338..fefc683e 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DouYinTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/DouYinTask.java @@ -30,6 +30,7 @@ public class DouYinTask { } //获取授权抖音号的视频数据 +// @Scheduled(cron = "0 0/1 * * * ?") public void getDouYinVideoInfo() { douYinService.getDouYinVideoInfo(); } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/DouYinUTils.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/DouYinUTils.java index 8d92fbb5..ea12f29e 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/DouYinUTils.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/DouYinUTils.java @@ -33,13 +33,13 @@ public class DouYinUTils { private static String videoSituationCountURL = "https://open.douyin.com/data/external/user/item/"; //获取授权用户发布的视频 - private static String videoListURL = "/api/douyin/v1/video/video_list/"; + private static String videoListURL = "https://open.douyin.com/api/douyin/v1/video/video_list/"; //查询特定视频的视频数据 private static String videoDataURL = "https://open.douyin.com/api/douyin/v1/video/video_data/"; /** - * 获取指定微博数据 + * 获取制定抖音数据 * @param openId * @param itemIds * @param accessToken @@ -50,7 +50,7 @@ public class DouYinUTils { Map paramsMap =new HashMap<>(); paramsMap.put("item_ids",itemIds); - String response = HttpUtils.callDouYinAPI(videoDataURL + params,paramsMap, accessToken); + String response = HttpUtils.callPostDouYinAPI(videoDataURL + params,paramsMap, accessToken); JSONObject json = JSONObject.parseObject(response); return json; } @@ -63,7 +63,7 @@ public class DouYinUTils { * @param accessToken * @return */ - public static JSONObject videoListURL(String openId, int cursor,int count,String accessToken) { + public static JSONObject videoListURL(String openId, Long cursor,int count,String accessToken) { String params = "?open_id=" + openId + "&cursor="+cursor+"&count="+count; String response = HttpUtils.doDouYinGet(videoListURL + params, accessToken); JSONObject json = JSONObject.parseObject(response); diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/DouyinMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/DouyinMapper.xml index 3aeeb8b4..a948af75 100644 --- a/ruoyi-quartz/src/main/resources/mapper/quartz/DouyinMapper.xml +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/DouyinMapper.xml @@ -29,6 +29,18 @@ #{organCode}, #{openId}) + + + INSERT INTO douyin_video_info (item_id, media_type, title, cover, is_top, + create_time, is_reviewed, video_status, share_url, statistics, organ_code, open_id) + VALUES + + (#{data.itemId}, #{data.mediaType}, #{data.title}, #{data.cover} , #{data.isTop} , + #{data.createTime} , + #{data.isReviewed} , #{data.videoStatus} , #{data.shareUrl} , #{data.statistics} , + #{organCode}, #{openId}) + + update douyin_authorized_info