From 20d7538333fe03451dc17cf417d893c1770bcef0 Mon Sep 17 00:00:00 2001
From: xuelijun <977662702@qq.com>
Date: Wed, 21 Jan 2026 13:40:15 +0800
Subject: [PATCH] =?UTF-8?q?=E7=88=AC=E8=99=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 23 +
.../tem/bocai/controller/LoginCrawler.java | 29 ++
.../tem/bocai/controller/TestController.java | 7 +-
.../com/tem/bocai/service/LoginService.java | 10 +
.../bocai/service/impl/LoginServiceImpl.java | 410 ++++++++++++++++++
.../com/tem/bocai/util/ImageOcrService.java | 240 +++++++++-
.../java/com/tem/bocai/util/ImageTest.java | 2 +-
.../tem/bocai/util/LotteryDataPipeline.java | 29 ++
.../bocai/util/LotteryWebMagicCrawler.java | 277 ++++++++++++
.../com/tem/bocai/util/TokenCacheManager.java | 217 +++++++++
10 files changed, 1233 insertions(+), 11 deletions(-)
create mode 100644 src/main/java/com/tem/bocai/controller/LoginCrawler.java
create mode 100644 src/main/java/com/tem/bocai/service/LoginService.java
create mode 100644 src/main/java/com/tem/bocai/service/impl/LoginServiceImpl.java
create mode 100644 src/main/java/com/tem/bocai/util/LotteryDataPipeline.java
create mode 100644 src/main/java/com/tem/bocai/util/LotteryWebMagicCrawler.java
create mode 100644 src/main/java/com/tem/bocai/util/TokenCacheManager.java
diff --git a/pom.xml b/pom.xml
index 0710c2a..44d7c7c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,29 @@
tess4j
5.18.0
+
+
+ us.codecraft
+ webmagic-core
+ 1.0.3
+
+
+
+ us.codecraft
+ webmagic-extension
+ 1.0.3
+
+
+
+ com.alibaba
+ fastjson
+ 2.0.46
+
+
diff --git a/src/main/java/com/tem/bocai/controller/LoginCrawler.java b/src/main/java/com/tem/bocai/controller/LoginCrawler.java
new file mode 100644
index 0000000..3e19e89
--- /dev/null
+++ b/src/main/java/com/tem/bocai/controller/LoginCrawler.java
@@ -0,0 +1,29 @@
+package com.tem.bocai.controller;
+
+import com.tem.bocai.service.LoginService;
+import com.tem.bocai.util.ImageOcrService;
+import net.sourceforge.tess4j.TesseractException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+@RestController
+public class LoginCrawler {
+
+ private final LoginService loginService;
+
+ // 构造函数注入
+ public LoginCrawler(LoginService loginService) {
+ this.loginService = loginService;
+ }
+ @GetMapping("/ocr/login")
+ public ResponseEntity ocrLocalImage(String username, String password,String loginUrl,Integer winNum,Integer loseNum) throws IOException, TesseractException {
+ String result = loginService.loginAutomatic(username,password,loginUrl,winNum,loseNum);
+ return ResponseEntity.ok(result);
+ }
+
+}
+
+
diff --git a/src/main/java/com/tem/bocai/controller/TestController.java b/src/main/java/com/tem/bocai/controller/TestController.java
index 1b1a7d9..345a55a 100644
--- a/src/main/java/com/tem/bocai/controller/TestController.java
+++ b/src/main/java/com/tem/bocai/controller/TestController.java
@@ -29,9 +29,10 @@ public class TestController {
}
@GetMapping("/ocr/remote")
- public ResponseEntity ocrRemoteImage(String imageUrl) throws IOException, TesseractException {
-
- String result = imageOcrService.ocrRemoteImage(imageUrl);
+ public ResponseEntity ocrRemoteImage(String imageUrl) throws IOException, TesseractException, InterruptedException {
+ imageUrl = "https://4701268539-esh.qdk63ayw8g.com/code";
+ String result = imageOcrService.ocrRemoteImage();
+ System.out.println("++++"+result);
return ResponseEntity.ok(result);
}
}
diff --git a/src/main/java/com/tem/bocai/service/LoginService.java b/src/main/java/com/tem/bocai/service/LoginService.java
new file mode 100644
index 0000000..496828d
--- /dev/null
+++ b/src/main/java/com/tem/bocai/service/LoginService.java
@@ -0,0 +1,10 @@
+package com.tem.bocai.service;
+
+public interface LoginService {
+
+
+ String loginAutomatic(String username, String password,String loginUrl,Integer winNum,Integer loseNum);
+
+ //获取token
+ String getToken(String username, String password, String loginUrl);
+}
diff --git a/src/main/java/com/tem/bocai/service/impl/LoginServiceImpl.java b/src/main/java/com/tem/bocai/service/impl/LoginServiceImpl.java
new file mode 100644
index 0000000..5dc4fef
--- /dev/null
+++ b/src/main/java/com/tem/bocai/service/impl/LoginServiceImpl.java
@@ -0,0 +1,410 @@
+package com.tem.bocai.service.impl;
+
+import com.tem.bocai.service.LoginService;
+import com.tem.bocai.util.LotteryDataPipeline;
+import com.tem.bocai.util.LotteryWebMagicCrawler;
+import org.springframework.stereotype.Service;
+import net.sourceforge.tess4j.Tesseract;
+import net.sourceforge.tess4j.TesseractException;
+import org.apache.http.Header;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.CookieStore;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.BasicCookieStore;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.cookie.Cookie;
+import us.codecraft.webmagic.Spider;
+
+@Service
+public class LoginServiceImpl implements LoginService {
+ private static final String BASE_URL = "https://4701268539-esh.qdk63ayw8g.com";
+ private static final int MAX_RETRY = 5;
+ @Autowired
+ private Tesseract tesseract;
+
+ @Override
+ public String loginAutomatic(String username, String password, String loginUrl, Integer winNum, Integer loseNum) {
+ String token = "";
+ for (int attempt = 1; attempt <= MAX_RETRY; attempt++) {
+ System.out.println("\n=== 第 " + attempt + " 次尝试 ===");
+ try {
+ token = attemptLogin();
+ if (token != null && !token.isEmpty()) {
+ // 2. 创建爬虫实例,传入token
+ LotteryWebMagicCrawler crawler = new LotteryWebMagicCrawler(token);
+
+ // 3. 创建数据处理器
+ LotteryDataPipeline pipeline = new LotteryDataPipeline();
+ // 4. 执行爬虫
+ String url = "https://4701268539-esh.qdk63ayw8g.com/member/dresult?lottery=SGFT&date=2026-01-18";
+
+ Spider.create(crawler)
+ .addUrl(url)
+ .addPipeline(pipeline)
+ .thread(1)
+ .run();
+
+ // 5. 返回爬取的数据
+ List