فهرست منبع

uddate:增加javdb演员影片监控v1

tujidelv 2 سال پیش
والد
کامیت
35ec8e8fe0

+ 14 - 5
src/main/java/top/lvzhiqiang/config/MyJobs.java

@@ -12,10 +12,7 @@ import org.springframework.transaction.annotation.Transactional;
 import top.lvzhiqiang.entity.DicCode;
 import top.lvzhiqiang.entity.VideoSitePool;
 import top.lvzhiqiang.mapper.VideoSitePoolMapper;
-import top.lvzhiqiang.service.BgService;
-import top.lvzhiqiang.service.Crawler4JavbusService;
-import top.lvzhiqiang.service.Crawler4LoveFootService;
-import top.lvzhiqiang.service.CrawlerService;
+import top.lvzhiqiang.service.*;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
@@ -44,6 +41,8 @@ public class MyJobs {
     @Resource
     private Crawler4JavbusService crawler4JavbusService;
     @Resource
+    private Crawler4JavdbService crawler4JavdbService;
+    @Resource
     private Crawler4LoveFootService crawler4LoveFootService;
 
     private static final String SCHEDULED_ZONE = "Asia/Shanghai";
@@ -206,10 +205,20 @@ public class MyJobs {
     /**
      * 每天23:55 jsoupLoveFoot4CrawingFail
      */
-    @Scheduled(cron = "0 55 23 * * ?", zone = SCHEDULED_ZONE)
+    //@Scheduled(cron = "0 55 23 * * ?", zone = SCHEDULED_ZONE)
     public void jsoupLoveFoot4CrawingFail() {
         log.warn("jsoupLoveFoot4CrawingFail开始==============================");
 
         crawler4LoveFootService.jsoupLoveFoot4CrawingFail(4, 2, "javbus");
     }
+
+    /**
+     * 每隔一小时执行一次
+     */
+    @Scheduled(cron = "0 0 */2 * * ?", zone = SCHEDULED_ZONE)
+    public void monitorActors() {
+        log.warn("monitorActors开始==============================");
+
+        crawler4JavdbService.monitorActors();
+    }
 }

+ 49 - 0
src/main/java/top/lvzhiqiang/entity/VideoMonitorActors.java

@@ -0,0 +1,49 @@
+package top.lvzhiqiang.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import top.lvzhiqiang.util.DateUtils;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 演员监控表
+ *
+ * @author lvzhiqiang
+ * @since 19:07 2023/9/16
+ */
+@Data
+public class VideoMonitorActors implements Serializable {
+
+    /**
+     * id主键
+     */
+    private Integer id;
+
+    /**
+     * 代号
+     */
+    private String symbol;
+
+    /**
+     * 站点
+     */
+    private String website;
+
+    /**
+     * Http链接
+     */
+    private String httpUrl;
+
+    /**
+     * 演员备注
+     */
+    private String actorsRemark;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = DateUtils.PATTERN_TO_SECONDS)
+    private LocalDateTime createTime;
+}

+ 32 - 0
src/main/java/top/lvzhiqiang/mapper/VideoMonitorActorsMapper.java

@@ -0,0 +1,32 @@
+package top.lvzhiqiang.mapper;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import top.lvzhiqiang.entity.VideoMonitorActors;
+
+import java.util.List;
+
+/**
+ * 演员监控表Mapper
+ *
+ * @author lvzhiqiang
+ * 2022/4/16 16:10
+ */
+public interface VideoMonitorActorsMapper {
+
+    @Select("select * from video_monitor_actors where website = #{website} and delete_flag = 1")
+    List<VideoMonitorActors> findAllListByWebsite(String website);
+
+    @Select("select identification_code from video_monitor_actors_log where symbol = #{symbol}")
+    List<String> findAllLogListBySymbol(String symbol);
+
+    @Insert({"<script>" +
+            "INSERT ignore INTO video_monitor_actors_log(identification_code,symbol,create_time)" +
+            " VALUES " +
+            "<foreach collection='codeList' item='code' index=\"index\" separator=\",\">" +
+            "   (#{code}, #{symbol}, now())" +
+            "</foreach>" +
+            "</script>"})
+    void insertLogList(@Param("codeList") List<String> codeList, @Param("symbol") String symbol);
+}

+ 15 - 0
src/main/java/top/lvzhiqiang/service/Crawler4JavdbService.java

@@ -0,0 +1,15 @@
+package top.lvzhiqiang.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * Crawler Javdb Service
+ *
+ * @author lvzhiqiang
+ * 2022/10/17 14:47
+ */
+public interface Crawler4JavdbService {
+    void monitorActors();
+
+    void monitorAlarm4APP_TEXT_CARD(String content, JSONObject params);
+}

+ 1 - 1
src/main/java/top/lvzhiqiang/service/impl/BgServiceImpl.java

@@ -1232,7 +1232,7 @@ public class BgServiceImpl implements BgService {
         long start = System.currentTimeMillis();
         Connection.Response response = Jsoup.connect(href).method(Connection.Method.GET).ignoreContentType(true).timeout(50 * 1000).execute();
 
-        String fileName = issueDate.concat(" ").concat(videoInfoPool.getIdentificationCode()).concat(" ").concat(videoInfoPool.getName()).replace("?", "?");
+        String fileName = issueDate.concat(" ").concat(videoInfoPool.getIdentificationCode()).concat(" ").concat(videoInfoPool.getName().replace("/", "")).replace("?", "?");
         byte[] imgUrlBytes = fileName.getBytes(StandardCharsets.UTF_8);
         if (imgUrlBytes.length > 251) {
             byte[] imgUrlDestBytes = new byte[251];

+ 171 - 0
src/main/java/top/lvzhiqiang/service/impl/Crawler4JavdbServiceImpl.java

@@ -0,0 +1,171 @@
+package top.lvzhiqiang.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
+import me.chanjar.weixin.cp.bean.message.WxCpMessage;
+import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
+import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import top.lvzhiqiang.entity.VideoMonitorActors;
+import top.lvzhiqiang.mapper.VideoMonitorActorsMapper;
+import top.lvzhiqiang.service.Crawler4JavdbService;
+import top.lvzhiqiang.util.JsoupUtil;
+import top.lvzhiqiang.util.SpringUtils;
+
+import javax.annotation.Resource;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Crawler Javdb ServiceImpl
+ *
+ * @author lvzhiqiang
+ * 2022/10/17 14:47
+ */
+@Service
+@Slf4j
+public class Crawler4JavdbServiceImpl implements Crawler4JavdbService {
+
+    @Resource
+    private VideoMonitorActorsMapper videoMonitorActorsMapper;
+
+    @Value("${spring.profiles.active}")
+    private String env;
+    Proxy proxy = null;
+
+    //private final ForkJoinPool forkJoinPool = new ForkJoinPool(16);
+
+    private static final WxCpServiceImpl wxCpService;
+    static {
+        WxCpDefaultConfigImpl wxCpDefaultConfig = new WxCpDefaultConfigImpl();
+        wxCpDefaultConfig.setCorpId("ww95a4adba56acb55f");
+        wxCpDefaultConfig.setAgentId(1000003);
+        wxCpDefaultConfig.setCorpSecret("JytA0dZYsorEYyHNbfJuxpSUXydGiSc_uH6jhduB94M");
+        wxCpService = new WxCpServiceImpl();
+        wxCpService.setWxCpConfigStorage(wxCpDefaultConfig);
+    }
+
+    public void beforeJavbus() {
+        if (null == proxy) {
+            if ("dev".equals(env)) {
+                proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 1080));
+            } else {
+                proxy = Proxy.NO_PROXY;
+            }
+        }
+    }
+
+    @Override
+    public void monitorActors() {
+        beforeJavbus();
+
+        String website = "javdb";
+        List<VideoMonitorActors> videoMonitorActorsList = videoMonitorActorsMapper.findAllListByWebsite(website);
+
+        /*forkJoinPool.submit(() -> videoMonitorActorsList.parallelStream().forEach(e -> {
+        })).join();*/
+
+        Document document;
+        Elements itembSelects;
+        for (VideoMonitorActors videoMonitorActors : videoMonitorActorsList) {
+            try {
+                List<String> insertCodeList = new ArrayList<>();
+                List<String> codeList = videoMonitorActorsMapper.findAllLogListBySymbol(videoMonitorActors.getSymbol());
+
+                Map<String, String> headerMap = new HashMap<>();
+                headerMap.put("referer", videoMonitorActors.getHttpUrl());
+                document = JsoupUtil.requestDocument(videoMonitorActors.getHttpUrl(), JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
+                itembSelects = document.select("div.movie-list").select("div.item");
+
+                for (Element itembSelect : itembSelects) {
+                    String code = itembSelect.select("a.box").get(0).select("div.video-title").select("strong").text().trim().toUpperCase();
+                    if (codeList.contains(code)) {
+                        continue;
+                    }
+                    insertCodeList.add(code);
+
+                    String url = itembSelect.select("a.box").get(0).attr("abs:href");
+                    String title = itembSelect.select("a.box").get(0).attr("title");
+                    String score = itembSelect.select("a.box").get(0).select("div.score").text().replace("&nbsp;", "").trim();
+                    String date = itembSelect.select("a.box").get(0).select("div.meta").text().trim();
+                    String tags = itembSelect.select("a.box").get(0).select("div.tags").text().trim();
+
+                    String content = "<div class=\"highlight\">演员:" + videoMonitorActors.getActorsRemark() + "</div>" +
+                            "<div>识别码:" + code + "</div>" +
+                            "<div>标题:" + title + "</div>" +
+                            "<div>发行日期:" + date + "</div>" +
+                            "<div class=\"gray\">评价:" + score + "</div>" +
+                            "<div class=\"gray\">标签:" + tags + "</div>";
+
+                    JSONObject params = new JSONObject();
+                    params.put("title", "JAVDB演员监控报警");
+                    params.put("logUrl", url);
+                    params.put("btnTxt", "影片详情");
+                    SpringUtils.getBean(Crawler4JavdbServiceImpl.class).monitorAlarm4APP_TEXT_CARD(content, params);
+                }
+
+                videoMonitorActorsMapper.insertLogList(insertCodeList, videoMonitorActors.getSymbol());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    @Async
+    public void monitorAlarm4APP_TEXT_CARD(String content, JSONObject params) {
+        // 文本卡片模式发消息
+        String title = "监控告警明细";
+        if (params.containsKey("title")) {
+            title = params.getString("title");
+        }
+        String logUrl = "https://lvzhiqiang.top";
+        if (params.containsKey("logUrl")) {
+            logUrl = params.getString("logUrl");
+        }
+        String btnTxt = "日志详情";
+        if (params.containsKey("btnTxt")) {
+            btnTxt = params.getString("btnTxt");
+        }
+        String user = "LvZhiQiang";
+        if (params.containsKey("user")) {
+            user = params.getString("user");
+        }
+        String party = "";
+        if (params.containsKey("party")) {
+            party = params.getString("party");
+        }
+        String tag = "";
+        if (params.containsKey("tag")) {
+            tag = params.getString("tag");
+        }
+
+        WxCpMessage wxCpMessage = WxCpMessage.TEXTCARD().agentId(1000003)
+                .toUser(user)
+                .toParty(party)
+                .toTag(tag)
+                .title(title).description(content)
+                .url(logUrl).btnTxt(btnTxt)
+                .build();
+        try {
+            log.info("企业微信推送消息,send message: {}", wxCpMessage);
+            WxCpMessageSendResult sendResult = wxCpService.getMessageService().send(wxCpMessage);
+            log.info("企业微信推送消息成功,send result: {}", sendResult);
+        } catch (WxErrorException e) {
+            log.error("企业微信推送消息失败!Detail: ", e);
+        }
+    }
+}
+
+