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


    前言

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

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

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

      

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

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

      ReCaptcha验证码样式

    为什么使用第三方平台

     

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

      但是这里要抬杠一下,并不是说用第三方平台就是辣鸡,我们可以想象一下,如果是滑动验证码,我们当然有一试的能力,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

      谢谢观看,谢谢支持

  • 相关阅读:
    游戏开发流程梳理
    游戏主策化项目进度管控
    游戏主策化项目开发流程
    设计思想之时间和成长理论
    各类监听时间整理
    Django:学习笔记(1)——开发环境配置
    CNN学习笔记:目标函数
    Keras实践:手写数字识别
    Keras实践:实现非线性回归
    CNN学习笔记:卷积神经网络
  • 原文地址:https://www.cnblogs.com/HeavyShield/p/12291557.html
Copyright © 2020-2023  润新知