`
jsczxy2
  • 浏览: 1260590 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

如何在程序中处理reCAPTCHA?

阅读更多

可以使用人工打码平台进行破解:

http://deathbycaptcha.com

 

本文不是讲如何破解谷歌的reCAPTCHA(实际上我们也办不到),而是介绍在程序中借助第三方(人工)打码平台顺利通过reCAPTCHA验证。
由于使用人工打码会产生费用,并且费用是和调用次数成正比的,所以本方法仅适用于reCAPTCHA出现频率比较低的场景,例如:
1)网站登录使用了reCAPTCHA。比如,有时Linkedin登录就会出现reCAPTCHA(如下图所示),验证当前客户端是否是“真人”。

2)网站对访问频率过快的客户端返回reCAPTCHA,通过验证后即可继续访问。比如Zocdoc.com这个网站。

下面进入正题。如何在程序中借助第三方(人工)打码平台通过reCAPTCHA验证?
因为reCAPTCHA表单是JS动态创建的,我们遇到的第一个难题就是如何获取到reCAPTCHA表单中的验证码图片的路径及各隐藏表单域的值。
1)一个办法就是使用类似webkit的浏览器模拟工具(例如,phantomjs)加载页面,这样就能直接获取到JS生成的HTML源码。但是实现起来比较复杂,还需要借助第三方的软件。
2)查看源码会发现如果页面禁用了JS,reCAPTCHA将使用iframe模式加载(如下示),此时验证码图片路径和各表单项都是直接可见的。

<noscript> <iframe src="https://www.google.com/recaptcha/api/noscript?k=******" height="300" width="500" frameborder="0"></iframe> <br><textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea> </noscript>

所以我们直接请求“https://www.google.com/recaptcha/api/noscript?k=******”即可获取到验证码的图片路径和其它隐藏表单域的值。
这个问题解决了。接下来我们要获取到验证码图片对应的明文。如何调用第三方打码平台进行图片验证码识别呢?
我们需要先下载验证码图片,再把图片的二进制数据上传给打码平台,然后等待平台人工打码返回明文。打码平台一般都提供了供各种常见语言调用的API,所以该过程也比较简单。
现在我们已经获取到验证码图片对应的明文,只要我们将其和其它隐藏表单域参数一起提交就能完成验证过程了。

闲话不多说,还是直接上代码比较实在(Python实现, 这是我们真实项目中用到的):

  1. # coding: utf-8  
  2. # recaptcha.py  
  3.   
  4. import sys  
  5. import os  
  6. os.chdir(os.path.dirname(os.path.realpath(sys.argv[0])))  
  7. import re  
  8. import StringIO  
  9. import deathbycaptcha  
  10. from urlparse import urljoin  
  11. from webscraping import common, xpath  
  12.   
  13. DEATHBYCAPTCHA_USERNAME = '******'  
  14. DEATHBYCAPTCHA_PASSWORD = '******'  
  15.   
  16. def read_captcha(image):  
  17.     """image - fileobj, the captcha to be recognized 
  18.     """  
  19.     client = deathbycaptcha.SocketClient(DEATHBYCAPTCHA_USERNAME, DEATHBYCAPTCHA_PASSWORD)  
  20.     try:  
  21.         balance = client.get_balance()  
  22.         # Put your CAPTCHA file name or file-like object, and optional  
  23.         # solving timeout (in seconds) here:  
  24.         common.logger.info('Submit captcha to http://deathbycaptcha.com/.')  
  25.         captcha = client.decode(image)  
  26.         if captcha:  
  27.             # The CAPTCHA was solved; captcha["captcha"] item holds its  
  28.             # numeric ID, and captcha["text"] item its text.  
  29.             common.logger.info("CAPTCHA %s solved: %s" % (captcha["captcha"], captcha["text"]))  
  30.             return captcha["text"].strip()  
  31.     except deathbycaptcha.AccessDeniedException:  
  32.         # Access to DBC API denied, check your credentials and/or balance  
  33.         common.logger.info('Access to DBC API denied, check your credentials and/or balance')  
  34.   
  35. def solve_recaptcha(html, D):  
  36.     """To solve the Google recaptcha 
  37.     """  
  38.     m = re.compile(r']+src="(https?://www\.google\.com/recaptcha/api/noscript\?k=[^"]+)"', re.IGNORECASE).search(html)  
  39.     if m:  
  40.         common.logger.info('Need to solve the recaptcha.')  
  41.         # need to solve the captcha first  
  42.         iframe_url = m.groups()[0]  
  43.         # load google recaptcha page  
  44.         iframe_html = D.get(iframe_url, read_cache=False)  
  45.         # extract recaptcha_challenge_field value for future use  
  46.         recaptcha_challenge_field = xpath.get(iframe_html, '//input[@id="recaptcha_challenge_field"]/@value')  
  47.         if recaptcha_challenge_field:  
  48.             # extract captcha image link  
  49.             captcha_image_url = xpath.get(iframe_html, '//img/@src')  
  50.             if captcha_image_url:  
  51.                 captcha_image_url = urljoin(iframe_url, captcha_image_url)  
  52.                 # download captcha  
  53.                 captcha_bytes = D.get(captcha_image_url, read_cache=False)  
  54.                 if captcha_bytes:  
  55.                     #open('captcha.jpg', 'wb').write(captcha_bytes)  
  56.                     fileobj = StringIO.StringIO(captcha_bytes)  
  57.                     # read the captcha via deathbycaptcha  
  58.                     recaptcha_response_field = read_captcha(fileobj)  
  59.                     if recaptcha_response_field:  
  60.                         common.logger.info('Have got the captcha content = "%s".' % str(recaptcha_response_field))  
  61.                         url = 'https://www.linkedin.com/uas/captcha-submit'  
  62.                         post_data = {}  
  63.                         captcha_form = xpath.get(html, '//form[@name="captcha"]')  
  64.                         for input_name, input_value in re.compile(r']+type="hidden"\s+name="([^<>\"]+)"\s+value="([^<>\"]+)"').findall(captcha_form):  
  65.                             post_data[input_name] = input_value  
  66.                         post_data['recaptcha_challenge_field'] = recaptcha_challenge_field  
  67.                         post_data['recaptcha_response_field'] = recaptcha_response_field                         
  68.                         return D.get(url, data=post_data, read_cache=False)  
分享到:
评论

相关推荐

    谷歌reCAPTCHA验证不显示的处理方法

    很多国外网站采用了Google的reCaptcha验证,但在国内上网是无法显示该验证的,即使用梯子也无法解决,可以采用谷歌浏览器插件来解决此问题 使用谷歌浏览器,打开 设置---&gt;扩展程序,勾选开发者模式,把Header ...

    2024.3.14谷歌reCAPTCHA验证不显示的处理方法

    很多国外网站采用了Google的reCaptcha验证,但在国内上网是无法显示该验证的,即使用梯子也无法解决,可以采用谷歌浏览器插件来解决此问题 使用谷歌浏览器,打开 设置---&gt;扩展程序,勾选开发者模式,把Header ...

    谷歌reCAPTCHA验证不显示的处理方法真好用

    使用谷歌浏览器,打开 设置---&gt;扩展程序,勾选开发者模式,把Header Editor....很多国外网站采用了Google的reCaptcha验证,但在国内上网是无法显示该验证的,即使用梯子也无法解决,可以采用谷歌浏览器插件来解决此问题

    WP-reCAPTCHA – 创意绝佳的防Spam的 WordPress 插件

    如何在其它类型的博客中使用reCAPTCHA呢? reCAPTCHA 可以用于各种主流编程语言,如PHP、ASP.Net、Perl以及常见程序,如Wordpress、phpBB、Joomla、MediaWiki。你只需点击相应的链接就可以获取到想要的 reCAPTCHA ...

    ReCaptcha:适用于iOS的[In]可见ReCaptcha v2

    该库会自动处理ReCaptcha的事件并检索验证令牌,或者在无法进行隐形的情况下通知您提出挑战。 警告 :warning: 请注意,该库仅适用于ReCaptcha v2隐形键! 创建时,请确保选中reCAPTCHA v2不可见标志选项。 您将...

    ember-cli-google-recaptcha:适用于Google reCAPTCHA的ember-cli插件

    ember-cli-google-recaptcha 使用Google reCAPTCHA服务的EmberJS插件 注意 该存储库已被弃用,该项目已移至 。 产品特点 同一页面上以及不同页面上的多个reCAPTCHA组件。 多个站点密钥和一个默认...在使用reCAPTCHA之

    magnolia-recaptcha2:Google ReCaptcha2服务的Magnolia模块

    在此模块中,我们提供了类,注释和表单处理程序,可轻松快速地使用Google ReCaptcha2 API。 特征 Freemarker宏用法 要使用此模块,请将其包含在模块依赖项中。 在freemarker模板中,您可以通过包含[#include“ /...

    ember-google-recaptcha:适用于Emberjs的Google Recaptcha

    资源安装在命令行中,运行以下命令 npm install ember-google-recaptcha配置先决条件:从设置并生成正确的API密钥在应用程序的config/environment.js的ENV变量中,添加以下属性 var ENV = { ... googleRecaptcha: { ...

    Ajax Contact Form reCaptcha -No Redirect:一页联系表格,显示错误和成功。 PHP处理脚本-开源

    此Ajax联系人表单用于显示错误消息,该表单已成功发送,并通过易于使用的Google v2 reCaptcha增强了安全性,从而避免了僵尸程序向该表单发送垃圾邮件。 仅需进行两次更改,您就可以通过电子邮件发送到邮件脚本,并在...

    project:所有技术在一起

    项目所有技术在一起PHP 验证码Recaptcha AES加密JAVA / PHP 类扩展类父级{}类父级实现接口{}类子级扩展父级{}JavaPDF到文本转换器文本到PDF转换器使用gmail smtp发送电子邮件定制的异常处理程序定制的记录器模式...

    bandwidth-saver-server:我的远程上传应用程序的后端,允许直接上传到Dropbox和OneDrive

    以及从同一主机(Heroku)检索和更新托管在PostGreSQL数据库中的用户配额限制。 有关此应用程序及其运行方式的更多信息,请参见-https: 。 科技栈 这是一个使用express.js服务器框架的Node.js后端。 Knex用于与...

    gothic:th Gothic是用户注册和身份验证SWT微服务。 它通过Gorm支持REST,gRPC和gRPC Web API,reCAPTCHA和各种数据库

    基本思想是支持GoTrue的大多数现有功能,同时对其进行现代化升级,并扩展对其他外部提供程序和功能的支持。 在某种程度上,以功能奇偶性(或多或少)为目标从头开始是更有意义的。 GroTrue依靠自己的自定义实现来...

    matlab代码加注释-ostrichinator:鸵鸟

    Flask,可处理来自用户的请求并将作业传递给后端,后端在基于MatConvNet和minConf的MATLAB中实现。 前端 与大多数其他基于Flask的简单Web应用程序一样,Ostrichinator的前端通过两个文件简洁地实现: frontend.py和...

    workers-queue

    (您需要KV访问权限)以处理实际服务Azure Cosmos数据库来处理会话具有私有应用程序的Shopify商店,具有以下范围read_products,write_customers,write_draft_orders以创建客户可以在其上结帐的订单Discord机器人来...

    Furry Network Notifier-crx插件

    登录页面现在使用FurryNetwork站点本身(用于新的reCaptcha)2.0.4中的更改:-FurryNetwork api不再处于beta中2.0.3中的更改:-在弹出窗口弹出时在后台加载通知打开-重新添加到通知页面的链接2.0.2中的更改:-更好地...

    vue-crud-x:Vue + Express食谱和CRUD组件(带有Vite和Web组件)

    :无捆绑程序,可扩展的VueJS应用程序,示例代码(签名上传,JWT刷新令牌,OTP),recaptcha,Github OAuth2登录名,Web组件表和表格 :Web组件,传单地图,ECharts,网络摄像头,签名画布,PWA, ,JWT刷新令牌,...

    imagehost-client

    为了实现拖放,我使用了ref和本机DOM事件处理程序dragenter , dragleave , dragover和drop 。 我使用了dragenter和dragover添加了一个类,以在用户拖动dragleave时提供视觉反馈, dragleave删除这些类,然后drop...

    abstract_anticafe:小桌预订服务

    该项目是一个用于在公共场所预订桌子的Web服务:反咖啡馆,联合办公,咖啡馆,餐馆,水烟房等。 Web服务的风格是极简主义。 没有垃圾内容,如评分系统,无用的“共享”按钮(完全使用了它们),来自不适当人员的...

    phpBB 3.3.3 简体中文

    [PHPBB3-16677]-下拉容器中的事件处理程序在移动视图中不起作用;[PHPBB3-16679]-登录表单应遵守“允许重置密码”的设置。改进[PHPBB3-15722]-允许论坛topicrow分页使用topicrow值;[PHPBB3-16538]-添加MySQL 8测试...

    leetcode不能提交-LCSubmit:LC提交

    您可以在cookies.ini文件中手动输入您的csrftoken和LEETCODE_SESSION ,以便程序正确运行。 或者让程序从您的chrome browser读取这些 cookie 信息(暂时) 功能运行有 1 秒的回退时间,以防止从网站上获得速率限制,...

Global site tag (gtag.js) - Google Analytics