`

java模拟浏览器截取指定大小的验证码图片

    博客分类:
  • java
阅读更多
应用场景: 识别网页验证码,破解并登陆页面
难点:验证码直接下载的话会造成下载的图片和网站的图片不一致, 原因(验证码的图片地址访问一次就会随机生成一个验证码),所以我采用模拟器截图的方式


代码:

package com.teamdev.jxbrowser.chromium.demoJD.yyzz;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.BrowserPreferences;
import com.teamdev.jxbrowser.chromium.JSValue;
import com.teamdev.jxbrowser.chromium.LoggerProvider;
import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent;
import com.teamdev.jxbrowser.chromium.events.LoadAdapter;
import com.teamdev.jxbrowser.chromium.swing.BrowserView;

public class saveImage {

private static final Color White = null;

public static void main(String[] args) {
LoggerProvider.getBrowserLogger().setLevel(Level.SEVERE);
LoggerProvider.getIPCLogger().setLevel(Level.SEVERE);
LoggerProvider.getChromiumProcessLogger().setLevel(Level.SEVERE);

Browser browser = new Browser();

BrowserView view = new BrowserView(browser);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(view, BorderLayout.CENTER);
frame.setSize(700, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
BrowserPreferences preferences = browser.getPreferences();
preferences.setImagesEnabled(false);

int viewWidth = 1280;
int viewHeight = 1000;
// Resize view to the required size
view.setBounds(new Rectangle(viewWidth, viewHeight));
// Wait until web page is loaded completely
invokeAndWaitReady(browser,new jd_yyzz().new ViewThread(browser, "https://mall.jd.com/showLicence-652046.html"));

JSValue bodyHeight = null;
int firstHeight = 400;
int nowHeight = 400;

while (firstHeight != nowHeight) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
firstHeight = nowHeight;

bodyHeight = browser.executeJavaScriptAndReturnValue("document.body.scrollHeight");
//nowHeight = 900;
for (int i = firstHeight; i < nowHeight; i = i + 300) {
browser.executeJavaScriptAndReturnValue("window.scrollTo(0,"+ i + ")");
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
System.out.println(firstHeight + ":" + nowHeight);
}
viewHeight = nowHeight + 50;
view.setBounds(new Rectangle(viewWidth, viewHeight));
System.out.println("高度:" + viewHeight);
try {
Thread.sleep(1000 * 1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
bodyHeight = browser.executeJavaScriptAndReturnValue("document.body.scrollHeight");
System.out.println("高度------------------:" + bodyHeight);
int viewHeight_new = ((Number) bodyHeight.getNumber()).intValue() + 50;
if (viewHeight_new > viewHeight) {
System.out.println("新高度------------------:" + viewHeight_new);
}
Image image = view.getImage();
BufferedImage bufferedImage = new BufferedImage(100, 50,BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();
Double scale = 1.0 / view.getDeviceScaleFactor();
graphics.scale(scale, scale);
graphics.drawImage(image,-585, -355, image.getWidth(view), image.getHeight(view),White, null);
try {
String path = "f://shopdetails.jpg";
ImageIO.write(bufferedImage, "JPG", new File(path));
bufferedImage = null;
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 线程
* */
class ViewThread extends Thread {
Browser browser;
String openUrl;

public ViewThread(Browser browser, String openUrl) {
this.browser = browser;
this.openUrl = openUrl;
}

public void run() {

browser.loadURL(openUrl);

}
}

/**
* 模拟器加载url
* */
public static void invokeAndWaitReady(Browser browser, Runnable runnable) {
final CountDownLatch latch = new CountDownLatch(1);
LoadAdapter listener = new LoadAdapter() {
@Override
public void onFinishLoadingFrame(FinishLoadingEvent event) {
if (event.isMainFrame()) {
latch.countDown();
}
}
};
browser.addLoadListener(listener);
try {
runnable.run();
try {
if (!latch.await(60, TimeUnit.SECONDS)) {
// throw new RuntimeException(new TimeoutException());
}
} catch (InterruptedException ignore) {
ignore.printStackTrace();
Thread.currentThread().interrupt();
}
} finally {
browser.removeLoadListener(listener);
}
}
}
分享到:
评论

相关推荐

    java使用Selenium模拟登陆58(验证码登陆&密码登陆)若快平台识别文字点击验证码Demo

    首先,我们需要在Selenium中截取验证码图片,然后上传到若快平台,获取识别出的文字,最后将识别结果填入验证码输入框。 5. **密码登录**: 对于普通的密码登录,Selenium可以直接找到密码输入框,通过`sendKeys()`...

    java-Browser模拟器登录12315

    12315是中国消费者权益保护的官方网站,提供投诉举报服务,而使用Java模拟浏览器进行登录,可以帮助开发者自动化处理与该网站的交互,例如批量提交投诉信息或者进行系统测试。 首先,我们要理解Java中实现浏览器...

    python+Pyppeteer+SpringBoot验证码自动识别登录(文末附源码)

    2. **图像处理**:使用图像处理库,如OpenCV或JavaCV,对验证码图片进行预处理,如灰度化、二值化等,以提高OCR识别的准确性。 3. **验证码识别**:调用OCR库,如Tesseract的Java API,进行字符识别,并返回识别结果...

    JAVA 范例大全 光盘 资源

    JAVA 范例大全 光盘 资源 书籍目录: 前言. 第1章 开发环境搭建 1 实例1 下载、安装并配置JDK 1 实例2 第一个Java程序 3 实例3 在Eclipse中创建第一个Java程序 4 常见问题 javac不是内部或者外部命令 6 常见...

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    java范例开发大全

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    Java范例开发大全 (源程序)

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7...

    java范例开发大全(pdf&源码)

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    Java范例开发大全(全书源程序)

    Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...

    网页插件虚拟键盘

    【网页插件虚拟键盘】是一种基于Java、JavaScript和CSS技术实现的交互式组件,它允许用户在网页上模拟物理键盘输入,通常用于增强网站的安全性,尤其是在涉及敏感信息输入(如密码、验证码)的场景下。这样的插件...

    selenium+sikuli使用及演示例子

    这时,我们可以先用Sikuli截取滑块的初始和终点状态的图片,然后在测试脚本中,让Sikuli找到滑块并模拟用户的滑动动作。这样,即使是最复杂的交互也能得到准确的模拟和测试。 在提供的压缩包文件"**selenium+sikuli...

    小米2019秋招前端开发笔试题(2).docx

    存储在cookie中的图形验证码容易被截取,同样降低了安全性。 - c. 由服务器端保存文本验证码并在登录时验证是最常见的安全实践。 - d. 浏览器无法直接识别图形验证码中的内容,这需要由服务器端验证。 #### 9. ...

    爬虫功能实现

    爬虫程序可以模拟浏览器的行为,自动浏览网络页面,提取页面中的有用信息,并将其保存到本地文件中。 爬虫功能实现的重要性体现在以下几个方面: 1. 数据采集:爬虫可以自动采集网络中的数据,例如新闻、商品信息...

Global site tag (gtag.js) - Google Analytics