谷歌家的验证码怎么了?搞他!

阅读本文大概需要 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,我们只需要将对应的信息发送到这个接口就好了。

那么发送需要什么参数呢,在这里介绍一下:

参数类型必须描述
keyStringYes我们自己的 API KEY
methodStringYesuserrecaptcha,定义破解 reCAPTCHA 验证码的方式
googlekeyStringYesreCAPTCHA 的 sitekey
pageurlStringYesreCAPTCHA 当前所在的 URL
invisibleInteger Default: 0No是否可见,1 代表是隐式验证码,0 代表普通验证码。
header_acaoInteger Default: 0No跨域访问配置
pingbackStringNo回调地址
jsonInteger Default: 0No返回格式,1 代表返回 JSON 格式,0 代表纯文本,默认 0
soft_idIntegerNoID of software developer. Developers who integrated their software with 2captcha get reward: 10% of spendings of their software users.
proxyStringNo代理配置

在这里我们可以构造一个 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,同样我们需要传入一些参数,其参数介绍如下:

参数类型必需描述
keyStringYesAPI KEY
actionStringYesget,表示获取验证码的结果
idIntegerYes任务 ID,就是刚才 in.php 接口返回的结果。
jsonInteger Default: 0No返回 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

Python 中更优雅的日志记录方案

2

别再造假数据了,来试试 Faker 这个库吧!

3

200 行代码实现一个滑动验证码

4‍‍

如何用一条命令将网页转成电脑 App

这里“阅读原文”,查看更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值