From 4c2fe1d2a184c7f30aabe571941371a537d4fc2f Mon Sep 17 00:00:00 2001 From: liwq <122639653@qq.com> Date: Sat, 31 Jan 2026 17:14:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bocai.db | Bin 458752 -> 487424 bytes frontend/src/components/index.vue | 22 +++++- .../java/com/tem/bocai/BocaiApplication.java | 2 +- .../java/com/tem/bocai/config/TessConfig.java | 3 +- .../com/tem/bocai/schedules/BetSchedule.java | 42 ++++++----- .../bocai/schedules/ExBetScriptSchedule.java | 65 ++++++++---------- .../com/tem/bocai/util/TokenCacheService.java | 16 ++++- 7 files changed, 88 insertions(+), 62 deletions(-) diff --git a/bocai.db b/bocai.db index 19ba48ec1c9536726954865c7a7d41dfab9acc06..2dccf35cf3c08c9b7a56cc88b3ed7b1bb180f5ab 100644 GIT binary patch delta 23131 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'; + params.forEach(function(item) { + let value = item.value; + let color = item.color; + let status = value >= 0 ? '盈利' : '亏损'; + let statusColor = value >= 0 ? '#4CAF50' : '#ff6b6b'; + result += ''; + result += item.seriesName + ': '; + result += '' + value + ' '; + result += '(' + status + ')
'; + }); + return result; + } }, legend: { data: ['数据'], diff --git a/src/main/java/com/tem/bocai/BocaiApplication.java b/src/main/java/com/tem/bocai/BocaiApplication.java index 6806c08..6c3d2d3 100644 --- a/src/main/java/com/tem/bocai/BocaiApplication.java +++ b/src/main/java/com/tem/bocai/BocaiApplication.java @@ -18,7 +18,7 @@ public class BocaiApplication { // // 依次执行三个任务 // // 1. 执行CrawlerSchedule方法 - System.out.println("\n=== 开始执行CrawlerSchedule任务 ==="); +// System.out.println("\n=== 开始执行CrawlerSchedule任务 ==="); // CrawlerSchedule crawlerSchedule = context.getBean(CrawlerSchedule.class); // crawlerSchedule.executeLotteryDraw(); // diff --git a/src/main/java/com/tem/bocai/config/TessConfig.java b/src/main/java/com/tem/bocai/config/TessConfig.java index d685f2c..b94a923 100644 --- a/src/main/java/com/tem/bocai/config/TessConfig.java +++ b/src/main/java/com/tem/bocai/config/TessConfig.java @@ -12,7 +12,8 @@ public class TessConfig { Tesseract instance = new Tesseract(); instance.setLanguage("oci"); // 设置语言包,这里使用英语 - instance.setDatapath("tessdata"); // 设置语言包路径 + instance.setDatapath("src/main/resources/tessdata"); // 设置语言包路径 +// instance.setDatapath("tessdata"); // 设置语言包路径 return instance; } } diff --git a/src/main/java/com/tem/bocai/schedules/BetSchedule.java b/src/main/java/com/tem/bocai/schedules/BetSchedule.java index b51e1fd..205a6a0 100644 --- a/src/main/java/com/tem/bocai/schedules/BetSchedule.java +++ b/src/main/java/com/tem/bocai/schedules/BetSchedule.java @@ -41,7 +41,7 @@ public class BetSchedule { private BetRecordRepository betRecordRepository; // 从7:02分钟起每5分钟执行一次 -// @Scheduled(cron = "30 2/5 * * * ?") + @Scheduled(cron = "30 2/5 * * * ?") public void placeBet() { LocalDateTime now = LocalDateTime.now(); int hour = now.getHour(); @@ -53,7 +53,7 @@ public class BetSchedule { String currentTime = now.format( DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ); - System.out.println(currentTime + " - 不在投注时间范围内,跳过执行"); + log.info("{}", currentTime + " - 不在投注时间范围内,跳过执行"); return; } @@ -64,13 +64,13 @@ public class BetSchedule { LoginInfoResult loginInfo = loginInfoRepository.findFirstByOrderByCreateTimeDesc().orElse(null); if (loginInfo == null) { - System.out.println(currentTime + " - 未找到登录信息,跳过执行"); + log.info("{}", currentTime + " - 未找到登录信息,跳过执行"); return; } // 检查onOff字段是否为1(开启状态) if (loginInfo.getOnOff() != 1) { - System.out.println(currentTime + " - 投注功能未开启,跳过执行"); + log.info("{}", currentTime + " - 投注功能未开启,跳过执行"); return; } @@ -84,34 +84,33 @@ public class BetSchedule { if (startTime != null) { Double totalResultAmount = completedTodayRepository.sumResultAmountByCreateTimeAfter(startTime); if (totalResultAmount != null) { - System.out.println(" - 今日盈亏总和: " + totalResultAmount); + log.info(" - 今日盈亏总和: {}", totalResultAmount); // 判断是否达到止盈点 if (totalResultAmount >= winNum) { - System.out.println(currentTime + " - 已达到止盈点 " + winNum + ",跳过执行"); + log.info("{}", currentTime + " - 已达到止盈点 " + winNum + ",跳过执行"); return; } // 判断是否达到止亏点 if (totalResultAmount <= -loseNum) { - System.out.println(currentTime + " - 已达到止亏点 " + loseNum + ",跳过执行"); + log.info("{}", currentTime + " - 已达到止亏点 " + loseNum + ",跳过执行"); return; } } } } - System.out.println(currentTime + " - 开始执行投注..."); + log.info("{}", currentTime + " - 开始执行投注..."); try { // 执行投注逻辑 executeBet(loginInfo); - System.out.println(currentTime + " - 投注执行完成"); + log.info("{}", currentTime + " - 投注执行完成"); } catch (Exception e) { - System.err.println(currentTime + " - 投注执行失败:"); - e.printStackTrace(); + log.error("{} - 投注执行失败:", currentTime, e); } } @@ -130,7 +129,7 @@ public class BetSchedule { LocalDateTime now = LocalDateTime.now(); // 2. 从BetRecord中获取第一条记录(根据betTime排序) - System.out.println(" - 从BetRecord中获取第一条记录..."); + log.info(" - 从BetRecord中获取第一条记录..."); Optional optionalBetRecord = betRecordRepository.findFirstByOrderByBetTimeDesc(); if (optionalBetRecord.isPresent()) { @@ -138,30 +137,29 @@ public class BetSchedule { String betData = betRecord.getBetData(); String betTime = betRecord.getBetTime(); - System.out.println(" - 投注时间: " + betTime); - System.out.println(" - 投注数据: " + betData); + log.info(" - 投注时间: {}", betTime); + log.info(" - 投注数据: {}", betData); // 调用投注接口 - System.out.println(" - 提交投注..."); + log.info(" - 提交投注..."); String betResult = callBetApi(betData, null); - System.out.println(" - 投注结果: " + betResult); + log.info(" - 投注结果: {}", betResult); // 记录投注结果 - System.out.println(" - 记录投注结果..."); + log.info(" - 记录投注结果..."); recordBetResult(betData, betResult); // 投注成功后删除BetRecord记录 if (betResult == null) { betRecordRepository.delete(betRecord); - System.out.println(" - 已删除投注记录,期数: " + betRecord.getBetNum()); + log.info(" - 已删除投注记录,期数: {}", betRecord.getBetNum()); } } else { - System.out.println(" - 未找到投注记录"); + log.info(" - 未找到投注记录"); } } catch (Exception e) { - System.err.println(" - 投注执行失败:"); - e.printStackTrace(); + log.error(" - 投注执行失败:", e); } } @@ -207,6 +205,6 @@ public class BetSchedule { // 这里可以实现将投注结果记录到数据库或日志文件的逻辑 // 为了简单起见,我们这里只打印日志 String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - System.out.println(" - 投注记录: [" + currentTime + "] 数据: " + betData + ", 结果: " + betResult); + log.info(" - 投注记录: [{}] 数据: {}, 结果: {}", currentTime, betData, betResult); } } diff --git a/src/main/java/com/tem/bocai/schedules/ExBetScriptSchedule.java b/src/main/java/com/tem/bocai/schedules/ExBetScriptSchedule.java index 90ddd98..8c6a7b6 100644 --- a/src/main/java/com/tem/bocai/schedules/ExBetScriptSchedule.java +++ b/src/main/java/com/tem/bocai/schedules/ExBetScriptSchedule.java @@ -2,6 +2,7 @@ package com.tem.bocai.schedules; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; import org.json.JSONArray; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; @@ -31,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired; /** * 执行预测脚本 */ +@Slf4j @Component public class ExBetScriptSchedule { @@ -48,13 +50,13 @@ public class ExBetScriptSchedule { try { File currentDataDir = new File(pypath, "current_data"); if (!currentDataDir.exists() || !currentDataDir.isDirectory()) { - System.out.println("current_data目录不存在"); + log.info("current_data目录不存在"); return false; } File[] files = currentDataDir.listFiles(); if (files == null || files.length == 0) { - System.out.println("current_data目录为空"); + log.info("current_data目录为空"); return false; } @@ -75,7 +77,7 @@ public class ExBetScriptSchedule { } if (latestFile == null) { - System.out.println("未找到JSON文件"); + log.info("未找到JSON文件"); return false; } @@ -88,19 +90,15 @@ public class ExBetScriptSchedule { LocalDateTime fiveMinutesAgo = now.minusMinutes(5); if (fileModifiedTime.isAfter(fiveMinutesAgo)) { - System.out.println("发现新数据文件: " + latestFile.getName() + - ", 修改时间: " + fileModifiedTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + log.info("发现新数据文件: {}, 修改时间: {}", latestFile.getName(), fileModifiedTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); return true; } else { - System.out.println("最新数据文件: " + latestFile.getName() + - ", 修改时间: " + fileModifiedTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + - ", 超过5分钟,跳过执行"); + log.info("最新数据文件: {}, 修改时间: {}, 超过5分钟,跳过执行", latestFile.getName(), fileModifiedTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); return false; } } catch (Exception e) { - System.err.println("检查新数据时发生错误:"); - e.printStackTrace(); + log.error("检查新数据时发生错误:", e); return false; } } @@ -127,7 +125,7 @@ public class ExBetScriptSchedule { } // 从7:01分钟起每5分钟执行一次 -// @Scheduled(cron = "30 1/5 * * * ?") + @Scheduled(cron = "30 1/5 * * * ?") public void executePythonScript() { LocalDateTime now = LocalDateTime.now(); int hour = now.getHour(); @@ -138,17 +136,17 @@ public class ExBetScriptSchedule { String currentTime = now.format( DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ); - System.out.println(currentTime + " - 不在投注时间范围内,跳过执行"); + log.info("{}", currentTime + " - 不在投注时间范围内,跳过执行"); return; } // 检查PyModel/current_data目录下最新的文件是否存在新数据 if (!checkNewDataExists()) { - System.out.println("未发现新数据,跳过执行Python脚本"); + log.info("未发现新数据,跳过执行Python脚本"); return; } - System.out.println("开始执行Python脚本..."); + log.info("开始执行Python脚本..."); // 获取当前时间,格式化为yyyy-MM-dd HH:mm:ss String currentTime = java.time.LocalDateTime.now().format( @@ -186,12 +184,12 @@ public class ExBetScriptSchedule { } } - System.out.println("执行命令: " + String.join(" ", command)); + log.info("执行命令: {}", String.join(" ", command)); // 创建ProcessBuilder并设置工作目录为PyModel ProcessBuilder pb = new ProcessBuilder(command); // 设置工作目录为PyModel - pb.directory(new java.io.File("PyModel")); + pb.directory(new java.io.File(pypath)); // 执行Python脚本 Process process = pb.start(); @@ -220,18 +218,17 @@ public class ExBetScriptSchedule { // 等待脚本执行完成 int exitCode = process.waitFor(); - System.out.println("Python脚本执行完成,退出码: " + exitCode); - System.out.println("脚本输出:\n" + output.toString()); + log.info("Python脚本执行完成,退出码: {}", exitCode); + log.info("脚本输出:\n{}", output.toString()); if (exitCode != 0) { - System.err.println("脚本执行错误:\n" + errorOutput.toString()); + log.error("脚本执行错误:\n{}", errorOutput.toString()); } else { parseScriptOutput(output.toString()); } } catch (IOException | InterruptedException e) { - System.err.println("执行Python脚本时发生错误:"); - e.printStackTrace(); + log.error("执行Python脚本时发生错误:", e); } } @@ -241,16 +238,16 @@ public class ExBetScriptSchedule { */ private void parseScriptOutput(String output) { try { - System.out.println("开始解析脚本输出..."); + log.info("开始解析脚本输出..."); JSONObject jsonOutput = JSON.parseObject(output); if (jsonOutput == null) { - System.out.println("输出为空或无法解析为JSON"); + log.info("输出为空或无法解析为JSON"); return; } JSONObject result = jsonOutput.getJSONObject("result"); if (result == null) { - System.out.println("未找到result字段"); + log.info("未找到result字段"); return; } @@ -274,20 +271,19 @@ public class ExBetScriptSchedule { } } if (!validResults.isEmpty()) { - System.out.println("提取到的有效预测结果:"); + log.info("提取到的有效预测结果:"); for (Map.Entry> entry : validResults.entrySet()) { - System.out.println("位置 " + entry.getKey() + ": " + entry.getValue()); + log.info("位置 {}: {}", entry.getKey(), entry.getValue()); } // 生成符合test.json格式的数据 generateOutputData(validResults); } else { - System.out.println("未找到有效的预测结果(所有值均为None)"); + log.info("未找到有效的预测结果(所有值均为None)"); } } catch (Exception e) { - System.err.println("解析脚本输出时发生错误:"); - e.printStackTrace(); + log.error("解析脚本输出时发生错误:", e); } } @@ -367,8 +363,8 @@ public class ExBetScriptSchedule { outputData.put("fastBets", false); outputData.put("ignore", false); - System.out.println("生成的输出数据:"); - System.out.println(outputData.toString(2)); + log.info("生成的输出数据:"); + log.info("{}", outputData.toString(2)); // 保存到数据库 try { @@ -383,13 +379,12 @@ public class ExBetScriptSchedule { // 检查betNum是否已存在,避免重复保存 if (!betRecordRepository.existsByBetNum(drawNumber)) { betRecordRepository.save(betRecord); - System.out.println("保存投注记录到数据库成功,期数: " + drawNumber); + log.info("保存投注记录到数据库成功,期数: {}", drawNumber); } else { - System.out.println("投注记录已存在,期数: " + drawNumber); + log.info("投注记录已存在,期数: {}", drawNumber); } } catch (Exception e) { - System.err.println("保存投注记录到数据库失败:"); - e.printStackTrace(); + log.error("保存投注记录到数据库失败:", e); } } } diff --git a/src/main/java/com/tem/bocai/util/TokenCacheService.java b/src/main/java/com/tem/bocai/util/TokenCacheService.java index 869eaad..13bd9f4 100644 --- a/src/main/java/com/tem/bocai/util/TokenCacheService.java +++ b/src/main/java/com/tem/bocai/util/TokenCacheService.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; import org.apache.http.Header; +import org.apache.http.HttpHost; import org.apache.http.NameValuePair; import org.apache.http.client.CookieStore; import org.apache.http.client.config.RequestConfig; @@ -372,8 +373,16 @@ public class TokenCacheService { // 等待一下再发送登录请求 Thread.sleep(1500 + (long) (Math.random() * 1000)); + // 新增代码:增加代理 + String proxyHost = "127.0.0.1"; + int proxyPort = 7890; + HttpHost proxy = new HttpHost(proxyHost, proxyPort); + RequestConfig proxyConfig = RequestConfig.custom() + .setProxy(proxy) + .build(); HttpPost loginPost = createLoginRequest(code,loginInfoParam); - + // 新增代码:将代理类放入配置中 + loginPost.setConfig(proxyConfig); try (CloseableHttpResponse loginResponse = httpClient.execute(loginPost)) { return processLoginResponse(loginResponse, cookieStore); } @@ -383,13 +392,16 @@ public class TokenCacheService { * 创建登录请求 */ private HttpPost createLoginRequest(String code,LoginInfoParam loginInfoParam) throws UnsupportedEncodingException { + + + HttpPost loginPost = new HttpPost(loginInfoParam.loginUrl + "/login"); + // 设置请求头 setCommonHeaders(loginPost); loginPost.setHeader("Referer", loginInfoParam.loginUrl + "/login"); loginPost.setHeader("Origin", loginInfoParam.loginUrl); loginPost.setHeader("Accept", "application/json, text/plain, */*"); - // 构建登录参数 List params = new ArrayList<>(); params.add(new BasicNameValuePair("type", "1"));