reCAPTCHA V2 Callback demo
This webpage doesn’t use a submit button. Instead, a callback function is automatically triggered once the reCAPTCHA challenge is successfully solved
reCAPTCHA v2 Callback blocks CI and QA runs, causing flakiness. Outsource callback resolution to a solver service via API.
How to bypass reCAPTCHA V2 Callback
Open developer's console in your browser and find element with data-sitekey attribute.
Send sitekey and pageurl to our API.
With SDK (recommended):
PHP
// https://github.com/solvercaptcha/solvecaptcha-php require(__DIR__ . '/../src/autoloader.php'); $solver = new \SolveCaptcha\SolveCaptcha('YOUR_API_KEY'); try { $result = $solver->recaptcha([ 'sitekey' => '6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u', 'url' => 'https://solvecaptcha.com/demo/recaptcha-v2-callback', ]); } catch (\Exception $e) { die($e->getMessage()); } die('Captcha solved: ' . $result->code);
Python
// https://github.com/solvercaptcha/solvecaptcha-python import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) from solvecaptcha import SolveCaptcha api_key = os.getenv('APIKEY_solvecaptcha', 'YOUR_API_KEY') solver = SolveCaptcha(api_key) try: result = solver.recaptcha( sitekey='6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u', url='https://solvecaptcha.com/demo/recaptcha-v2-callback') except Exception as e: sys.exit(e) else: sys.exit('solved: ' + str(result))
Java
// https://github.com/solvercaptcha/solvecaptcha-java package examples; import com.solvecaptcha.SolveCaptcha; import com.solvecaptcha.captcha.reCAPTCHA; public class reCAPTCHAV2Example { public static void main(String[] args) { SolveCaptcha solver = new SolveCaptcha("YOUR_API_KEY"); ReCaptcha captcha = new ReCaptcha(); captcha.setSiteKey("6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u"); captcha.setUrl("https://solvecaptcha.com/demo/recaptcha-v2-callback"); try { solver.solve(captcha); System.out.println("Captcha solved: " + captcha.getCode()); } catch (Exception e) { System.out.println("Error occurred: " + e.getMessage()); } } }
C#
// https://github.com/solvercaptcha/solvecaptcha-csharp using System; using System.Linq; using SolveCaptcha.Captcha; namespace SolveCaptcha.Examples { public class reCAPTCHAV2Example { public static void Main() { SolveCaptcha solver = new SolveCaptcha("YOUR_API_KEY"); ReCaptcha captcha = new ReCaptcha(); captcha.SetSiteKey("6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u"); captcha.SetUrl("https://solvecaptcha.com/demo/recaptcha-v2-callback"); try { solver.Solve(captcha).Wait(); Console.WriteLine("Captcha solved: " + captcha.Code); } catch (AggregateException e) { Console.WriteLine("Error occurred: " + e.InnerExceptions.First().Message); } } } }
Go
// https://github.com/solvercaptcha/solvecaptcha-go package main import ( "fmt" "log" "github.com/solvecaptcha/solvecaptcha-go" ) func main() { client := apisolvecaptcha.NewClient("API_KEY") captcha := apisolvecaptcha.ReCaptcha{ SiteKey: "6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u", Url: "https://solvecaptcha.com/demo/recaptcha-v2-callback", } code, err := client.Solve(captcha.ToRequest()) if err != nil { log.Fatal(err); } fmt.Println("code "+code) }
C++
// https://github.com/solvercaptcha/solvecaptcha-cpp #include #include "curl_http.hpp" #include "apisolvecaptcha.hpp" int main (int ac, char ** av) { apisolvecaptcha::curl_http_t http; http.set_verbose (true); apisolvecaptcha::client_t client; client.set_http_client (&http); client.set_api_key (API_KEY); apisolvecaptcha::recaptcha_t cap; cap.set_site_key ("6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u"); cap.set_url ("https://solvecaptcha.com/demo/recaptcha-v2-callback"); try { client.solve (cap); printf ("code '%s'\n", cap.code ().c_str ()); } catch (std::exception & e) { fprintf (stderr, "Failed: %s\n", e.what ()); } return 0; }
Ruby
// https://github.com/solvercaptcha/solvecaptcha-ruby require 'api_solvecaptcha' client = ApiSolveCaptcha.new("YOUR_API_KEY") result = client.recaptcha_v2({ googlekey: '6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-', pageurl: 'https://mysite.com/page/with/recaptcha_v2' })
Manually:
Send GET or POST request to our API URL: https://solvecaptcha.com/in.php with method set to userrecaptcha and provide the value found on previous step as value for googlekey and full page URL as value for pageurl. Request example:
GET https://solvecaptcha.com/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u&pageurl=http://solvecaptcha.com/demo/recaptcha-v2-callback
If everything is fine server will return the ID of your captcha:
OK|2122988149
Otherwise server will return an error code. After 15-20 seconds send GET request to get the result:
GET https://solvecaptcha.com/res.php?key=YOUR_API_KEY&action=get&id=2122988149
If captcha is already solved server will respond with the answer token:
OK|03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q
If captcha is not solved yet server will return CAPCHA_NOT_READY result. Repeat your request in 5 seconds. If something went wrong server will return an error code.
In developer's console, execute the callback function verifyDemoRecaptcha passing the token string as an argument like: verifyDemoRecaptcha('TOKEN'). Please note that each website has own reCAPTCHA implementation with unique callback definition and the callback function name will be different from our demo, or even an anonymous function can be used.