Search code examples
pythonseleniumrecaptcha

Injecting token received from anticaptcha for recaptcha v2 using selenium python


I am using anticaptcha to help out with bypassing recaptcha on a webpage I'm crawling.

I have managed to work out the api part of this solution. It's quite straightforward. The part I am struggling with is the injection of the token received from anti-captcha into the webpage.

Haven't found too many resources on this. I am using Selenium and Python alongside the anticaptchaofficial module.

The script I am executing does change the innerHtml of the textarea with id g-recaptcha-response but the webpage does nothing and the checkbox doesn't load the spinner or get verified. Here's my code:

from anticaptchaofficial.recaptchav2proxyless import recaptchaV2Proxyless

from selenium import webdriver

import os
import time

driver = webdriver.Chrome(os.path.normpath(os.getcwd()+"\\chromedriver.exe"))
driver.get("https://www.google.com/recaptcha/api2/demo")
time.sleep(1)

data_sitekey = driver.find_element_by_class_name('g-recaptcha').get_attribute('data-sitekey')

solver = recaptchaV2Proxyless()
solver.set_verbose(1)
solver.set_key("<--my-key-->")
solver.set_website_url("https://www.google.com/recaptcha/api2/demo")
solver.set_website_key(data_sitekey)

g_response = solver.solve_and_return_solution()

driver.execute_script('document.getElementById("g-recaptcha-response").innerHTML = "{}";'.format(g_response)) # target textarea that is supposed to be injected with the token, I found upon some research
driver.execute_script("onSuccess('{}')".format(g_response))
time.sleep(1)

Solution

  • Turns out I was under the assumption that the recaptcha frame would show visible feedback on injection of the token (or some other equivalent action) but it turns out just the line:

    driver.execute_script('document.getElementById("g-recaptcha-response").innerHTML = "{}";'.format(g_response))

    which updates the textarea's innerHtml is enough. So you would basically need to continue with your task ie: click submit, if it is a recaptcha on form or reload the page if it is just randomly triggered

    from anticaptchaofficial.recaptchav2proxyless import recaptchaV2Proxyless
    
    from selenium import webdriver
    
    import os
    import time
    
    driver = webdriver.Chrome(os.path.normpath(os.getcwd()+"\\chromedriver.exe"))
    driver.get("https://www.google.com/recaptcha/api2/demo")
    time.sleep(1)
    
    data_sitekey = driver.find_element_by_class_name('g-recaptcha').get_attribute('data-sitekey')
    
    solver = recaptchaV2Proxyless()
    solver.set_verbose(1)
    solver.set_key("<--my-key-->")
    solver.set_website_url("https://www.google.com/recaptcha/api2/demo")
    solver.set_website_key(data_sitekey)
    
    g_response = solver.solve_and_return_solution()
    
    driver.execute_script('document.getElementById("g-recaptcha-response").innerHTML = "{}";'.format(g_response)) 
    
    time.sleep(1)
    
    # whatever the next step is. Could be clicking on a submit button
    driver.refresh()