目标url:信用中国(广东中山)行政处罚

 /**
* base64转BufferedImage
*
* @param base64
* @return
*/
public static BufferedImage base64ToBufferedImage(String base64) {
BufferedImage ret = null;
try {
Decoder decoder = Base64.getDecoder();
ByteArrayInputStream bais = new ByteArrayInputStream(decoder.decode(base64));
ret = ImageIO.read(bais);
return ret;
} catch (IOException ex) {
Logger.getLogger(SliderUtil.class.getName()).log(Level.SEVERE, null, ex);
return ret;
}
} /**
* 获取滑块偏移距离和session
*
* @param url
* @param session
* @return
* @throws IOException
*/
public static int getDistanceAndSession(String url, StringBuffer session) throws IOException {
int ret = -1;
Gson gson = new Gson();
Connection conn = Jsoup.connect(url);
conn.method(Connection.Method.GET).timeout(10 * 1000).ignoreContentType(true).maxBodySize(0);
Response res = conn.execute();
//获取session
//先清空
session.delete(0, session.length());
session.append(res.cookie("JSESSIONID"));
HashMap<String, Object> hm = gson.fromJson(res.body(), HashMap.class);
//滑块相对于原图的y坐标偏移
int puzzleYAxis = Integer.parseInt(hm.get("puzzleYAxis").toString());
//图片的base64字符
String sourceBase64 = hm.get("sourceImg").toString().replace("\r\n", "");
String puzzleBase64 = hm.get("puzzleImg").toString().replace("\r\n", "");
//原图
BufferedImage sourceImg = base64ToBufferedImage(sourceBase64);
//滑块
BufferedImage puzzleImg = base64ToBufferedImage(puzzleBase64);
//滑块宽度
int puzzleImgWidth = puzzleImg.getWidth();
//滑块高度
int puzzleImgHeight = puzzleImg.getHeight();
//原图宽度
int width = sourceImg.getWidth();
//原图高度
int height = sourceImg.getHeight();
// //用于保存原图的rgb
// int[] rgbArray = new int[width * height];
// sourceImg.getRGB(0, 0, width, height, rgbArray, 0, width);
//保存原图待对比的rgb数组
int[] sourceImgRgbArr = new int[width * puzzleImgHeight];
//保存滑块的rgb数组
int[] puzzleImgRgbArr = new int[puzzleImgWidth * puzzleImgHeight];
//将滑块的rgb复制到rgb数组中
puzzleImg.getRGB(0, 0, puzzleImgWidth, puzzleImgHeight, puzzleImgRgbArr, 0, puzzleImgWidth);
int k = 0;
//截取与滑块等高的rgb数组
for (int i = puzzleYAxis; i < puzzleYAxis + puzzleImgHeight; i++) {
for (int j = 0; j < width; j++) {
//获取需要对比的原图rgb数组
sourceImgRgbArr[k++] = sourceImg.getRGB(j, i);
// System.out.printf("%10x", img.getRGB(j, i));
// System.out.println(k);
}
// System.out.println();
}
//记录当前比对的第几列
int index = 0;
//记录已比对的列数
int c = 0;
//总的比对列数
//只要比对六列相等,就认为找到位置
int count = 6;
//是否找到rgb相等的值
boolean isFind = false;
//比对每一列的数据
for (int i = 0; i < width; i++) {
//记录当前比对的第几列
index = i;
for (int j = 0; j < puzzleImgHeight; j++) {
//判断rgb值是否相等
if (sourceImgRgbArr[j * width + i] != puzzleImgRgbArr[j * puzzleImgWidth + c]) {
//标志更新为false
isFind = false;
// System.out.println(i);
//重置比对的次数
c = 0;
//只要不相等就跳过此次列的比对
break;
} else if (c == count && isFind) {
//找count次并且标志为true就算找到
break;
}
isFind = true;
// System.out.print(" ");
}
////找count次并且标志为true就算找到,不再继续
if (isFind && c == count) {
break;
}
// System.out.println();
//更新目前已比对的列数
c++;
}
//如果找到,返回初始比对的第几列
//后比对的第几列 - 已经比对的列数 = 初始比对的位置(即滑块的正确位置)
if (isFind) {
ret = index - count;
}
return ret;
}

原理:通过滑块的rgb数组与原图rgb数组进行对比。

  1.把rgb数组看成二维

  2.比对滑块rbg数组的前几列(自定义)与原图rgb数组进行循环比对

  3.只要前几列对比成功就返回初始对比列的索引

通过比较rgb破解滑动验证码的更多相关文章

  1. selenium+java破解滑动验证码

    2019-04-16更新 修复极验页面改版,这次采用极验官方的demo地址:https://www.geetest.com/demo/slide-bind.html 截止2019-04-16,极验和腾 ...

  2. Python 破解极验滑动验证码

    Python 破解极验滑动验证码 测试开发社区  1周前 阅读目录 极验滑动验证码 实现 位移移动需要的基础知识 对比两张图片,找出缺口 获得图片 按照位移移动 详细代码 回到顶部 极验滑动验证码 以 ...

  3. selenium+java破解极验滑动验证码的示例代码

    转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085  ...

  4. Python——破解极验滑动验证码

    极验滑动验证码 以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/. 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家 ...

  5. selenium处理极验滑动验证码

    要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题https://www.zhihu.com/question/28833985,我按照这思路去大概实现了 ...

  6. 一步步实现滑动验证码,Java图片处理关键代码

    最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低.当然到目前为止,没有绝对的安全验证,只是不断增加攻击者的绕过成本. ...

  7. selenium篇之滑动验证码

    一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...

  8. 爬虫(十二):图形验证码的识别、滑动验证码的识别(B站滑动验证码)

    1. 验证码识别 随着爬虫的发展,越来越多的网站开始采用各种各样的措施来反爬虫,其中一个措施便是使用验证码.随着技术的发展,验证码也越来越花里胡哨的了.最开始就是几个数字随机组成的图像验证码,后来加入 ...

  9. 使用Python + Selenium破解滑块验证码

    在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...

随机推荐

  1. 循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示

    在BootstrapVue组件库里面,提供了很多对Bootstrap同等类似的组件封装,其中图片轮播可以采用b-carousel-slide组件实现,而有一些小的图片,如客户/合作伙伴Logo或者友情 ...

  2. OSPF 路由协议

    OSPF路由协议 目录 一.OSPF路由协议概述 1.1.内部网关和外部网关协议 1.2.OSPF的工作过程 1.3.OSPF的基本概念 二.OSPF 数据包类型 2.1.OSPF数包 2.2.OSP ...

  3. Processing中PImage类和loadImage()、createImage()函数的相关解析

    聊一聊Processing中PImage类和loadImage().createImage()函数.因为要借P5做多媒体创意展示,图片是一个很重要的媒体.有必要就图片的获取和展放作总结. 首先 有一点 ...

  4. Redis之缓存设计

    缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.但是将缓存加入应用架构后也会带来一些问题,本章将针对这些问题介绍缓存使用技巧和设计方案,包含如下内容: □ 缓存的收 ...

  5. 5、mysql_sql语言介绍

    5.1.什么是sql: 总结:sql语句是关系型数据库的结构化查询和程序设计语言: 5.2.sql的分类: 1.数据库查询语言(DQL): select user,host,password from ...

  6. 使用VS2017开发APP中使用VUE.js开发遇到打包出来的android文件 在低版本的android(4.3)中无法正常使用

    使用VS2017开发VUE的APP应用遇到的问题集合 1,  打包出来的apk文件在Android 6.0版本以上手机可以正常打开,在Android 4.3版本手机上无法打开 原因:一开始猜测是不是V ...

  7. SpEL表达式总结(转)

    前言 SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言.为什么要总结SpEL,因为它可以在运行时查询和操作数据,尤其是 ...

  8. Qt绘图浅析与实例

    1. Qt5位置相关函数 Q提供了很多关于获取窗体位置及显示区域大小的函数,如x().y()和pos().rect().size().geometry()等,统称为"位置相关函数" ...

  9. 如何搭建一个简易的 Web Terminal(一)

    前言 在介绍本篇文章的时候,先说一下本篇文章的一些背景.笔者是基于公司的基础建设哆啦 A 梦(Doraemon)一些功能背景写的这篇文章,不了解.有兴趣的同学可以去 袋鼠云 的 github 下面了解 ...

  10. Redis学习——简介

    一.Redis简介 Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).hash(哈希).list(列表). ...