iT邦幫忙

0

使用无标题栏的Chrome浏览器绕过验证码

使用2Captcha和Puppeteer自动识别验证码

验证码已经在互联网上出现了十多年了。但你尝试在某个网页注册、登录或者发表评论的时候,那些曲折的线条,单词或数字会对你的浏览行为造成了蛮多的困扰。

https://ithelp.ithome.com.tw/upload/images/20191120/20122505sQFOsoo0J9.png

验证码(或告诉计算机和人类完全自动化的公共图灵测试)被设计为让人类通过和机器人(程序)通过的大门。 如今,弯曲的线条和摇摆不定的单词已经不那么普遍了,它们已被Google reCAPTCHA的第2版所取代。 只要您的人类行为测试分数足够高,这就是CAPTCHA,就会为您提供绿色的对号。

https://ithelp.ithome.com.tw/upload/images/20191120/201225051KtOOIXdAO.png

如果您的得分不超过Google的人工阈值,那么reCAPTCHA就会陷入类似拼图的图片挑战中,令人惊讶的是,实际上,它比理解几个单词更令人困扰。

https://ithelp.ithome.com.tw/upload/images/20191120/20122505LLHQ2n6BnQ.png

就像验证码对人类来说,是一种很无奈但是不得不解决的问题,但是我们还是必须理解它们,因它们做了自己的工作。另一种方式是,自动识别它们要比向他们证明自己是人类要容易得多。

2Captcha如何工作

2Captcha用几乎相同的两个API端点解决了许多不同的CAPTCHA样式。 第一个请求传递解决验证码所需的数据,并返回一个请求ID。 对于基于图像的CAPTCHA,数据将是CAPTCHA本身的base64版本图像。

https://ithelp.ithome.com.tw/upload/images/20191120/20122505kusfmhnT09.png

获得请求ID之后,您将需要将请求提交到结果端点,进行轮询直到解决方案准备就绪。

https://ithelp.ithome.com.tw/upload/images/20191120/20122505TMhPrRTsi1.png

对于reCAPTCHA v2,情况有所不同。 您仍在执行与上述相同的两步过程,但是您正在发送不同的数据。 在这种情况下,您需要发送captcha所在页面的reCAPTCHA站点密钥,该站点密钥是“ k”参数; 要找到此参数,您应该在验证码上单击“检查元素”,并找到以“ www.google.com/recaptcha/api2/anchor”开头的部分代码。 之后,可以找到“ k”参数。 如您所见,“ data-sitekey”参数与“ k”参数相同,因此您也可以发送它。

https://ithelp.ithome.com.tw/upload/images/20191120/20122505Wv3oqPneX2.png

您得到的响应是一个令牌,需要与表单一起提交,并且需要将其输入到ID为g-recaptcha-response的隐藏文本字段中。 下图显示了它的位置,并且我禁用了显示:none css属性仅用于在页面中显示它。 使其具有可编辑性,使您可以轻松地手动测试2Captcha响应,以减少测试集成的变量。

https://ithelp.ithome.com.tw/upload/images/20191120/20122505ksBeiUu0XQ.png

对于基于图像的验证码,结果几乎是即时可用的。 对于reCAPTCHA v2,最多可能需要15到30秒。

使用Puppeteer自动化

在担心CAPTCHA之前,您需要确保其他所有事项都得到照顾,在我们能够这样做之前,我们需要选择我们的武器。在这篇文章中,我们将使用Google的Chrome。

如果您不想要,甚至不需要安装Chrome,Puppeteer会提供您所需的一切,包括安装Chromium。您可以使用Chrome,如果你想它的本地安装,但是这取决于你。

旋转一下,确保所有东西都已连接好。在本练习中,我们将使Reddit的注册页面自动化,因为这是我遇到的第一个使用reCAPTCHA的页面。

在此代码中,我们在启动时指定了两个配置属性:“ headless:false”,以便我们能够看到正在执行的操作;“ defaultViewport:null”,以解决视口没有的难看的视觉故障。填满窗户。无论是无头操作重要 - 他们只是更容易看到,更重要的是,采取截图。像这个:

https://ithelp.ithome.com.tw/upload/images/20191120/20122505r4f4zRqpmX.png

那很简单!现在,我们开始运行,下一步是自动进行注册,就像没有验证码一样。这是启用无头开关的能力的地方,因为我们可以在需要时像人类一样驱动浏览器。首先,我们需要了解如何访问页面上需要操纵的元素。使您的浏览器运行,并通过Chrome的devtools(快捷方式:F12)检查加载的页面。接下来,找到我们需要处理的文本字段(快捷方式:在Mac上为⌘+ Shift + C,在Windows上为Ctrl + Shift + C)。在Reddit的情况下,我们需要能够直接访问用户名字段,2个密码字段和按钮。电子邮件字段是可选的,因此我们可以忽略它。使用puppeteer API,在文本字段中键入内容几乎是非常直观的,您只需将用于标识元素和所需字符串的选择器传递给.type()方法。

除了在Reddit页面中的按钮没有与之关联的ID之外,操作按钮的方式也非常直观,因此我们需要选择更复杂的选择器。如果您不熟悉CSS选择器,请访问Mozilla开发人员网络以快速获取摘要。

现在,当您完成脚本后,请对其进行测试以确保登录名已提交。当然,由于CAPTCHA的影响,它无法正常工作,但是我们可以测试一下挂钩是否正常工作。

https://ithelp.ithome.com.tw/upload/images/20191120/20122505oGVPrkDdsb.png

等一下!我们甚至都没有看到验证码,而JavaScript控制台却在抱怨错误。这是怎么回事自动化网页时,有许多非CATCHA障碍会妨碍您前进,其中之一正是如此之快,以至于页面破裂。当浏览器实现自动化时,它们的操纵速度比普通人可以操作的速度快许多倍,并且常常导致以开发人员未经测试的顺序执行代码(这称为竞争条件)。

Reddit的页面出现了竞争状态,其中只有在第二个密码字段成为焦点之后才呈现Google的reCAPTCHA。我们的脚本运行得如此之快,以至于焦点在reCAPTCHA脚本准备就绪之前就已发生。有许多解决方案,但是最简单的方法是增加绕过这种竞争条件所需的最小延迟。我们可以添加钩子和侦听器,以确保仅在reCAPTCHA加载后才能运行,但是Reddit开发人员本身在这种竞争条件下看起来还不错,因此我们不需要太聪明。我们可以通过多种方式来延迟,但是Puppeteer的浏览器启动选项采用“ slowMo”值,该值在全局范围内延迟了所有动作一定的时间。这是一种繁重的做法,因为它会使人偶行动的速度变慢,但这是一个很好的起点。

添加该选项后,我们会看到CAPTCHA,并且一切都恢复了正常。为了进行有趣的实验,您不妨立即解决CAPTCHA,然后看看会发生什么。由于我们使用的是Puppeteer打开的默认Chromium实例,并且我们通过自动方式对其进行控制,因此reCAPTCHA会尽最大努力证明我们不是人类。即使正确处理所有图片,您也可能会经历多个挑战。当我对此进行测试时,我必须经过10次不同的迭代才能获得绿色的对号。

幸运的是,我们有一种更简单的方法。

接线2Captcha

2Captcha需要一个注册时获取的API密钥。 您还需要存入一些资金,因为生活中一无所有。 当然,只是为了娱乐,您需要在注册时解决验证码

https://ithelp.ithome.com.tw/upload/images/20191120/20122505mKam1INslW.png

2Captcha的API通过两步过程来工作,在该过程中,您需要提交CAPTCHA数据,然后使用返回的请求ID轮询结果。由于我们正在使用reCAPTCHA v2,因此我们需要发送我之前概述的Reddit的站点密钥。我们还需要确保将方法设置为userrecaptcha并提供此reCAPTCHA位于的页面URL:
http://2captcha.com/in.php?key=YOUR_CAPTCHA_KEY&method=userrecaptcha&googlekey=6LeTnxkTAAAAAN9QEuDZRpn90WwKk_R1TRW_g-JC&pageurl=https://www.reddit.com/register/

进行此调用并获取请求ID后,您需要使用API密钥和请求ID来轮询“ res.php” URL,以获取响应:

http://2captcha.com/res.php?key=YOUR_CAPTCHA_KEY&action=get&id=YOUR_CAPTCHA_ID
如果您的验证码尚未准备好,则会收到“ CAPTCHA_NOT_READY”响应,表明您需要在一两秒钟后重试。准备就绪后,响应将是您发送的方法的适当数据。对于基于图像的验证码,这是解决方案,对于reCAPTCHA v2,这是您需要与表单输入一起发送的数据。

对于reCAPTCHA v2,解决方案时间可能会有所不同-我看到它的最快时间为15秒,最长为45秒。
获得响应数据后:

OK | 03AOLTBLQjETrnL6Wp9qNzJoYs8yAbz3hmTgeqUbkX-3x7z7R3uVdIiGMqCITr4kLj1tSyfrFEuvROxajhQtQhnKD8bqzIQ4tMqUABIgMsDvRpkTdxMVY5fgT4ph-RojnPiM56Dxm87Smgi9zkeXXxMjBdnqg-eo0k7yMoXuHc6lWBkr4eKfZYW9CxeY8T6lk7ubyym0lV4dlQsWIWGR0cab3Nx1ko65r2cO9vJ9Fb5bDNd-_2J5QuwYchd2luBaNMMC4V-5acIutNecZDZSpvT0FVVgfJUI9P7lCJPpeI53-ehsgLb2WUKzeJ7y4xhTc_b_zOBMBKNA4adtJ_5mmlI8ZQu_kEquKc10hqRXXpezk59b02A8_2aqGUbvJ5jw1cPxWo1nONgwYCNUtD4  -  x78WxcVoiT-COCVCoHN53QF6OlWQs1Z3uTgYBuIiOarJ3qoy6iMuKdM3gI9zG4NF82jycMAlTl_phskNbB3S53BsUllmVkiXtNFYb_KtED2owhKdl4bTabEcQu17IO6zFtByyJlF9_jLI1ZbBZndfUfFR5B-pTDj-bvHbWAM9dDSx-auGT7c4Nagj

您需要将结果(在“ OK |”之后)插入Reddit的注册表单中的隐藏的g-recaptcha-response文本区域。这并不像使用Puppeteer的.type()方法那样容易,因为该元素不可见并且无法获得焦点。您可以使其可见,然后使用.type(),也可以使用JavaScript将该值注入到页面中。为了使用Puppeteer将JavaScript注入页面,我们使用.evaluate()方法,该方法可以使用函数或字符串(如果传递函数,则仅使用.toString()s函数)并在页面上下文中运行它。

注入该值后,我们便准备完成注册。就这么简单。

你现在可以做什么?

撰写此帖子有两个目的:

1.告诉你验证码吸了多少

2.向您显示验证码不需要阻止您

通常,CAPTCHA会阻止不良行为者在涉及数百万个请求的攻击活动中以欺诈或恶意目的操纵内容。尽管出于很多合理的原因,您可能要以编程方式控制网站,并且如果验证码没有阻止坏人,那么他们肯定不会阻止您。


尚未有邦友留言

立即登入留言