使用python selenium解决谷歌验证码(reCAPTCHA)


不止于python ]

https://2captcha.com/
不但支持reCAPTCHA, 还支持 TikTok等等验证, 功能齐全, 但比较贵
  • http://yescaptcha.365world.com.cn/
    只支持reCAPTCHA验证, 目前V3版本验证质量一般, 价格美丽, 而且注册就送1500点数, 一次15点数, 可以调用100次, 充值的话是1元1000点
    下面以yescaptcha为例, 说一下如何使用(两个平台验证流程几乎相同)
  • http://yescaptcha.365world.com.cn/ 注册后会生成一个token
    file
    REFERER: 网站验证的referer, 找到xxxx/api.js的请求
    file
    SITE_KEY: 找到ancher的请求
    file
    或者查看网页源代码, 找到 data-sitekey
    file

  • 创建验证码任务
    url : http://api.yescaptcha.365world.com.cn/v3/recaptcha/create
    参数:

  •  

    参数名

    是否必须

    说明

    token

    请在个人中心获取 (Token)

    siteKey

    ReCaptcha SiteKey (固定参数)

    siteReferer

    ReCaptcha Referer (一般也为固定参数)

    captchaType

    (验证码版本)

    ReCaptchaV2(默认) / ReCaptchaV3

    不知道是哪一种看后面的说明

    ReCaptchaV3 V3必填

    siteAction

    ReCaptchaV3 必填 Action动作 默认verify

    minScore

    ReCaptchaV3 选填 最小分数(0.1-0.9)

     

    代码

    会返回一个任务id, 用于获取验证结果

    file

    1. 获取任务结果
      url: http://api.yescaptcha.365world.com.cn/v3/recaptcha/status
      参数:

    参数名

    是否必须

    说明

    taskId

    创建任务获取到的ID

    代码

    file

    https://shimowendang.com/docs/5o4z8XhhvsUSzYFa/read

    非回调:
    在页面上可以看到验证, 验证完后, 然后可以点击登录, 就像我们正在验证的demo网站
    file

    代码:
    https://shimowendang.com/docs/vQRuIEUiT5ocoAZ9/read

    1. 直接在页面上验证
      打开控制台, 搜索 g-recaptcha-response的文本框元素
      file

    这样就不验证也可以直接点击提交
    file

    跳转到验证成功页面
    file

    完整代码

    # -*- coding: utf-8 -*-
    import requests
    import time
    
    class ReCAPTCHA(object):
        # Token
        TOKEN = 'xxxxxxxxxx'
        REFERER = 'https://www.google.com/recaptcha/api2/demo'
        BASE_URL = 'http://api.yescaptcha.365world.com.cn'
        # Site Key
        SITE_KEY = '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-'
        CREATE_TASK_URL = f"{BASE_URL}/v3/recaptcha/create?token={TOKEN}&siteKey={SITE_KEY}&siteReferer={REFERER}"
        GET_TOKEN_URL = "{BASE_URL}/v3/recaptcha/status?token={TOKEN}&taskId={task_id}"
        TASK_ID = None
    
        @classmethod
        def create_task(cls):
            try:
                response = requests.get(cls.CREATE_TASK_URL)
                if response.status_code == 200:
                    data = response.json()
                    cls.TASK_ID = data.get('data', {}).get('taskId')
                    print(f"Task created, ID:{cls.TASK_ID}")
            except requests.RequestException as e:
                print(f'Create task failed:{e}')
    
        @classmethod
        def get_token(cls, task_id=None, retry_times=120):
            if not task_id:
                cls.create_task()
            task_id = task_id or cls.TASK_ID
            if not task_id:
                print("Not found task id")
                return False
    
            print(f"Start pull task:{task_id} result")
            url = cls.GET_TOKEN_URL.format(BASE_URL=cls.BASE_URL, TOKEN=cls.TOKEN, task_id=task_id)
            count = 0
            while count < retry_times:
                try:
                    response = requests.get(url)
                    if response.status_code == 200:
                        data = response.json()
                        status = data.get('data', {}).get('status')
                        print('task status', status)
                        if status == 'Success':
                            return data.get('data', {}).get('response')
                except requests.RequestException as e:
                    print('task failed', e)
                finally:
                    count += 1
                    time.sleep(1)
    
    def verify(response_token):
        url = "https://www.google.com/recaptcha/api2/demo"
        data = {
            "g-recaptcha-response": response_token
        }
        response = requests.post(url, data=data)
        if response.status_code == 200:
            print("Verify Success")
            return response.text
    
    if __name__ == "__main__":
        token = ReCAPTCHA.get_token()
        print(token)
        verify(token)
    

    运行结果
    file