Java如何获取图片验证码保存

举例网站:https://my.1hai.cn/Login/?url=http://www.1hai.cn/

一、场景:出于安全性考虑,越来越多的Web平台登录都会增加图形验证码(图片),或者短信验证码。由于是图片脚本selenium是无法识别的,这是时候我们解析图片验证码。

解决思路:1.通过selenium定位到图片,把图片保存到本地。

     2 通过ORC技术将图片验证码转化为文字。

其他解决方法:A:去掉验证码

         B:设置万能码

二、Web图片验证码的实现源码:

  

 1 package util;
 2
 3 import java.awt.Color;
 4 import java.awt.Font;
 5 import java.awt.Graphics;
 6 import java.awt.image.BufferedImage;
 7 import java.io.IOException;
 8 import java.io.OutputStream;
 9 import java.util.Random;
10 import javax.imageio.ImageIO;
11
12 public class MakeCarke {
13
14     // 验证码图片中可以出现的字符集,可根据需要修改
15     private char mapTable[] = { ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘i‘,
16             ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘, ‘o‘, ‘p‘, ‘q‘, ‘r‘, ‘s‘, ‘t‘, ‘u‘, ‘v‘,
17             ‘w‘, ‘x‘, ‘y‘, ‘z‘, ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘,
18             ‘9‘ };
19
20     /** * 功能:生成彩色验证码图片 * 参数width为生成图片的宽度,参数height为生成图片的高度,参数os为页面的输出流 */
21     public String getCertPic(int width, int height, OutputStream os) {
22
23         if (width <= 0) {
24             width = 60;
25         }
26         if (height <= 0) {
27             height = 20;
28         }
29         BufferedImage image = new BufferedImage(width, height,
30                 BufferedImage.TYPE_INT_RGB);
31         // 获取图形上下文
32         Graphics g = image.getGraphics();
33         // 设定背景色
34         g.setColor(new Color(0xDCDCDC));
35         g.fillRect(0, 0, width, height);
36         // 画边框
37         g.setColor(Color.black);
38         g.drawRect(0, 0, width - 1, height - 1);
39         // 取随机产生的认证码
40         String strEnsure = "";
41         // 4代表4位验证码,如果要生成更多位的认证码,则加大数值
42         for (int i = 0; i < 4; ++i) {
43             strEnsure += mapTable[(int) (mapTable.length * Math.random())];
44         }
45         // 将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
46         g.setColor(Color.black);
47         g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
48         String str = strEnsure.substring(0, 1);
49         g.drawString(str, 8, 17);
50         str = strEnsure.substring(1, 2);
51         g.drawString(str, 20, 15);
52         str = strEnsure.substring(2, 3);
53         g.drawString(str, 35, 18);
54         str = strEnsure.substring(3, 4);
55         g.drawString(str, 45, 15);
56
57         // 随机产生10个干扰点
58         Random rand = new Random();
59         for (int i = 0; i < 10; i++) {
60             int x = rand.nextInt(width);
61             int y = rand.nextInt(height);
62             g.drawOval(x, y, 1, 1);
63         }
64         // 释放图形上下文
65         g.dispose();
66         try {
67             // 输出图像到页面
68             ImageIO.write(image, "JPEG", os);
69         } catch (IOException e) {
70             return "";
71         }
72         return strEnsure;
73
74     }
75
76 }

三、selenium+java 实现验证码图片保存

  

 1 package com.app.launch;
 2 import java.io.File;
 3 import java.awt.image.BufferedImage;
 4 import java.io.IOException;
 5
 6 import javax.imageio.ImageIO;
 7
 8 import org.apache.commons.io.FileUtils;
 9 import org.openqa.selenium.By;
10 import org.openqa.selenium.OutputType;
11 import org.openqa.selenium.TakesScreenshot;
12 import org.openqa.selenium.WebDriver;
13 import org.openqa.selenium.WebElement;
14 import org.openqa.selenium.chrome.ChromeDriver;
15
16 import com.app.utils.Utils;
17
18 public class OcrDownloadPicture {
19
20     public static void main(String[] args) throws IOException {
21
22        public void dowanLoadPictureVerificationCode() throws IOException{
23     driver.get("https://my.1hai.cn/Login/?url=http://www.1hai.cn/");
24        WebElement ele = driver.findElement(By.xpath(".//img[@id=‘quick_imgCaptcha‘]"));
25        ele.click(); 26        Utils.waitABit(2000);
27        File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
28        BufferedImage fullImg = ImageIO.read(screenshot);  // 读取截图
29        // Get the location of element on the page
30        org.openqa.selenium.Point point= ele.getLocation();
31        // Get width and height of the element
32        int eleWidth= ele.getSize().getWidth();
33        int eleHeight= ele.getSize().getHeight();
34        // Crop the entire page screenshot to get only element screenshot
35        BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), point.getY(), eleWidth, eleHeight);
36        ImageIO.write(eleScreenshot, "png", screenshot);
37        // Copy the element screenshot to disk
38        File screenshotLocation = new File("E:/Vame/img/test.jpg");
39        FileUtils.copyFile(screenshot, screenshotLocation);
40    }
41
42 }  

四、效果图

原文地址:https://www.cnblogs.com/Shanghai-vame/p/9032868.html

时间: 2024-09-29 00:37:27

Java如何获取图片验证码保存的相关文章

获取图片并保存

获取某一个网站的图片信息需要用到requests模块,所以我们需要安装requests 安装 pip install requests # 直接安装 pip install -i https://pypi.doubanio.com/simple/ requests # 指定地址安装 测试是否安装成功 import requests # 回车不报错就算安装成功 response = requests.get("https://www.baidu.com") print(response.

JAVA生成一次性图片验证码

现在很多地方都需要写验证码登录验证,这样的好处是可以减轻服务器的压力等,下面就用java实现一次性登录验证码的书写. 1.验证码生成类: package com.easyteam; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedI

java web中图片验证码功能实现

用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

java远程获取图片生成base64串

说下背景,项目中遇到前端js获取图片发生跨域的问题,服务器端又不支持匿名访问,只能通过服务器获取图片base64码进行展示.代码如下:下载 Java代码   /** * 远程读取image转换为Base64字符串 * @param imgUrl * @return */ private String Image2Base64(String imgUrl) { URL url = null; InputStream is = null; ByteArrayOutputStream outStrea

android网络获取图片并保存在本地

获取网络上的图片有三步: 一.设置连接网络的权限和写入读取SD卡的权限.二.网络访问获得数据流. 三.在SD卡中创建文件夹将数据流转成图片格式存储. 注意:response.getEntity().getContent()方法,而此方法只能调用一次.否则会报错:java.lang.IllegalStateException: Content has been consumed. manifest.xml 赋予权限,注意:在<application...>application>前添加 &

java中注册图片验证码

package org.servlet.demo; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.charset.Charset; import java.util.Random; im

iOS开发中,获取图片之后保存或下载到本地相册中

#pragma mark 先获取本地图片或者网络图片 - (void)saveHeaderImageWith:(NSString *)path { UIImage *img = [UIImage imageWithContentsOfFile:path]; //这里img也可以是从网络获取的图片 [self saveImageToPhotos:img]; } #pragma mark 保存图片 - (void)saveImageToPhotos:(UIImage*)savedImage { UI

java中获取图片文件大小

/** * 判断图片大小 * @return */ public static boolean judegImgMaxMin(String path){ boolean flog = true; File file = new File(path); DecimalFormat df = new DecimalFormat("#.00"); String str = df.format(file.length() / 1024.0); // 最大图片值为15k if (Float.pa

python获取图片验证码

一.安装linux下图片处理工具: # which tesseract/usr/bin/tesseract 二.安装python连接模块: pip install pytesseract pip install Pillow 三.进入python运行环境: 1报错: ( File "/usr/lib/python2.7/site-packages/pytesseract/pytesseract.py", line 194, in image_to_string return run_a