破解无缺口滑块验证码

在学习完selenium 简单操作之后,继续我的破解之路。先看一下原网页页面。(灵魂打码重点看滑块)

破解这种无缺口滑块首先要找到滑块位置,根据selenium选择器去选择要拖动的Slider,选中之后查看要拖动的px,执行

dragAndDropBy方法即可。

(1)F12 查看滑块的位置,使用selenium选择器选择滑块

(2)查看要拖动的距离以及滑块的大小

注意要拖动的距离则为 (305-40)px

下面附上第一版代码:

package com.example.blacklist.selenium;import javafx.scene.control.Slider;
import org.junit.Test;
import org.openqa.selenium.By;
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.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;/*** @author www*/
public class SeleniumTest {public static void main(String[] args) throws Exception {System.setProperty("webdriver.chrome.driver","D:\\driver\\chrome\\chromedriver.exe");WebDriver driver = new ChromeDriver();//PhantomJs//WebDriver driver = PhantomJsUtil.getPhantomJs();//fire//System.setProperty("webdriver.firefox.marionette","D:\\driver\\fire\\geckodriver.exe");//WebDriver driver = new FirefoxDriver();try {driver.get("xxxxxxURL");List<WebElement> elements = driver.findElements(By.xpath("//input[@data-meta=\"Field\"]"));Thread.sleep(2000L);elements.get(0).sendKeys("username");Thread.sleep(2000L);elements.get(1).sendKeys("password");Thread.sleep(5000L);String pageSource1= driver.getPageSource();if(pageSource1.contains("next-btn next-btn-primary next-btn-large")){WebElement element = driver.findElement(By.cssSelector(".next-btn.next-btn-primary.next-btn-large"));System.out.println("LOGIN----------"+element.getText()+"-----------------LOGIN");element.click();Thread.sleep(5000L);}//存到本地File file = new File("C:\\Users\\www\\Desktop\\files\\pageSource1.txt");PrintStream ps = new PrintStream(new FileOutputStream(file));ps.print(pageSource1);WebElement Slider = driver.findElement(By.cssSelector(".nc_iconfont.btn_slide"));Thread.sleep(2000L);//WebElement Slider = driver.findElement(By.id("nc_2_n1z"));System.out.println("Slider=========="+ Slider.getTagName()+"==============Slider");Actions action = new Actions(driver);Thread.sleep(5000L);action.dragAndDropBy(Slider,265,0).perform();Thread.sleep(5000L);String pageSource = driver.getPageSource();File file2 = new File("C:\\Users\\www\\Desktop\\files\\pageSource2.txt");PrintStream ps2 = new PrintStream(new FileOutputStream(file2));ps2.print(pageSource);ps.close();ps2.close();Thread.sleep(60000L);driver.close();driver.quit();} catch (InterruptedException e) {e.printStackTrace();}finally{driver.close();driver.quit();}}@Testpublic void get(){for (int j = 1; j <= 2; j++) {System.out.println(j);}}
}

执行后可以发现被检测到受自动软件的控制此时需要我们关闭,代码如下

 //chromChromeOptions option = new ChromeOptions();//关闭受自动软件的控制option.addArguments("disable-infobars");List<Object> list=new ArrayList<>();

再次执行会发现受自动软件的控制已经被关闭。

下面就是重点了,在做完这些操作之后,鼠标可以成功拖动滑块,但却无法验证通过。查阅了很多资料发现有些网站会有发爬虫机制,能够根据selenium 的一些标识。这是就需要进一步改写selenium的标识从而突破网站的拦截。

我们来看一个例子。

执行下面这一段代码启动Chrome窗口:

  @Testpublic void get(){System.setProperty("webdriver.chrome.driver","D:\\driver\\chrome\\chromedriver.exe");WebDriver driver = new ChromeDriver();}

现在,在这个窗口中打开开发者工具,并定位到Console选项卡,如下图所示。

执行

window.navigator.webdriver

可以看到这个值为true,而我们直接在浏览器中打开,执行相同的命令,可以发现这行代码的返回值为undefined,如下图所示。

所以,如果网站通过js代码获取这个参数,返回值为undefined说明是正常的浏览器,返回true说明用的是Selenium模拟浏览器。一抓一个准。这里给出一个检测Selenium的js代码例子:

 String js1="Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});";
((ChromeDriver) driver).executeScript(js1);

网站只要在页面加载的时候运行这个js代码,就可以识别访问者是不是用的Selenium模拟浏览器。如果是,就禁止访问或者触发其他反爬虫的机制。

确实修改成功了。这种写法就万无一失了吗?并不是这样的,如果此时你在模拟浏览器中通过点击链接、输入网址进入另一个页面,或者开启新的窗口,你会发现,window.navigator.webdriver又变成了true

接下来,又有朋友提出,可以通过编写Chrome插件来解决这个问题,让插件里面的js代码在网站自带的所有js代码之前执行。

这样做当然可以,不过有更简单的办法,只需要设置Chromedriver的启动参数即可解决问题。

在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为['enable-automation'],

List<Object> list=new ArrayList<>();list.add("enable-automation");option.setExperimentalOption("excludeSwitches",list);

下面附上完整代码:

package com.example.blacklist.selenium;import javafx.scene.control.Slider;
import org.junit.Test;
import org.openqa.selenium.By;
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.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;/*** @author www*/
public class SeleniumTest {public static void main(String[] args) throws Exception {//chromChromeOptions option = new ChromeOptions();//关闭受自动软件的控制option.addArguments("disable-infobars");List<Object> list=new ArrayList<>();list.add("enable-automation");option.setExperimentalOption("excludeSwitches",list);//后台运行//option.addArguments("headless");System.setProperty("webdriver.chrome.driver","D:\\driver\\chrome\\chromedriver.exe");WebDriver driver = new ChromeDriver(option);//PhantomJs//WebDriver driver = PhantomJsUtil.getPhantomJs();//fire//System.setProperty("webdriver.firefox.marionette","D:\\driver\\fire\\geckodriver.exe");//WebDriver driver = new FirefoxDriver();try {//改写 wedriverString js1="Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});";((ChromeDriver) driver).executeScript(js1);driver.get("xxxxxxxxxURL");List<WebElement> elements = driver.findElements(By.xpath("//input[@data-meta=\"Field\"]"));Thread.sleep(2000L);elements.get(0).sendKeys("userName");Thread.sleep(2000L);elements.get(1).sendKeys("password");Thread.sleep(5000L);String pageSource1= driver.getPageSource();if(pageSource1.contains("next-btn next-btn-primary next-btn-large")){WebElement element = driver.findElement(By.cssSelector(".next-btn.next-btn-primary.next-btn-large"));System.out.println("LOGIN----------"+element.getText()+"-----------------LOGIN");element.click();Thread.sleep(5000L);}//存到本地File file = new File("C:\\Users\\www\\Desktop\\files\\pageSource1.txt");PrintStream ps = new PrintStream(new FileOutputStream(file));ps.print(pageSource1);WebElement Slider = driver.findElement(By.cssSelector(".nc_iconfont.btn_slide"));Thread.sleep(2000L);//WebElement Slider = driver.findElement(By.id("nc_2_n1z"));System.out.println("Slider=========="+ Slider.getTagName()+"==============Slider");Actions action = new Actions(driver);Thread.sleep(5000L);action.dragAndDropBy(Slider,265,0).perform();Thread.sleep(5000L);String pageSource = driver.getPageSource();File file2 = new File("C:\\Users\\www\\Desktop\\files\\pageSource2.txt");PrintStream ps2 = new PrintStream(new FileOutputStream(file2));ps2.print(pageSource);ps.close();ps2.close();Thread.sleep(60000L);driver.close();driver.quit();} catch (InterruptedException e) {e.printStackTrace();}finally{driver.close();driver.quit();}}}

到这里selenium就可以拖动滑块成功验证了,希望会对你有所帮助

Java + Selenium 完成简单滑块验证学习之路(破解无缺口滑块验证码)(三)相关推荐

  1. Java + Selenium 完成简单滑块验证学习之路(selenium的使用)(二)

    selenium的使用 本文摘自https://blog.csdn.net/qq_22003641/article/details/79137327(此处主要介绍模拟鼠标用法,更多常用法法请点击查看) ...

  2. alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)

    alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb) 1.vim的使用 vim有三种模式:命令模式,末行模式,编辑模式 光标的移动[命令模式] h 向左 ,j 向下,k 向上,l ...

  3. 登录滑块验证表单_如何构建双滑块登录和注册表单

    登录滑块验证表单 Some of you might already know but for those who don't, I'm starting a Weekly Coding Challe ...

  4. AI 学习之路——轻松初探 Python 篇(三)

    喜欢小之的文章的可以关注公众号「WeaponZhi」持续关注动态 这是「AI 学习之路」的第 3 篇,「Python 学习」的第 3 篇 Python 字符串使用和 C 语言比较类似,但还有一些我们值 ...

  5. python 淘宝滑块验证_python2.7+selenium2实现淘宝滑块自动认证功能

    本文为大家分享了python2.7+selenium2实现淘宝滑块自动认证的具体代码,供大家参考,具体内容如下 1.编译环境 操作系统:win7:语言:python2.7+selenium2:ide: ...

  6. java spring框架怎么学_JAVA学习之路~spring框架(一)

    一.MVC思想M:Model 数据模型(javaBean实体类) V:View 视图(前端jsp,html等等) C:Controller 控制层(处理业务逻辑) 二.高级框架介绍Dao层: MyBa ...

  7. java 工程新建ivy文件_Hadoop学习之路(八)在eclispe上搭建Hadoop开发环境

    一.添加插件 将hadoop-eclipse-plugin-2.7.5.jar放入eclipse的plugins文件夹中 二.在Windows上安装Hadoop2.7.5 版本最好与Linux集群中的 ...

  8. Java学习之路:第七天(三)数组的遍历与拷贝

    数组的遍历: 利用for循环和for-each语句. 数组拷贝利用System.arraycopy()进行 测试代码如下: /*** 数组的遍历与拷贝*/ package Array;import j ...

  9. java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法

    Scanner sc = new Scanner(System.in); /注意in 是InputStream的缩写,是字节输入流的意思. 整句话的含义就是: new 一个对象,接受从键盘输入的数据, ...

最新文章

  1. CSDN实现自动点赞
  2. pandas使用dropna函数删除dataframe中列非缺失值的个数小于某一比例阈值的数据列
  3. python详细下载安装教程-Python下载并安装图形教程[超级详细]
  4. 在Golang开发中使用Redis
  5. Linux文件和目录权限笔记
  6. IP和网段及子网掩码基础知识
  7. DDD(领域驱动设计)系列之一-DomainPrimitive
  8. mdk cubemx 移植RT-Thread Nano 至stm32f424zgt6
  9. bowtie1和bowtie2的比较
  10. 什么是Web Service
  11. Linux中Docker常用命令
  12. 在oracle表中增加字段,并调整字段的顺序
  13. 大数据与云计算课后习题
  14. 能自动生成标注的APP,尝试一下吧
  15. Html5之canvas重叠矩形、getContext、fillStyle、fillRect
  16. run.gps+trainer+uv+for+android,android 2.1(三星spica i5700)上的蓝牙问题配对工作但连接不起作用...
  17. Referenced file contains errors (xml文件第一行小红叉错误)
  18. 解决锁定图层后不能淡显的问题
  19. 彻底搭建云笔记(附插件)
  20. python selenium高级教程_selenium(python)教程

热门文章

  1. 红魔——曼彻斯特联队
  2. TDNN—时延神经网络原理
  3. python+selenium老中年人的使用与精进(持续施工中)
  4. 笔记本电脑优酷下载的视屏丢失怎么恢复
  5. Windows修改软件默认安装目录
  6. Android APP SSLPinning证书绑定绕过
  7. TDateTime 日期时间值的比较
  8. itunes ios_与iTunes同步时如何防止iOS应用重新安装
  9. 2020.10.25 对象的创建 利用构造函数创建对象 遍历对象属性 遍历函数属性和属性数值for in 内置对象
  10. 淘宝首页 图片滑动切换效果 基于CSS3的transition方法实现