iT邦幫忙

0

使用2captcha的服务解决reCaptcha v2.0 (Python)

在这篇文章中,我们想向您展示自动连接到2captcha服务以解决Google reCaptcha v2.0的代码。 不久前,谷歌极大地复杂了用户行为的reCaptcha(v2.0)。 此服务提供了一种在线解决方法。

该服务使用的简单算法如下:

 目标网站开放凭据(验证码的“站点密钥”,站点url,可选:代理IP)由您(客户端)复制并提交给2captcha服务。 您可以使用简单的Web开发人员工具找到它们。
 服务端的工作人员使用提供的凭据解决reCaptcha。
 在10到30秒钟内,您会以g-recaptcha-response令牌的形式请求答案。
 您可以在带有recaptcha的目标网站[提交]表单内使用此g-recaptcha-response令牌。

注意:仅通过纯粹的http GET和POST请求,就可以在不模仿浏览器的情况下完成所有这些步骤,我们将演示如何实现。

为了便于说明,我们使用了Recaptcha进行了测试。
http://testing-ground.scraping.pro/recaptcha

获取秘钥

2captcha服务要求我们为其提供以下参数:

请求参数 值
秘钥 SERVICE_KEY(2个验证码服务密钥)
Google 秘钥 g-recaptcha块元素中的data-sitekey属性值
页面网址 http://testing-ground.scraping.pro/recaptcha (带有Recaptcha的目标页面的网址)
方式 用户验证码

现在,我们转到站点页面,并在Web开发人员工具中检查recaptcha html代码(按F12键)。 我们在g-recaptcha块中找到并获取data-sitekey属性值。 它的值是单个网站的常量,即Google提供的site_key值。 在下面的照片中看到以蓝色突出显示的值:

https://ithelp.ithome.com.tw/upload/images/20191031/20122505gxeDCxDGdl.jpg

因此,我们选择它并右键单击进行复制。

现在,我们已经获得了googlekey参数(网站的google网站密钥):6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8

以下验证请求的SERVICE_KEY来自2captcha帐户设置:
https://2captcha.com/setting?from=8377663
https://ithelp.ithome.com.tw/upload/images/20191031/20122505cwOrz8bf4D.jpg
http://2captcha.com/in.php?key=SERVICE_KEY&method=userrecaptcha&googlekey=6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8&pageurl=http://testing-ground.scraping.pro/recaptcha

提交服务以请求重新解决方案

现在,我们使用上述参数向2captcha服务(in.php端点)发出GET或POST请求:

Python代码:

import requests 
from time import sleep, time
service_key = 'xxxxxxxxxxxxxx' # 2captcha service key 
google_site_key = '6LfxxxxxxxxxxxxxxxxxxxxxFMz856JY' 
pageurl = 'http://testing-ground.scraping.pro/recaptcha' 
url = "http://2captcha.com/in.php?key=" + service_key + "&method=userrecaptcha&googlekey=" + google_site_key + "&pageurl=" + pageurl 
resp = requests.get(url) 
if resp.text[0:2] != 'OK': 
    quit('Service error. Error code:' + resp.text) 
captcha_id = resp.text[3:]

2captcha服务以以下形式呈现响应:
OK | Captcha_ID,其中Captcha_ID –是系统中Recaptcha的ID。

接收有效令牌

现在,我们需要等到工作人员解决recaptcha并google将有效令牌返回给服务为止。 为此,我们可以每5秒向2captcha服务发送一次请求,直到获得有效令牌为止。 请参阅带有参数的res.php端点请求:

http://2captcha.com/res.php?key=SERVICE_KEY&action=get&id=Captcha_ID

Python代码:

fetch_url = "http://2captcha.com/res.php?key="+ service_key + "&action=get&id=" + captcha_id

for i in range(1, 10):	
	sleep(5) # wait 5 sec.
	resp = requests.get(fetch_url)
	if resp.text[0:2] == 'OK':
		break
		 	
print('Google response token: ', resp.text[3:])

以表格形式提交Google秘钥

现在,我们使用g-recaptcha-response令牌提交表单。

在目标站点(服务器端),将检查此令牌。 该网站的脚本向Google发送了一个请求,以检查g-recaptcha-response令牌的有效性:是否为真,是否与该网站有关,等等。在我们的Captcha测试场中,在提交表单之前检查了该令牌。 这是通过将令牌通过ajax(xhr)请求传递给proxy.php来完成的,而proxy.php则向Google查询该网站是否经过验证,并返回google的响应。

proxy.php

header('Content-type: application/json'); 
$response = $_GET['response'];
$secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  
$json = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=' . $secret . '&response=' . $response);
echo $json;

请参阅有关如何在php中插入和配置reCaptcha代码的文章。

将g-recaptcha-response发送到proxy.php以便Google进行网站验证的Python代码

verify_url = "http://testing-ground.scraping.pro/proxy.php?response=" + resp.text[3:]
resp = requests.get(verify_url)
print(resp.text)

该脚本应该会导出一下的JSON结果:
{ “success”: true,
“challenge_ts”: “2016-09-29T09:25:55Z”,
“hostname”: “testing-ground.scraping.pro”
}

带有g-recaptcha-response提交的表单的Python代码:

submit_url = "http://testing-ground.scraping.pro/recaptcha
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
payload = {'submit': 'submit', 'g-recaptcha-response': resp.test[3:] }
resp = requests.post(submit_url, headers=headers, data=payload)

全部代码:

import requests 
from time import sleep, time
start_time = time()

# send credentials to the service to solve captcha
# returns service's captcha_id of captcha to be solved
url="http://2captcha.com/in.php?key=1069c3052adead147d1736d7802fabe2&method=userrecaptcha&googlekey=6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8&pageurl=http://testing-ground.scraping.pro/recaptcha"
resp = requests.get(url) 
if resp.text[0:2] != 'OK':
    quit('Error. Captcha is not received')
captcha_id = resp.text[3:]

# fetch ready 'g-recaptcha-response' token for captcha_id  
fetch_url = "http://2captcha.com/res.php?key=1069c3052adead147d1736d7802fabe2&action=get&id=" + captcha_id
for i in range(1, 20):	
	sleep(5) # wait 5 sec.
	resp = requests.get(fetch_url)
	if resp.text[0:2] == 'OK':
		break
		
print('Time to solve: ', time() - start_time) 

# final submitting of form (POST) with 'g-recaptcha-response' token
submit_url = "http://testing-ground.scraping.pro/recaptcha"
    # spoof user agent
headers = {'user-agent': 'Mozilla/5.0 Chrome/52.0.2743.116 Safari/537.36'} 
    # POST parameters, might be more, depending on form content
payload = {'submit': 'submit', 'g-recaptcha-response': resp.text[3:]  }
resp = requests.post(submit_url, headers=headers, data=payload)

局限性
收到的g-recaptcha-response令牌(来自2captcha服务)仅在120秒(2分钟)内有效,因此您有责任在该时限内以目标网站[提交]形式应用它。

其他语言解决方案
您还可以查看其他语言选项以了解如何应用2captcha服务:

C#代码(同一测试基础页的代码)
http://scraping.pro/2captcha-service-integration-with-c-code
Java示例(仅带有俄语注释)
https://smmsoft.blogspot.com/2016/08/recaptcha-java-phantomjs-jsoup.html

大批量、高效率的验证码解决方案

现在平均服务解决方案时间为25秒。 在下面的文章中,我们将分享如何通过此服务优化Recaptcha解决方案。


尚未有邦友留言

立即登入留言