“
阅读本文大概需要 16 分钟。
”很久没有做爬虫破解类相关的分享了,之前交流群里有朋友提问谷歌系的reCAPTCHA V2 验证码怎么破,因为工作的原因我是很久之后才看到的,也不知道那位朋友后来成功了没有。那今天就来跟大家分享一下 reCAPTCHA V2 的破解。
(小马补充:想加交流群的朋友,进入公众号下方,点击技术交流,有读者群和交流群,点击后都会弹出崔老师的二维码,扫微信二维码拉群~)
如果大家访问国外的一些网站的话,想必肯定见过这样的一个验证码,它上面写着「I'm not a robot」,意为「我不是机器人」,验证码长这个样子:
这时候,只要我们点击最前面的复选框,验证码算法会首先利用其「风险分析引擎」做一次安全检测,如果直接检验通过的话,我们会直接得到如下的结果:
如果算法检测到当前系统存在风险,比如可能是陌生的网络环境,可能是模拟程序,会需要做二次校验。它会进一步弹出类似如下的内容:
比如上面这张图,验证码页面会出现九张图片,同时最上方出现文字「树木」,我们需要点选下方九张图中出现「树木」的图片,点选完成之后,可能还会出现几张新的图片,我们需要再次完成点选,最后点击「验证」按钮即可完成验证。
或者我们可以点击下方的「耳机」图标,这时候会切换到听写模式,验证码会变成这样:
这时候我们如果能填写对验证码读的音频内容,同样可以通过验证。
这两种方式都可以通过验证,验证完成之后,我们才能完成表单的提交,比如完成登录、注册等操作。
这种验证码叫什么名字?
这个验证码就是 Google 的 reCAPTCHA V2 验证码,它就属于行为验证码的一种,这些行为包括点选复选框、选择对应图片、语音听写等内容,只有将这些行为校验通过,此验证码才能通过验证。相比于一般的图形验证码来说,此种验证码交互体验更好、安全性会更高、破解难度更大。
许多国外的网站都采用了此种验证码,由于某些原因,在国内其实无法直接使用,但只需要将验证码的域名更换为 recaptcha.net 同样是可以使用的,所以有时候我们在国内某些站点同样能看到它的身影。
其实上文所介绍的验证码仅仅是 reCAPTCHA 验证码的一种形式,是 V2 的显式版本,另外其 V2 版本还有隐式版本,隐式版本在校验的时候不会再显式地出现验证页面,它是通过 JavaScript 将验证码和提交按钮进行绑定,在提交表单的时候会自动完成校验。除了 V2 版本,Google 又推出了最新的 V3 版本,reCAPTCHA V3 验证码会为根据用户的行为来计算一个分数,这个分数代表了用户可能为机器人的概率,最后通过概率来判断校验是否可以通过。其安全性更高、体验更好。
具体的内容大家可以参考 reCAPTCHA 的官方介绍:https://developers.google.com/recaptcha。
那么在做爬虫的时候,如果我们遇到了这样的验证码?该怎么办呢?不要着急,这篇文章就来介绍一个解决方案。
机器学习 vs 识别服务
之前我在写上一篇 利用深度学习识别滑动验证码缺口位置 的时候,当时朋友留言问我能不能做一个自己调试出的机器学习的,我回复了,我说当然没问题,你等着,我这周就做。
我那周从周一做到周五,我记得用的应该是 yolo,反复修改,小马还经常过来催稿,耗费良久,然后就在那周周五晚上的23:59分,我灵机一动,终于明白了。
去他的机器学习,有服务不好吗?
reCAPTCHA 本身比极验还要复杂,国内网站我暂时没看到破解的,然后这次我用的是俄罗斯的一个服务商 2Captcha 提供的图像识别和一系列行为验证码的识别服务。
其实目前复杂的验证码识别的背后,都是图像识别算法和大量人力的支撑。如果我们仅仅是简单的图形验证码,其可以通过一些图像识别算法将内容识别出来转化为文本内容。如果是较为复杂的图形验证码或者像 reCAPTCHA 类似的行为验证码,其背后会有人来对验证码进行模拟,然后返回其验证成功后的秘钥,我们利用其结果便可以完成一些验证码的绕过。
当然这种网站肯定是要收费的,按照 1000 次识别为单位,其花费的费用为 0.5 美刀到 2.99 美刀不等,比如非常简单的图形验证码可能就是 0.5 美刀,这种验证码对于其人力和算力资源消耗都是相对较小的,对于复杂的 reCAPTCHA 验证码,就要花 2.99 美刀了,因为识别这么一个验证码并不容易,其背后的人可能需要看好多图,点选好多次才能完成一次成功的验证。
比如我这次提到的 2Captcha,他的收费标准是这样子的:
具体的内容或者更新大家可以到其官方说明 https://2captcha.com/2captcha-api#rates 去查看。
后面我用他的服务来破解 reCAPTCHA,当然类你用其他服务商可以的,过程大概都是这样。
准备工作
要使用 2Captcha,第一步当然是注册一下它的账号了,注册完成之后我们可以进入到 2Captcha 的控制台,类似于这样子:
在这里我们可以看到账户余额、API KEY、FAQ 等配置。
这里最重要的就是 API KEY 了,它是我们用来使用 2Captcha 的凭证,我们将它复制下来,后面我们会在代码中使用它。
好,准备工作完成了,我们接下来进入正式内容。
2Captcha for reCAPTCHA V2
在上文我们已经介绍过 reCAPTCHA V2 的使用和交互流程了,下面我们来介绍下其识别和绕过的基本流程。
在这里我们就拿官方的 reCAPTCHA V2 的示例网站来做演示吧,其网址为:https://www.google.com/recaptcha/api2/demo,打开之后界面如下所示:
在这里可以看到有一个表单,上面有一些输入框,下方是 reCAPTCHA V2 验证码。
要识别这个验证码,第一步便是找到这个验证码 sitekey,这个是验证码的唯一标识。
我们打开浏览器的开发者工具,查看其页面源码,首先找到 reCAPTCHA 的源代码,如下图所示:
可以看到 reCAPTCHA 是对应了一个 iframe,我们看到的 reCAPTCHA 内容都是在 iframe 里面呈现出来的。
这里我们可以观察到在 reCAPTCHA 的源码的最外层的 div 上面有一个字段,叫做 data-sitekey,这就是刚才我们所说的 sitekey,它是验证码的唯一标识,比如这里我先将这个 sitekey 保存下来,这里其值为:
6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-
下一步,我们就需要将这个 sitekey 和当前页面的 URL 告诉 2Captcha,让 2Captcha 来帮助我们识别这个 reCAPTCHA 验证码,告诉 2Captcha 之后,2Captcha 会利用这些信息加载出对应的验证码,再利用其背后的人力来对验证码进行识别,最后将识别得到的 token 返回给我们即可。
好,那么接下来怎么把这个信息告诉 2Captcha 呢?
很简单,2Captcha 为我们提供了一个接口,其接口地址为:https://2captcha.com/in.php,我们只需要将对应的信息发送到这个接口就好了。
那么发送需要什么参数呢,在这里介绍一下:
参数 | 类型 | 必须 | 描述 |
key | String | Yes | 我们自己的 API KEY |
method | String | Yes | userrecaptcha,定义破解 reCAPTCHA 验证码的方式 |
googlekey | String | Yes | reCAPTCHA 的 sitekey |
pageurl | String | Yes | reCAPTCHA 当前所在的 URL |
invisible | Integer Default: 0 | No | 是否可见,1 代表是隐式验证码,0 代表普通验证码。 |
header_acao | Integer Default: 0 | No | 跨域访问配置 |
pingback | String | No | 回调地址 |
json | Integer Default: 0 | No | 返回格式,1 代表返回 JSON 格式,0 代表纯文本,默认 0 |
soft_id | Integer | No | ID of software developer. Developers who integrated their software with 2captcha get reward: 10% of spendings of their software users. |
proxy | String | No | 代理配置 |
在这里我们可以构造一个 URL,它包括这几个参数:
•key:注意这里的 KEY 换成你自己的 API KEY•method:直接赋值 userrecaptcha•googlekey:复制的 sitekey•pageurl:当前 URL•json:直接赋值 1,代表返回 JSON 格式
比如在这里我就构造了这个 URL,内容如下:
https://2captcha.com/in.php?key=c0ae5935d807c28f285e5cb16c676a48&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://www.google.com/recaptcha/api2/demo&json=1
这时候我们直接向这个 URL 发起一个 GET 请求即可。
我们可以直接在浏览器里面输入这个 URL,也可以使用 requests 等请求库来完成:
import requests
response = requests.get(url)
print(response.json())
接口会返回如下格式的内容:
{'status': 1, 'request': '62919419695'}
这里它返回了一个 JSON 格式的数据,其中 status 代表请求状态,如果是 1 的话,代表请求成功,另外其还会包含一个 request 字段,其内容是一个 ID,这个 ID 就是识别这个验证码的任务的 ID。因为 2Captcha 背后有很多人来帮助识别验证码,所以 2Captcha 将每个验证码的识别划分为一个个任务,每个任务都有一个唯一的 ID,刚分配任务时,这个任务被标记为 NOT_READY 状态。这些任务接下来会被分发给一个个人,识别完成之后,该任务就会被标记为已经识别状态,同时附有识别之后的信息,如 token 等内容。
好,刚才的接口请求成功之后,这个 reCAPTCHA 的识别任务就已经被下发了,其背后会有对应的人来对这个 reCAPTCHA 验证码进行识别,识别过程可能需要十几秒到几十秒不等,我们可以通过另一个接口来获取任务的结果。
获取结果的接口地址为:https://2captcha.com/res.php,同样我们需要传入一些参数,其参数介绍如下:
参数 | 类型 | 必需 | 描述 |
key | String | Yes | API KEY |
action | String | Yes | get,表示获取验证码的结果 |
id | Integer | Yes | 任务 ID,就是刚才 in.php 接口返回的结果。 |
json | Integer Default: 0 | No | 返回 JSON 格式,1 代表使用 JSON 格式,0 代表纯文本格式 |
在这里我们构造一个 URL,它包括如上的参数:
•key:在这里换成你的 API KEY•action:就直接赋值 get•id:任务 ID•json:在这里用 1,即返回 JSON 格式数据
这样我们就构造了如下的 URL:
https://2captcha.com/res.php?key=c0ae5935d807c28f285e5cb16c676a48&action=get&id=62919419695&json=1
同样我们可以在浏览器中访问或者用 requests 请求,得到如下结果:
{
"status": 1,
"request": "03AOLTBLSg0fQUUMtP2o3kvJWNm6zla8MEjP_vPh629-xS-d_QrlJwMcxQfSJMUIU92noqbJ16yt5a0PdB3ORW-5MEbqK7NZ82bTnSZohCG_mYVVv8TbuvM1A99DFvlepxGEKlGCoi5lTHJd5z_QQ2mV1trGlI8VJkHjVAhLZzlz67MVgQzIu7aDl39n6aocAIVueQuCyjmA1C3hUECxpNlXJuXYVD10eJrqY_Bu36_2E0uBrmDIkAIjxCzEZWgadToU4ByLReOrNJ7_4t-P8leTUbPC5YBXvoDZZZByz8-vNnHzUu3GNNESzGSCMFfVPYumnXXI6i7TO5p1k-AElgb7qor6vDJGA_RpNNSUgAj8B0synG9APpbMQ4cEprHXle5pJtNCBX_v_8uqJLobomIx0St5l_H1tHGuTgI2UU-nWmR9TwvKp6SR-6G2Fi6pv7c8350tPbqJWWMcV0AXdfM85GjRDh2t7wh1CMukLQE21aIIwHh88kR0Fh0481Kw_umw8IfFCHyHKu8IcTERUL5LZdDzQkiGdF1wqWP-GhySMXEx-eOT7tB6SqPEAmO_mbwtJtA-qKzcHP"
}
如果其返回的是如上格式的数据,就代表 reCAPTCHA 验证码已经识别成功了,其返回的 request 字段的内容就是识别的 token,我们直接拿着这个 token 放到表单里面提交就成功了。
那这个 token 怎么来用呢?
其实如果不走 2Captcha 接口,我们如果人工验证成功之后,在其表单里面会把一个 name 叫做 g-recaptcha-response 的 textarea 赋值,如果验证成功,它的 value 值就是验证之后得到的 token,这个会作为表单提交的一部分发送到服务器进行验证。如果这个字段校验成功了,那就没问题了。
所以,2Captcha 相当于为我们模拟了点选验证码的过程,其最终得到的这个 token 其实就是我们应该赋值给 name 为 g-recaptcha-response 的内容。
那么怎么赋值呢?
很简单,用 JavaScript 就好了。我们可以用 JavaScript 选取到这个 textarea,然后直接赋值即可,代码如下:
document.getElementById("g-recaptcha-response").innerHTML="TOKEN_FROM_2CAPTCHA";
注意这里的 TOKEN_FROM_2CAPTCHA
需要换成刚才我们所得到的 token 值。我们做爬虫模拟登录的时候,假如是用 Selenium、Puppeteer 等软件,在模拟程序里面,只需要模拟执行这段 JavaScript 代码,就可以成功赋值了。
执行之后,直接提交表单,我们查看下 Network 请求:
可以看到其就是提交了一个表单,其中有一个字段就是 g-recaptcha-response,它会发送到服务端进行校验,校验通过,那就成功了。
所以,如果我们借助于 2Captcha 得到了这个 token,然后把它赋值到表单的 textarea 里面,表单就会提交,如果 token 有效,就能成功绕过登录,而不需要我们再去点选验证码了。
最后我们得到如下成功的页面:
至此,我们就成功地借助 2Captcha 来完成了 reCAPTCHA V2 验证码的识别。
总结
本节我们介绍了识别 reCAPTCHA V2 的流程。从个人出发,我觉得工程师使用这样的服务并不是一种令人羞耻的过程,尤其是他可以以比较低的价格实现你的需求的情况下。毕竟你的时间,本身就是一种价值。
最后 2Captcha 这个网站我放在原文链接中,有感兴趣的朋友可以看一下。可能因为服务商的原因,每次打开都要三到五秒才能加载出来,不是 Bug 不用刷新。
另外如果有什么爬虫方面想看的文章主题,也欢迎在下面留言,我们会挑选被点赞较多的主题尽快写文。谢谢!
推荐阅读
1
2
3
4
点
这里“阅读原文”,查看更多