From 692085595395b27aaebd81c5ffbfafb30a6fc200 Mon Sep 17 00:00:00 2001 From: xuelijun <977662702@qq.com> Date: Sat, 31 Jan 2026 18:16:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=85=A5=E5=A4=B1=E8=B4=A5=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E7=99=BB=E5=85=A53?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tem/bocai/schedules/CrawlerSchedule.java | 51 ++++-- .../com/tem/bocai/util/HttpClientExample.java | 151 ++++++++++++++---- 2 files changed, 151 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/tem/bocai/schedules/CrawlerSchedule.java b/src/main/java/com/tem/bocai/schedules/CrawlerSchedule.java index 1e0e79c..e76eaf1 100644 --- a/src/main/java/com/tem/bocai/schedules/CrawlerSchedule.java +++ b/src/main/java/com/tem/bocai/schedules/CrawlerSchedule.java @@ -39,11 +39,11 @@ public class CrawlerSchedule { // 每天凌晨2点执行爬取开奖结果 //@Scheduled(cron = "0 0 2 * * ?") // 每7秒执行一次爬取开奖结果 - @Scheduled(cron = "*/9 * * * * ?") + //@Scheduled(cron = "*/9 * * * * ?") /*@Scheduled(cron = "0 6-59/5 7-23 * * ?") @Scheduled(cron = "0 0-55/5 0-6 * * ?")*/ // 从7:00分30秒起每5分钟执行一次 - //@Scheduled(cron = "30 0/5 * * * ?") + @Scheduled(cron = "30 0/5 * * * ?") public void executeLotteryDraw() { log.info("开始爬取开奖结果"); int retryCount = 0; @@ -110,27 +110,46 @@ public class CrawlerSchedule { } - //@Scheduled(cron = "50 0/5 * * * ?") + @Scheduled(cron = "55 0/5 * * * ?") + //@Scheduled(cron = "*/9 * * * * ?") public void executePksHistory() { log.info("开始获取历史开奖结果"); - // 获取API数据 + + // 获取数据库最新记录 + LotteryResult lotteryResult = lotteryResultRepository.findTopByOrderByTimeDesc() + .orElse(null); + + // 如果数据库为空,直接获取并保存所有历史数据 + if (lotteryResult == null) { + log.info("数据库为空,获取全部历史数据"); + List> historyList = HttpClientExample.getPksHistoryList(); + HttpClientExample.getPksHistory(historyList, pypath); + return; + } + + String lastTime = lotteryResult.getTime(); List> historyList = HttpClientExample.getPksHistoryList(); - // 获取数据库最新时间 - Optional latestTimeOpt = lotteryResultRepository.findTopByOrderByTimeDesc() - .map(LotteryResult::getTime); - // 判断是否需要更新 - boolean needUpdate = latestTimeOpt - .map(latestTime -> historyList.stream() - .noneMatch(item -> latestTime.equals(item.get("time")))) - .orElse(true); // 数据库为空时需要更新 + // 检查API数据中是否有比数据库最新时间更晚的数据 + boolean hasNewerData = false; + for (Map item : historyList) { + String itemTime = (String) item.get("time"); - if (needUpdate) { - log.info("需要更新数据,最新时间:{}", - latestTimeOpt.orElse("数据库为空")); + // 假设时间格式是 "yyyy-MM-dd HH:mm:ss" 或其他可比较的格式 + // 比较时间字符串(前提是格式一致且可按字典序比较) + if (itemTime.compareTo(lastTime) > 0) { + hasNewerData = true; + log.info("发现新数据:{} > {}", itemTime, lastTime); + break; + } + } + + // 如果有比数据库时间更新的数据,执行获取操作 + if (hasNewerData) { + log.info("发现比数据库时间 {} 更新的数据,执行获取", lastTime); HttpClientExample.getPksHistory(historyList, pypath); } else { - log.info("数据已是最新,无需更新"); + log.info("未发现比数据库时间 {} 更新的数据,无需处理", lastTime); } } diff --git a/src/main/java/com/tem/bocai/util/HttpClientExample.java b/src/main/java/com/tem/bocai/util/HttpClientExample.java index 60fa59a..d222a85 100644 --- a/src/main/java/com/tem/bocai/util/HttpClientExample.java +++ b/src/main/java/com/tem/bocai/util/HttpClientExample.java @@ -96,27 +96,27 @@ public class HttpClientExample { String preDrawCode = item.get("preDrawCode").asText(); String[] codeArray = preDrawCode.split(","); - // 转换为整数数组 - int[] result = new int[codeArray.length]; - for (int i = 0; i < codeArray.length; i++) { - result[i] = Integer.parseInt(codeArray[i].trim()); + // 转换为List + List resultNumbers = new ArrayList<>(); + for (String code : codeArray) { + resultNumbers.add(Integer.parseInt(code.trim())); } // 计算sum1和sum2 int sum1 = 0; int sum2 = 0; for (int i = 0; i < 5; i++) { - sum1 += result[i]; + sum1 += resultNumbers.get(i); } for (int i = 5; i < 10; i++) { - sum2 += result[i]; + sum2 += resultNumbers.get(i); } // 计算winner(前五个号码的和) int winner = sum1; // 计算冠亚和(前两个号码的和) - int championSum = result[0] + result[1]; + int championSum = resultNumbers.get(0) + resultNumbers.get(1); // 判断冠亚单双 String GD2 = (championSum % 2 == 0) ? "冠亚双" : "冠亚单"; @@ -130,15 +130,15 @@ public class HttpClientExample { // 计算龙虎(1-5位对比) List GLH_result = new ArrayList<>(); for (int i = 0; i < 5; i++) { - if (result[i] > result[9 - i]) { + if (resultNumbers.get(i) > resultNumbers.get(9 - i)) { GLH_result.add("龙"); } else { GLH_result.add("虎"); } } - // 构建转换后的map - map.put("result", result); + // 构建转换后的map,使用List作为result + map.put("result", resultNumbers); map.put("sum1", sum1); map.put("sum2", sum2); map.put("winner", winner); @@ -152,31 +152,6 @@ public class HttpClientExample { } } } - - // 打印转换后的结果列表 - System.out.println("Total records: " + resultList.size()); - - // 使用ObjectMapper将结果列表转换为JSON格式输出 - ObjectMapper outputMapper = new ObjectMapper(); - String jsonOutput = outputMapper.writerWithDefaultPrettyPrinter().writeValueAsString(resultList); - System.out.println(jsonOutput); - - // 或者以自定义格式输出(可选) - System.out.println("\n=== 转换后的数据格式 ==="); - for (Map map : resultList) { - System.out.println("{"); - System.out.println(" \"result\" : " + Arrays.toString((int[]) map.get("result")) + ","); - System.out.println(" \"sum1\" : " + map.get("sum1") + ","); - System.out.println(" \"sum2\" : " + map.get("sum2") + ","); - System.out.println(" \"winner\" : " + map.get("winner") + ","); - System.out.println(" \"GD2\" : \"" + map.get("GD2") + "\","); - System.out.println(" \"GD1\" : \"" + map.get("GD1") + "\","); - System.out.println(" \"GLH_result\" : " + map.get("GLH_result") + ","); - System.out.println(" \"id\" : \"" + map.get("id") + "\","); - System.out.println(" \"time\" : \"" + map.get("time") + "\""); - System.out.println("},"); - } - } catch (Exception e) { e.printStackTrace(); } @@ -184,6 +159,112 @@ public class HttpClientExample { } + /*public static List> getPksHistoryList(){ + List> resultList = new ArrayList<>(); + String todayDate = DateUtils.getTodayDate(); + try { + String url = "https://api.api168168.com/pks/getPksHistoryList.do?lotCode=10058&"+todayDate; + + // 移除代理设置,直接创建连接 + HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Origin", "https://xy678kjw.com"); + conn.setRequestProperty("Referer", "https://xy678kjw.com/"); + conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36"); + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000); + + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + // 使用Jackson解析JSON + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(response.toString()); + + // 检查是否成功 + int errorCode = rootNode.get("errorCode").asInt(); + if (errorCode == 0) { + // 获取data数组 + JsonNode dataArray = rootNode + .get("result") + .get("data"); + + if (dataArray.isArray()) { + for (JsonNode item : dataArray) { + Map map = new HashMap<>(); + + // 解析原始数据 + String preDrawCode = item.get("preDrawCode").asText(); + String[] codeArray = preDrawCode.split(","); + + // 转换为List + List resultNumbers = new ArrayList<>(); + for (String code : codeArray) { + resultNumbers.add(Integer.parseInt(code.trim())); + } + + // 计算sum1和sum2 + int sum1 = 0; + int sum2 = 0; + for (int i = 0; i < 5; i++) { + sum1 += resultNumbers.get(i); + } + for (int i = 5; i < 10; i++) { + sum2 += resultNumbers.get(i); + } + + // 计算winner(前五个号码的和) + int winner = sum1; + + // 计算冠亚和(前两个号码的和) + int championSum = resultNumbers.get(0) + resultNumbers.get(1); + + // 判断冠亚单双 + String GD2 = (championSum % 2 == 0) ? "冠亚双" : "冠亚单"; + + // 判断冠亚大小(冠亚和11为大,11为小) + String GD1 = (championSum > 11) ? "冠亚大" : "冠亚小"; + if (championSum == 11) { + GD1 = "冠亚小"; // 特殊处理:和值为11算小 + } + + // 计算龙虎(1-5位对比) + List GLH_result = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + if (resultNumbers.get(i) > resultNumbers.get(9 - i)) { + GLH_result.add("龙"); + } else { + GLH_result.add("虎"); + } + } + + // 构建转换后的map,使用List作为result + map.put("result", resultNumbers); + map.put("sum1", sum1); + map.put("sum2", sum2); + map.put("winner", winner); + map.put("GD2", GD2); + map.put("GD1", GD1); + map.put("GLH_result", GLH_result); + map.put("id", String.valueOf(item.get("preDrawIssue").asLong())); + map.put("time", item.get("preDrawTime").asText()); + + resultList.add(map); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return resultList; + }*/ + + public static void writeToJsonFile(List> resultList,String pypath) { try { // 创建 ObjectMapper 实例