**心血来潮写篇贴文,仅供学习,不用作商业用途。
在使用代码模拟登录时经常会遇到验证码的问题,尤其是国外一些网站,类似于“i am not robot”验证,
以官方的 reCAPTCHA V2 的示例网站https://www.google.com/recaptcha/api2/demo为例。**
在点击验证时,有时是图片验证码,有时是“我不是机器人”验证
此时,我们只需要点击空白框就会验证成功,得到如下结果
Google表示,在大多数条件下,他们可以判断出一个真人和一个自动程序之间的不同,据说区分人类和机器之间的微妙差异,在于他/她/它在单击之前移动鼠标的那一瞬间。
有的是如下所示的,图片点击验证
而类似谷歌的reCAPTCHA验证码的破解背后需要有大量人力的支撑,我们可以将验证码提交给背后的人工来进行点击,然后返回其验证成功后的密钥,我们直接使用该密钥便可以绕过一些验证码。
可以使用 https://2captcha.com/enterpage该平台提供的服务来绕过验证码。当然该平台背后需要人工点击我们提交的验证码,所以是收费的,根据不同的验证码具有不同的收费标准。
一、注册
注册完成后,可以看到如下界面
在这里我们可以看到自己的账户余额等,最重要的是API KEY,接下来在提交申请的时候会用到
二、目标网页
在注册好账号后,我们可以使用谷歌浏览器分析目标网页,这里以“https://www.google.com/recaptcha/api2/demo”为例
进入网页后,右击“检查”,可以使用搜索定位到 data-sitekey字段
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,即为目标网站网址,提交后,可以看到以下界面
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还没准备好,耐心等待几秒再次刷新即可得到结果。
再次刷新页面,得到以下结果
以下便是我们需要的结果
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
在代码上右击,选择Edit as HTML,将display: none;删除,可以看到此时网页多了一个文本框
但是,该文本框修改为显式的时候,将提交按钮覆盖了,我们可以从文本框右下角拖动,缩小。
将我们第二步得到的验证码结果赋值进文本框,点击提交即可,验证成功了!
在这一步我们可以使用用 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");
}
}
好了,成功绕过验证码!
参考资料:https://cuiqingcai.com/8637.html
https://2captcha.com/2captcha-api#rates