1. 引言
12306是中国铁路客户服务中心的官方网站,用于购买火车票。为了防止机器恶意刷票,12306在登录和购票时需要用户输入验证码。本文将介绍如何使用Java实现自动识别12306图片验证码的代码。
2. 准备工作
首先,我们需要准备以下工具和库:
- Java开发环境
- Tesseract OCR引擎(用于文字识别)
- Selenium WebDriver(用于模拟浏览器行为)
3. 获取验证码图片
使用Selenium WebDriver打开12306登录页面,并找到验证码图片元素,将其保存为本地图片文件。
```java
WebDriver driver = new ChromeDriver();
driver.get("https://kyfw.12306.cn/otn/login/init");
WebElement captchaImage = driver.findElement(By.id("captchaImg"));
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("captcha.png"));
```
4. 预处理验证码图片
对验证码图片进行预处理,提高后续文字识别的准确性。可以使用图像处理库,如OpenCV,进行灰度化、去噪等操作。
```java
Mat image = Imgcodecs.imread("captcha.png", Imgcodecs.IMREAD_GRAYSCALE);
Imgproc.GaussianBlur(image, image, new Size(3, 3), 0);
Imgproc.adaptiveThreshold(image, image, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 11, 4);
Imgcodecs.imwrite("processed_captcha.png", image);
```
5. 文字识别
使用Tesseract OCR引擎对预处理后的验证码图片进行文字识别。
```java
Tesseract tesseract = new Tesseract();
tesseract.setDatapath("/path/to/tessdata"); // 设置tessdata路径
String captchaText = tesseract.doOCR(new File("processed_captcha.png"));
```
6. 输入验证码并提交
将识别出的验证码文本输入到验证码输入框,并提交表单。
```java
WebElement captchaInput = driver.findElement(By.id("captcha_input"));
captchaInput.sendKeys(captchaText);
WebElement submitButton = driver.findElement(By.id("submit_button"));
submitButton.click();
```
7. 完整代码示例
下面是完整的自动识别12306图片验证码的Java代码示例:
```java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.io.FileHandler;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;
import java.io.IOException;
public class CaptchaRecognition {
public static void main(String[] args) throws IOException, TesseractException {
// 设置ChromeDriver路径
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
// 创建一个Chrome浏览器实例
WebDriver driver = new ChromeDriver();
// 打开12306登录页面
driver.get("https://kyfw.12306.cn/otn/login/init");
// 获取验证码图片元素并保存为本地图片文件
WebElement captchaImage = driver.findElement(By.id("captchaImg"));
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileHandler.copy(screenshot, new File("captcha.png"));
// 对验证码图片进行预处理
Mat image = Imgcodecs.imread("captcha.png", Imgcodecs.IMREAD_GRAYSCALE);
Imgproc.GaussianBlur(image, image, new Size(3, 3), 0);
Imgproc.adaptiveThreshold(image, image, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 11, 4);
Imgcodecs.imwrite("processed_captcha.png", image);
// 使用Tesseract OCR引擎进行文字识别
Tesseract tesseract = new Tesseract();
tesseract.setDatapath("/path/to/tessdata"); // 设置tessdata路径
String captchaText = tesseract.doOCR(new File("processed_captcha.png"));
// 输入验证码并提交表单
WebElement captchaInput = driver.findElement(By.id("captcha_input"));
captchaInput.sendKeys(captchaText);
WebElement submitButton = driver.findElement(By.id("submit_button"));
submitButton.click();
}
}
```
8. 总结
本文介绍了使用Java实现自动识别12306图片验证码的代码。通过使用Selenium WebDriver进行页面操作,结合Tesseract OCR引擎进行文字识别,可以实现自动化的验证码识别和提交操作。此代码示例仅供参考,实际使用中需根据具体情况进行适当的调整和优化。