记录一次谷歌人机验证码破解过程

前言

  哈喽,各位小伙伴,你们好呀,今天呢,咱们来说一下google,我们都知道,google是目前地表最强的搜索引擎了,我们可以借助google庞大的搜索资源找到一些自己想要的资源,可能是一些收费电影,可能是一些奇门小说,可能是某个角落的种子,不管怎么说,google搜索还是挺给力的,但是呢,有梯子的我们可能都遇到过,我们搜索的多了,会有这种情况

  这种验证码呢,叫做ReCaptcha验证码,相对来说,是比较繁琐的验证码之一

  当然了,ReCaptcha不止谷歌一家再用,国外的网站很多都是使用这种验证码,但是在国内不多,因为在国内比较容易被墙,所以用的少,但是我们是高端玩家,在自由的internet,我们怎么可能只局限于国内,下面,我们就针对ReCaptcha验证码破解

  

  测试网站:https://www.google.com/recaptcha/api2/demo

  谷歌提供的范例,实际网站验证码和这个一模一样

  ReCaptcha验证码样式

扫描二维码关注公众号,回复: 9063540 查看本文章

为什么使用第三方平台

 

  嗯,看到这可能有人会对我不屑一顾,说辣鸡才会用第三方平台,要是按照技术来划分的话,我真的辣鸡,哈哈

  但是这里要抬杠一下,并不是说用第三方平台就是辣鸡,我们可以想象一下,如果是滑动验证码,我们当然有一试的能力,python可以调用OpenCV,看看文档,当然是可以实现了,但是有个问题是,你可能针对的一个网站的滑动验证识别好了,但是可能每个网站的滑动验证码都不太一样,在用OpenCV识别的时候,可能就会识别率低的情况,要是在公司,一直完不成任务,嗯,,,等着被炒鱿鱼吧,再说,像谷歌人机个人也解决不了,没有NB的机器学习是不可能的,所以只能用第三方平台,毕竟,完成任务才是首要任务

  这里选用的第三方平台:https://2captcha.com/

为什么推荐2captcha平台

  我们先说一下现在打码平台机制都有哪些

  第一种呢,就是打码平台训练好各种各样的数据,比如,哪些是花,哪些是车,然后我们把图片发送给打码平台,他给我们结果,但是这样会有个问题,如果训练的不好,我们这边的结果也是很不好的,各种不准确,影响效果

  第二种呢,就是平台雇人,我们把整个验证码都给打码平台,平台找人帮助我们点击,然后把结果给我们,我们在登录了或者做其他

  我们可以看出来,肯定是第二种更加灵活地,现在阶段,机器再NB,至少 在验证码上准确率还是不如人的

  2captcha平台目前采用的就是第二种方式,赚取的是中间差价,但是识别率是我用过最高的,曾经因为选错了平台,一直不成功,加班加点,鼠标都被我砸坏了,,所以,选择一个合适的平台还是很重要的

所需工具

  Chromedriver:浏览器驱动,可以理解为一个没有界面的chrome浏览器

  Selenium:用于模拟人对浏览器进行点击、输出、拖拽等操作,就相当于是个人在使用浏览器,也常常用来应付反爬虫措

 

开始行动

  既来之则安之,选择了2captcha,就要看看人家的官网啦

  打开官网

  嗯...纯英文,我也看不懂..怎么办呢,别着急,我带你们一步一步分析主要功能

  

  登录账号

  登录完成后,会自动跳到主页

  第一个红色圈起来的地方表示剩余多少钱,没有钱的话记得要氪金,否则是不能用滴,氪金过程这里就不多做解释了哈,问题不大

  第二个红色圈起来的地方表示这是你的唯一key,每次请求要带上这个key的,所以要保管好

 

  进入主题,研究文档

  点击红色圈的地方,API,一般API都是文档,let's go

 

  En....什么玩意..完全看不懂,别慌,往下滑

  滑到rates,我们知道,谷歌人机是ReCaptcha,但是三个呢,到底是哪个呢,我就来带大家看看

  首先点击ReCaptcha(oldmethod),这个是老的方法,咱也不知道唉,所以就先看看这个吧,从浅到深嘛,这里呢,我都直接翻译了一下,方便我们观看

  Look,人家也说了,旧方法解决ReCaptcha准确率比较低,建议使用新方法,那我们就点击新方法去看看

  我们找到了,这种属于ReCaptcha v2验证码,确实和谷歌人机挺一样的,我们来看一下文档是怎么写的

 

  人家说,我们先找到data-sitekey参数,然后将data-sitekey参数提交到https://2captcha.com/in.php

等个15-20s再向https://2captcha.com/res.php获取结果

  然后找到id=g-recaptcha-responsetextarea标签,将display:none 这个css删除

  将给我们字符串添加到textarea输入框点击提交,就完成了

  是不是很简单,我们也来试一下

  打开谷歌的示例样式

  我们打开开发者工具,搜索data-sitekey,可以看到,真的有一个

  我们赋值一下这个data-sitekey,并且用代码获取到最后的结果

  然后我们找到 id=g-recaptcha-response textarea标签,将他的display属性删除

  但是有点不太对

  我们的

 

  2captcha的示例的

 

  我们可以看到,2captcha是个删除display之后,textarea框是直接展示出来的,但是我们删除display之后,基本没用丝毫动静,这...

  别着急,人家都想到了,我们往下滑滑

  既然我们不能直接显示出来textarea,那就说明我们是隐式的ReCaptcha验证码,其实他的原理呀,也挺简单

  如果你学过一些前端,会些js,你可能就会想到,虽然我看不到这个textarea,但是通过js我们仍然能更改textarea的数据,只是说,我们鼠标点击不了而已,人家也说了,看第一个红圈的位置,通过此js,我们我们就可以把向2captcha获取的值赋值上,第二个圈js是提交表单,其实就是我们人点击提交而已,只不过是js代码帮我们完成了,这样,我们也完成了一个偷天换日

小试牛刀

  好嘞,我们就先来手动搞一下,在上述中,我们已经根据data-sietkey拿到了最后的结果,显然,我们只能通过js完成,那么,我们就试一下

  通过上述gif看到,我们通过js,确实绕过了点击车辆识别了,其他识别,确实方便,

  但是我们不可能通过人每次这样搞呀,但是因为牵扯到了执行js,所以只能使用selenium,所以,我们来看一下selenium上的效果吧

  Look,这样,我们就针对谷歌人机(ReCaptcha)验证码,完成了自动登录,如果爬取国外的某某网站时,如果遇到了ReCaptcha,我相信一定会对你有帮助

  完整代码

import time

from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
import requests

# 常量
driver: WebDriver
USER = {}
API_KEY = "xxxxxxxxxxxxxxx"


# 初始化
def init():
    global driver
    driver = webdriver.Chrome("chromedriver.exe", desired_capabilities=None)


def open_google():
    driver.get("https://www.google.com/recaptcha/api2/demo")
    data_sitekey = driver.find_element_by_xpath('//*[@id="recaptcha-demo"]').get_attribute("data-sitekey")
    # iframe_src = driver.find_element_by_xpath('//*[@id="recaptcha-demo"]/div/div/iframe').get_attribute("src")
    # iframe_k = url_params_format(iframe_src).get("k")
    print(data_sitekey)
    page_url = "https://www.google.com/recaptcha/api2/demo"
    # print(iframe_k)
    u1 = f"https://2captcha.com/in.php?key={API_KEY}&method=userrecaptcha&googlekey={data_sitekey}&pageurl={page_url}&json=1&invisible=1"
    r1 = requests.get(u1)
    print(r1.json())
    rid = r1.json().get("request")
    u2 = f"https://2captcha.com/res.php?key={API_KEY}&action=get&id={int(rid)}&json=1"
    time.sleep(25)
    while True:
        print(u2)
        r2 = requests.get(u2)
        print(r2.json())
        if r2.json().get("status") == 1:
            form_tokon = r2.json().get("request")
            break
        time.sleep(5)
    wirte_tokon_js = f'document.getElementById("g-recaptcha-response").innerHTML="{form_tokon}";'
    submit_js = 'document.getElementById("recaptcha-demo-form").submit();'
    driver.execute_script(wirte_tokon_js)
    time.sleep(1)
    driver.execute_script(submit_js)


if __name__ == '__main__':
    init()
    open_google()
Code

  谢谢观看,谢谢支持

猜你喜欢

转载自www.cnblogs.com/HeavyShield/p/12291557.html