Java+selenium绕过谷歌reCAPTCHA验证码

  **心血来潮写篇贴文,仅供学习,不用作商业用途。
    在使用代码模拟登录时经常会遇到验证码的问题,尤其是国外一些网站,类似于“i am not robot”验证,
    以官方的 reCAPTCHA V2 的示例网站https://www.google.com/recaptcha/api2/demo为例。**

Java+selenium绕过谷歌reCAPTCHA验证码_第1张图片
在点击验证时,有时是图片验证码,有时是“我不是机器人”验证
Java+selenium绕过谷歌reCAPTCHA验证码_第2张图片
此时,我们只需要点击空白框就会验证成功,得到如下结果
Java+selenium绕过谷歌reCAPTCHA验证码_第3张图片
Google表示,在大多数条件下,他们可以判断出一个真人和一个自动程序之间的不同,据说区分人类和机器之间的微妙差异,在于他/她/它在单击之前移动鼠标的那一瞬间。
有的是如下所示的,图片点击验证
Java+selenium绕过谷歌reCAPTCHA验证码_第4张图片

而类似谷歌的reCAPTCHA验证码的破解背后需要有大量人力的支撑,我们可以将验证码提交给背后的人工来进行点击,然后返回其验证成功后的密钥,我们直接使用该密钥便可以绕过一些验证码。
可以使用 https://2captcha.com/enterpage该平台提供的服务来绕过验证码。当然该平台背后需要人工点击我们提交的验证码,所以是收费的,根据不同的验证码具有不同的收费标准。

一、注册
注册完成后,可以看到如下界面
Java+selenium绕过谷歌reCAPTCHA验证码_第5张图片
在这里我们可以看到自己的账户余额等,最重要的是API KEY,接下来在提交申请的时候会用到

二、目标网页
在注册好账号后,我们可以使用谷歌浏览器分析目标网页,这里以“https://www.google.com/recaptcha/api2/demo”为例
进入网页后,右击“检查”,可以使用搜索定位到 data-sitekey字段

Java+selenium绕过谷歌reCAPTCHA验证码_第6张图片
data-sitekey=“6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-”
将字段的值保留下,在这里即:

kSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-

接下来,我们利用这些参数构造一个URL,将该URL提交给2Captcha,背后的人工点击后,将识别得到的 token 返回给我们。

https://2captcha.com/in.php?key=API KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0
Q4Muexq9bi0DJwx_mJ-&pageurl=https://www.google.com/recaptcha/api2/demo&json=1

在该URL中需要修改key的值,即为我们注册 https://2captcha.com/enterpage网站中分配给我们的API KEY值,修改googlekey的值,即为我们目标网站中data-sitekey的值,修改pageurl,即为目标网站网址,提交后,可以看到以下界面
Java+selenium绕过谷歌reCAPTCHA验证码_第7张图片
status:1表示请求成功,记下63873228482,之后需要用到该值。
请求成功后,会有人工对该验证码进行识别,一般需要等待十几秒,我们便可以通过另一个URL来获取任务的结果。

https://2captcha.com/res.php?key=APT KEY
&action=get&id=63873249248&json=1

在该URL中需要修改两个参数的值,key的值即为平台注册分配的API KEY的值,id的值即为请求时返回的id值,通过该URL便可以获取结果,若是如下所示,则表示返回的token还没准备好,耐心等待几秒再次刷新即可得到结果。
Java+selenium绕过谷歌reCAPTCHA验证码_第8张图片再次刷新页面,得到以下结果
Java+selenium绕过谷歌reCAPTCHA验证码_第9张图片
以下便是我们需要的结果

03AGdBq24Euho4xrS1Uo6khfo1LmCDJ-Eqq5JSHfTa0zgtiiCeYDoew80618cV1757rVzZlho9wcBvNLULWAYSKoJA-cDy9eMUz6sKGg
MNQWnHVMAKzNPIZ24ao9ma_AaoPEpyfk1EgDMy3aKjubY_P7p-ONruGGbJmVfwlqZtvcZLcQGUm0tyti1HkI-z6GbzDS_AeP3YlZEK5J
VEK4Qdl3toaaE1zSguEqnX_8d49CAHxhip0x_TyDrgO__By0qbRSPAaxbvQ5p19xln5RzRz-y-aAD2TZC4-7Iqal4ZIfxtj8a3SjEZVL
-lD2IX-YPlk8u28Om6t9yYNNvrEjpGEqI-dLgA0bjO8p8bjC_AcyJJcjnbJsPiEiEeLg_bCoE2CrjFp0YHkd9Ieec78T7VYO2SUqBjL
KEoS8L7QbkuiEwiQQi3jeOr1vMuk-5ZWE6bfpSLL3uXyfMO

好了,此时我们前期工作已经做好了,那么我们便可以使用得到的结果进行提交了。

三、提交结果
提交结果我们可以使用修改网站源码进行测试。
谷歌浏览器右击检查,定位到name =“ g-recaptcha-response ”的 textarea
Java+selenium绕过谷歌reCAPTCHA验证码_第10张图片
在代码上右击,选择Edit as HTML,将display: none;删除,可以看到此时网页多了一个文本框
Java+selenium绕过谷歌reCAPTCHA验证码_第11张图片
但是,该文本框修改为显式的时候,将提交按钮覆盖了,我们可以从文本框右下角拖动,缩小。
Java+selenium绕过谷歌reCAPTCHA验证码_第12张图片
将我们第二步得到的验证码结果赋值进文本框,点击提交即可,验证成功了!
Java+selenium绕过谷歌reCAPTCHA验证码_第13张图片在这一步我们可以使用用 JavaScript 代码选取到这个 textarea,然后直接赋值提交即可。

document.getElementById("g-recaptcha-response").innerHTML="TOKENValue";

这里的 TOKENValue换成2Captcha返回给我们的结果即可。
到这里,我们就成功地借助 2Captcha,无需点击验证便完成了reCAPTCHA 验证码的识别。

四、代码

充足的准备与试验工作完成好后,直接上代码。新建maven项目,配置pom.xml,编写代码,运行即可。
该项目使用selenium来完成,首先在pom.xml中增加如下配置:

<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.4.0</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.9</version>
</dependency>

java代码

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class App 
{
    public static void main( String[] args ) throws InterruptedException
    {
    System.out.println("start");
     
     //加载谷歌浏览器驱动
     System.setProperty("webdriver.chrome.driver", "D:\\google\\chromedriver.exe");// chromedriver服务地址
     WebDriver driver = new ChromeDriver();
     //请求验证码结果,API KEY需要换成自己账号的API KEY
     String requesturl="https://2captcha.com/in.php?key=API KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://www.google.com/recaptcha/api2/demo&json=1";
     driver.get(requesturl);
     String res=driver.findElement(By.tagName("body")).getText();
     
     //获取返回的json信息
     JSONObject jsonObject = JSONObject.parseObject(res);        
     String id=jsonObject.getString("request");
     System.out.println("id="+id);
     
     //等待25秒
     Thread.sleep(25000);
     String token="CAPCHA_NOT_READY";
     
    //若一直没获得返回的token,则一直循环等待,需要将API KEY换成自己的
    while(token.equals("CAPCHA_NOT_READY")) {
    String resurl="https://2captcha.com/res.php?key=API KEY&action=get&id="+id+"&json=1";
    driver.get(resurl);
    String getres=driver.findElement(By.tagName("body")).getText();
    jsonObject = JSONObject.parseObject(getres);  
    token=jsonObject.getString("request");
    System.out.println("token="+token);
    Thread.sleep(5000)}
    
     //访问目标网站
     driver.get("https://www.google.com/recaptcha/api2/demo");
        
    //执行JS代码方式,此时为人工提交请求,人工修改token,代码提交请求与获取结果很简单,这里懒得写代码了,
    //将返回的结果替换TOKENValue即可
        
     JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
     jsExecutor.executeScript("document.getElementById('g-recaptcha-response' ).innerHTML='TOKENValue‘;");
     
    //获取提交按钮
     WebElement submit =driver.findElement(By.id("recaptcha-demo-submit"));
     submit.click()//切换当前界面
    String winHandleBefore = driver.getWindowHandle();
    for(String winHandle : driver.getWindowHandles())
      {    
       if (winHandle.equals(winHandleBefore))
       {
        continue;
        }
       driver.switchTo().window(winHandle);
       break;  
      }
      
      //获取点击后的页面内容并输出
      String result=driver.findElement(By.tagName("body")).getText();
      System.out.println(result);
     
      //关闭
      driver.close();
      System.out.println("end");
      }
      }

验证成功…太棒了!
Java+selenium绕过谷歌reCAPTCHA验证码_第14张图片

好了,成功绕过验证码!

参考资料:https://cuiqingcai.com/8637.html
https://2captcha.com/2captcha-api#rates

你可能感兴趣的:(java)