Menu

چالش جدید کد QR در Recaptcha به‌صورت بومی توسط Anti-Captcha پشتیبانی می‌شود

تیم Anti-Captcha تأیید کرده است که چالش Recaptcha با یک کد QR جدید به‌صورت بومی توسط سرویس ما پشتیبانی می‌شود. هیچ تغییری در یکپارچه‌سازی شما لازم نیست: از آنجا که هر کپچا در Anti-Captcha توسط افراد واقعی حل می‌شود، کارگران ما این چالش جدید را همان‌طور که یک بازدیدکننده‌ی عادی وب‌سایت انجام می‌دهد، مدیریت می‌کنند.

چالش جدید کد QR در Recaptcha به‌صورت بومی توسط Anti-Captcha پشتیبانی می‌شود

چالش کد QR در Recaptcha چیست

گوگل این چالش جدید را در تابستان ۲۰۲۶ معرفی کرد. در حال حاضر پیش از عرضه برای همه مشتریان Recaptcha، در حالت بسته روی مجموعه‌ای محدود از وب‌سایت‌ها در حال آزمایش است. به‌جای انتخاب تصاویر یا زدن تیک یک چک‌باکس، به کاربر یک کد QR نمایش داده می‌شود و از او خواسته می‌شود تأیید را روی گوشی موبایل خود کامل کند. چالش کد QR به یک نسخه واحد از Recaptcha وابسته نیست: هم در وب‌سایت‌هایی که از Recaptcha V2 استفاده می‌کنند و هم در وب‌سایت‌هایی که از Recaptcha V3 استفاده می‌کنند ظاهر می‌شود.

ایده‌ی پشت آن ساده است: برای یک ربات نسبتاً ارزان است که یک مرورگر دسکتاپ را شبیه‌سازی کند، اما شبیه‌سازی یک گوشی هوشمند فیزیکی واقعی با دوربین، یک سیستم‌عامل اصیل و دسترسی به فروشگاه‌های رسمی اپلیکیشن بسیار دشوارتر است.

ویژگی‌های فنی

  • با محوریت موبایل. این چالش را نمی‌توان در همان مرورگری که نمایش داده می‌شود تکمیل کرد. تأیید به یک دستگاه جداگانه — گوشی هوشمند کاربر — منتقل می‌شود و مرورگر فقط منتظر تأیید می‌ماند.
  • با دوربین گوشی اسکن می‌شود. کد QR با اپلیکیشن دوربین معمولی گوشی اسکن می‌شود. به هیچ اسکنر QR شخص ثالثی نیاز نیست: دوربین کد را تشخیص می‌دهد و پیشنهاد می‌کند که تأیید را باز کند.
  • توسط مینی‌اپ‌های Google Play و App Store حل می‌شود. اسکن کد یک مینی‌اپ سبک را که از طریق Google Play (اندروید با Google Play Services 25.41.30) یا App Store (iOS 15/16+) توزیع می‌شود، اجرا می‌کند. مینی‌اپ بدون نصب کامل بلافاصله باز می‌شود و تأیید را روی دستگاه انجام می‌دهد.
  • تأیید گره‌خورده به دستگاه. نتیجه به یک دستگاه فیزیکی واقعی گره خورده است که خودکارسازی این چالش با مرورگرهای headless، شبیه‌سازها یا حل‌کننده‌های مبتنی بر هوش مصنوعی را بسیار دشوار می‌کند.

چگونه کارگران Anti-Captcha آن را مدیریت می‌کنند

ما یک آزمایش داخلی میان کارگران Anti-Captcha انجام دادیم: حدود ۵۰٪ از آن‌ها توانستند چالش جدید را بلافاصله حل کنند با استفاده از گوشی‌های خودشان، بدون هیچ دستورالعمل یا آماده‌سازی اضافی. بقیه بیشتر نیاز دارند سیستم‌عامل خود را به‌روزرسانی کنند یا به یک دستگاه پشتیبانی‌شده تغییر دهند که موضوعی زمانی است نه یک مانع واقعی.

دقیقاً همین‌جاست که یک سرویس مبتنی بر نیروی انسانی بر حل‌کننده‌های خودکار برتری دارد. فردی با یک گوشی هوشمند معمولی این چالش را در چند ثانیه تکمیل می‌کند، در حالی که یک ربات باید مزرعه‌ای از دستگاه‌های واقعی را به کار بگیرد تا همان کار را انجام دهد.

این برای مشتریان ما چه معنایی دارد

شما به همان روشی که اکنون انجام می‌دهید، به ارسال وظایف Recaptcha V2 یا V3 ادامه می‌دهید. وقتی یک وب‌سایت چالش کد QR را نمایش می‌دهد، توسط کارگران ما روی گوشی‌هایشان حل می‌شود و شما یک توکن g-recaptcha-response معمولی را در نتیجه وظیفه دریافت می‌کنید.

چگونه بفهمیم یک وب‌سایت از کدام نسخه Recaptcha استفاده می‌کند

صفحه دارای captcha را در Chrome باز کنید، کنسول توسعه‌دهنده را باز کنید (F12، سپس تب Console)، اسکریپت زیر را جای‌گذاری کنید و Enter را بزنید. آن را پس از ظاهر شدن captcha روی صفحه اجرا کنید، برای مثال پس از کلیک روی دکمه ارسال فرم.

(() => {
  const out = { scripts: [], iframes: [], clients: [], verdict: [] };

  // 1. Loaded Recaptcha scripts
  document.querySelectorAll('script[src*="recaptcha"]').forEach(s => {
    const u = new URL(s.src, location.href);
    out.scripts.push({
      src: u.pathname,
      enterprise: u.pathname.includes('enterprise'),
      render: u.searchParams.get('render'),
    });
  });

  // 2. Anchor-iframe
  document.querySelectorAll('iframe[src*="/anchor"]').forEach(f => {
    const u = new URL(f.src);
    out.iframes.push({
      enterprise: u.pathname.includes('/enterprise/'),
      sitekey: u.searchParams.get('k'),
      size: u.searchParams.get('size'),
      action: u.searchParams.get('sa'),
      s: u.searchParams.has('s'),
    });
  });

  // 3. Internal config: look for objects with a sitekey
  const seen = new WeakSet();
  const walk = (o, depth = 0) => {
    if (!o || typeof o !== 'object' || seen.has(o) || depth > 6) return;
    seen.add(o);
    if (typeof o.sitekey === 'string') {
      out.clients.push({
        sitekey: o.sitekey,
        size: o.size,
        action: o.action,
        callback: typeof o.callback === 'function' ? o.callback.name || 'fn'
                 : o.callback || null,
        badge: o.badge,
      });
    }
    for (const k in o) { try { walk(o[k], depth + 1); } catch {} }
  };
  try { walk(window.___grecaptcha_cfg?.clients); } catch {}

  // 4. Verdict
  const renderKey = out.scripts.find(s => s.render && s.render !== 'explicit' && s.render !== 'onload');
  const ent = out.scripts.some(s => s.enterprise) || !!window.grecaptcha?.enterprise;
  if (renderKey) out.verdict.push(`v3/score (render=${renderKey.render})`);
  out.iframes.forEach(i => {
    if (i.size === 'normal' || i.size === 'compact') out.verdict.push(`v2 checkbox (${i.sitekey})`);
    else if (i.size === 'invisible' && (!renderKey || renderKey.render !== i.sitekey))
      out.verdict.push(`v2 invisible (${i.sitekey})`);
  });
  if (ent) out.verdict.push('Enterprise');

  console.table(out.scripts);
  console.table(out.iframes);
  console.table(out.clients);
  console.log('VERDICT:', out.verdict.length ? out.verdict.join(' | ') : 'not found (the captcha may not be loaded yet)');
  return out;
})();

این اسکریپت اسکریپت‌های Recaptcha، ویجت‌ها و تنظیمات آن‌ها (sitekey، size، action) را به‌صورت جدول چاپ می‌کند و سپس یک خط VERDICT می‌آید:

  • v3/score — Recaptcha V3: مقدار sitekey در پارامتر render اسکریپت Recaptcha ارسال می‌شود.
  • v2 checkbox / v2 invisible — Recaptcha V2 با یک چک‌باکس یا یک ویجت نامرئی.
  • Enterprise — وب‌سایت از Recaptcha Enterprise (اسکریپت enterprise.js) استفاده می‌کند.

از sitekey موجود در خروجی به‌عنوان کلید وب‌سایت، و از مقدار action، در صورت وجود، به‌عنوان اکشن صفحه در نمونه‌کدهای زیر استفاده کنید.

نمونه‌کدها

نسخه Recaptcha یافت‌شده در وب‌سایت را انتخاب کنید:

Python
Node.js
Go
PHP
Java
Kotlin
C#
C++
Rust
Ruby
bash

چگونه Recaptcha QR را در Python حل کنیم

#pip3 install anticaptchaofficial

from anticaptchaofficial.recaptchav2enterpriseproxyless import *

solver = recaptchaV2EnterpriseProxyless()
solver.set_verbose(1)
solver.set_key("YOUR_API_KEY_HERE")
solver.set_website_url("https://website.com")
solver.set_website_key("YOUR_API_KEY_HERE")
# set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
solver.set_is_invisible(True)
# Set page action value:
solver.set_enterprise_payload({"action": "form_submit"})

g_response = solver.solve_and_return_solution()
if g_response != 0:
    print("g-response: "+g_response)
    # user-agent in case you need it:
    print("user-agent: "+solver.get_user_agent())
else:
    print("task finished with error "+solver.error_code)

چگونه Recaptcha QR را در Node.js حل کنیم

//npm install @antiadmin/anticaptchaofficial
//https://github.com/anti-captcha/anticaptcha-npm

const ac = require("@antiadmin/anticaptchaofficial");

ac.setAPIKey('YOUR_API_KEY_HERE');

ac.solveRecaptchaV2EnterpriseProxyless(
    'http://DOMAIN.COM',
    'WEBSITE_KEY',
    {
        "action": "form_submit" // set page action value here
    },
    true)  // set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
    .then(gresponse => {
        console.log('g-response: '+gresponse);
    })
    .catch(error => console.log('test received error '+error));

// in case you need it
console.log("worker's user-agent:");
console.log(ac.getUserAgent());

چگونه Recaptcha QR را در Go حل کنیم

// Install with:
// go get github.com/anti-captcha/anticaptcha-go
package main

import (
    "fmt"
    "github.com/anti-captcha/anticaptcha-go"
    "log"
)

func main() {
    // Create API client and set the API Key
    ac := anticaptcha.NewClient("API_KEY_HERE")

    // set to 'false' to turn off debug output
    ac.IsVerbose = true

    // Make sure the API key funds balance is positive
    balance, err := ac.GetBalance()
    if err != nil {
        log.Fatal(err)
        // Exit program to make sure you don't DDoS API with requests, while having empty balance
        return
    }
    fmt.Println("Balance:", balance)

    // Solve Recaptcha V2 Enterprise without proxy
    solution, err := ac.SolveRecaptchaV2Enterprise(anticaptcha.RecaptchaV2{
        WebsiteURL:  "https://huev.com/",
        WebsiteKey:  "6Lcyu8UZAAAAACwSh6Xf58WrNXTu0LLu4F85xf20",
        IsInvisible: true, // set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
        EnterprisePayload:  map[string]interface{}{
            "action": "form_submit", // set page action here
        },
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Recaptcha Enterprise g-response token:", solution)
}

چگونه Recaptcha QR را در PHP حل کنیم

//git clone https://github.com/anti-captcha/anticaptcha-php.git

include("anticaptcha.php");
include("recaptchaV2Enterpriseproxyless.php");

$api = new Recaptchav2enterpriseProxyless();
$api->setVerboseMode(true);

//your anti-captcha.com account key
$api->setKey("YOUR_API_KEY_HERE");

//target website address
$api->setWebsiteURL("http://enteprisedomain.com/recaptcha/test.php");

//recaptcha key from target website
$api->setWebsiteKey("ENTERPRISE_SITEKEY_HERE");

//set page action here
$api->setEnterprisePayload(["action" => "form_submit"]);

//set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
$api->setIsInvisible();

//create task in API
if (!$api->createTask()) {
    $api->debout("API v2 send failed - ".$api->getErrorMessage(), "red");
    return false;
}

$taskId = $api->getTaskId();

//wait in a loop for max 300 seconds till task is solved
if (!$api->waitForResult(300)) {
    echo "could not solve captcha\n";
    echo $api->getErrorMessage()."\n";
} else {

    $gResponse    =   $api->getTaskSolution();
    echo "\your recaptcha token: $gResponse\n\n";
    echo "worker's user-agent in case you need it:\n";
    echo $api->getWorkersUserAgent()."\n";

}

چگونه Recaptcha QR را در Java حل کنیم

// GitHub: https://github.com/anti-captcha/anticaptcha-java
//
// Maven, add to pom.xml:
//   <dependency>
//     <groupId>com.anti-captcha</groupId>
//     <artifactId>anticaptcha</artifactId>
//     <version>1.0.0</version>
//   </dependency>
//
// Gradle, add to build.gradle:
//   implementation "com.anti-captcha:anticaptcha:1.0.0"

import com.anti_captcha.Api.RecaptchaV2EnterpriseProxyless;
import com.anti_captcha.Helper.DebugHelper;
import org.json.JSONObject;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        // Set to false to turn the debug output off
        DebugHelper.setVerboseMode(true);

        RecaptchaV2EnterpriseProxyless api = new RecaptchaV2EnterpriseProxyless();
        api.setClientKey("YOUR_API_KEY_HERE");

        api.setWebsiteUrl("http://makeawebsitehub.com/recaptcha/test.php");
        api.setWebsiteKey("6LfI9IsUAAAAAKuvopU0hfY8pWADfR_mogXokIIZ");

        // Set page action here:
        api.setEnterprisePayload(new JSONObject()
                .put("action", "form_submit"));

        // set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
        api.setIsInvisible(true);

        // Make sure the API key funds balance is positive
        Double balance = api.getBalance();
        if (balance == null || balance <= 0) {
            // Stop here to make sure you don't DDoS the API while having empty balance
            DebugHelper.out("Balance error: " + api.getErrorMessage(), DebugHelper.Type.ERROR);
            return;
        }
        DebugHelper.out("Balance: " + balance, DebugHelper.Type.SUCCESS);

        if (!api.createTask()) {
            DebugHelper.out("API v2 send failed. " + api.getErrorMessage(), DebugHelper.Type.ERROR);
        } else if (!api.waitForResult()) {
            DebugHelper.out("Could not solve the captcha.", DebugHelper.Type.ERROR);
        } else {
            DebugHelper.out("Recaptcha g-response token: " + api.getTaskSolution().getGRecaptchaResponse(), DebugHelper.Type.SUCCESS);
            DebugHelper.out("Worker's user-agent in case you need it: " + api.getTaskSolution().getUserAgent(), DebugHelper.Type.SUCCESS);
        }
    }
}

چگونه Recaptcha QR را در Kotlin حل کنیم

// GitHub: https://github.com/anti-captcha/anticaptcha-kotlin
//
// Gradle, add to build.gradle.kts:
//   implementation("com.anti-captcha:anticaptcha-kotlin:1.0.0")

import com.anticaptcha.AnticaptchaClient
import com.anticaptcha.AnticaptchaException
import com.anticaptcha.ApiException
import com.anticaptcha.RecaptchaV2
import kotlinx.coroutines.runBlocking

fun main(): Unit = runBlocking {
    // Create the API client and set the API key
    val ac = AnticaptchaClient(
        apiKey = "YOUR_API_KEY_HERE",
        // Specify softId to earn 10% commission with your app.
        // Get your softId here: https://anti-captcha.com/clients/tools/devcenter
        softId = 0,
        // Set to false to turn the debug output off
        verbose = true,
    )

    try {
        // Make sure the API key funds balance is positive
        val balance = ac.getBalance()
        if (balance <= 0) {
            // Stop here to make sure you don't DDoS the API while having empty balance
            System.err.println("Empty balance")
            return@runBlocking
        }
        println("Balance: $balance")

        val solution = ac.solveRecaptchaV2(
            RecaptchaV2(
                websiteUrl = "http://makeawebsitehub.com/recaptcha/test.php",
                websiteKey = "6LfI9IsUAAAAAKuvopU0hfY8pWADfR_mogXokIIZ",
                isEnterprise = true,
                // set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
                isInvisible = true,
                // Set page action here
                enterprisePayload = mapOf(
                    "action" to "form_submit",
                ),
            ),
        )

        println("Recaptcha g-response token: ${solution.gRecaptchaResponse}")
        println("Worker's user-agent in case you need it: ${solution.userAgent}")
    } catch (error: ApiException) {
        // https://anti-captcha.com/apidoc/errors
        System.err.println("API error: ${error.errorCode} ${error.description}")
    } catch (error: AnticaptchaException) {
        System.err.println("Failed: ${error.message}")
    }
}

چگونه Recaptcha QR را در C# حل کنیم

// GitHub: https://github.com/anti-captcha/anticaptcha-csharp.git
// install:  dotnet add package AntiCaptchaOfficial
// or, in the Package Manager Console:
// Install-Package AntiCaptchaOfficial

using System;
using AntiCaptcha.Api;
using AntiCaptcha.Helper;


class Program
{
    static void Main()
    {
        // Set to 'false' to turn off debug output
        DebugHelper.VerboseMode = true;

        var api = new RecaptchaV2EnterpriseProxyless
        {
            ClientKey = "YOUR_API_KEY_HERE",
            WebsiteUrl = new Uri("http://makeawebsitehub.com/recaptcha/test.php"),
            WebsiteKey = "6LfI9IsUAAAAAKuvopU0hfY8pWADfR_mogXokIIZ",
            IsInvisible = true  // set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
        };

        // set page action here
        api.EnterprisePayload.Add("action", "form_submit");

        // Make sure the API key funds balance is positive
        var balance = api.GetBalance();
        if (balance == null || balance <= 0)
        {
            // Exit the program to make sure you don't DDoS the API with requests while having empty balance
            Console.WriteLine("Balance error: " + api.ErrorMessage);
            return;
        }
        Console.WriteLine("Balance: " + balance);

        var solution = api.Solve();
        Console.WriteLine("Recaptcha g-response token: " + solution?.GRecaptchaResponse);
        Console.WriteLine("Worker's user-agent in case you need it: " + solution?.UserAgent);
    }
}

چگونه Recaptcha QR را در C++ حل کنیم

// GitHub: https://github.com/anti-captcha/anticaptcha-cplus.git
// Add it to your CMake project:
//   include(FetchContent)
//   FetchContent_Declare(anticaptcha
//           GIT_REPOSITORY https://github.com/anti-captcha/anticaptcha-cplus.git
//           GIT_TAG v1.1.0)
//   FetchContent_MakeAvailable(anticaptcha)
//   target_link_libraries(your_app PRIVATE anticaptcha::anticaptcha)

#include <iostream>
#include <anticaptcha/anticaptcha.hpp>

int main() {
    // Create the API client and set the API key
    anticaptcha::Client ac("YOUR_API_KEY_HERE");

    // Debug output is on by default, turn it off with:
    // ac.shut_up();

    // Specify softId to earn 10% commission with your app.
    // Get your softId here: https://anti-captcha.com/clients/tools/devcenter
    ac.set_soft_id(0);

    try {
        // Make sure the API key funds balance is positive
        const double balance = ac.get_balance();
        if (balance <= 0) {
            // Stop here to make sure you don't DDoS the API while having empty balance
            std::cerr << "Empty balance" << std::endl;
            return 1;
        }
        std::cout << "Balance: " << balance << std::endl;

        anticaptcha::RecaptchaV2 params;
        params.website_url = "http://makeawebsitehub.com/recaptcha/test.php";
        params.website_key = "6LfI9IsUAAAAAKuvopU0hfY8pWADfR_mogXokIIZ";
        params.is_enterprise = true;
        // set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
        params.is_invisible = true;
        // Set page action here
        params.enterprise_payload = { {"action", "form_submit"} };
        // params.api_domain = "recaptcha.net"; // only for a non-google.com script domain

        const anticaptcha::Solution solution = ac.solve_recaptcha_v2(params);
        std::cout << "Recaptcha g-response token: " << solution.g_recaptcha_response() << std::endl;
        std::cout << "Worker's user-agent in case you need it: " << solution.user_agent() << std::endl;
    } catch (const anticaptcha::ApiError& error) {
        // https://anti-captcha.com/apidoc/errors
        std::cerr << "API error: " << error.error_code() << " " << error.description() << std::endl;
        return 1;
    } catch (const anticaptcha::Error& error) {
        std::cerr << "Failed: " << error.what() << std::endl;
        return 1;
    }

    return 0;
}

چگونه Recaptcha QR را در Rust حل کنیم

// GitHub: https://github.com/anti-captcha/anticaptcha-rust
// Install with:
//   cargo add anticaptchaofficial
// or add it to Cargo.toml:
//   [dependencies]
//   anticaptchaofficial = "1"

use std::collections::BTreeMap;
use anticaptcha::{Client, RecaptchaV2};

#[tokio::main]
async fn main() -> anticaptcha::Result<()> {
    // Create the API client and set the API key
    let ac = Client::new("YOUR_API_KEY_HERE")
        // Specify softId to earn 10% commission with your app.
        // Get your softId here: https://anti-captcha.com/clients/tools/devcenter
        .with_soft_id(0);
    // .quiet() turns the debug output off

    // Make sure the API key funds balance is positive
    let balance = ac.get_balance().await?;
    if balance <= 0.0 {
        // Stop here to make sure you don't DDoS the API while having empty balance
        eprintln!("Empty balance");
        return Ok(());
    }
    println!("Balance: {balance}");

    // set page action here
    let mut enterprise_payload = BTreeMap::new();
    enterprise_payload.insert("action".to_owned(), "form_submit".to_owned());

    let solution = ac
        .solve_recaptcha_v2(&RecaptchaV2 {
            website_url: "http://makeawebsitehub.com/recaptcha/test.php".into(),
            website_key: "6LfI9IsUAAAAAKuvopU0hfY8pWADfR_mogXokIIZ".into(),
            is_enterprise: true,
            is_invisible: true, // set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
            // Additional parameters passed to the grecaptcha.enterprise.render call
            enterprise_payload,
            // api_domain: "recaptcha.net".into(), // only for a non-google.com script domain
            ..Default::default()
        })
        .await?;

    println!("Recaptcha g-response token: {}", solution.g_recaptcha_response());
    println!("Worker's user-agent in case you need it: {}", solution.user_agent());

    Ok(())
}

چگونه Recaptcha QR را در Ruby حل کنیم

# GitHub: https://github.com/anti-captcha/anticaptcha-ruby
# Install with:
#   gem install anticaptchaofficial
# or add it to your Gemfile:
#   gem "anticaptchaofficial"

require "anticaptcha"

# Create the API client and set the API key
ac = Anticaptcha.new("YOUR_API_KEY_HERE")

# Specify softId to earn 10% commission with your app.
# Get your softId here: https://anti-captcha.com/clients/tools/devcenter
ac.soft_id = 0

# Set to false to turn the debug output off
ac.verbose = true

begin
  # Make sure the API key funds balance is positive
  balance = ac.balance
  # Stop here to make sure you don't DDoS the API while having empty balance
  abort "Empty balance" if balance <= 0
  puts "Balance: #{balance}"

  solution = ac.solve_recaptcha_v2(
    website_url: "http://makeawebsitehub.com/recaptcha/test.php",
    website_key: "6LfI9IsUAAAAAKuvopU0hfY8pWADfR_mogXokIIZ",
    is_enterprise: true,
    # set to "true" if there's "size":"invisible" option in "grecaptcha.enterprise.render" function
    # is_invisible: true,
    # Set page action here
    enterprise_payload: { "action" => "form_submit" }
    # api_domain: "recaptcha.net", # only for a non-google.com script domain
  )

  puts "Recaptcha g-response token: #{solution.g_recaptcha_response}"
  puts "Worker's user-agent in case you need it: #{solution.user_agent}"
rescue Anticaptcha::ApiError => e
  # https://anti-captcha.com/apidoc/errors
  warn "API error: #{e.error_code} #{e.description}"
rescue Anticaptcha::Error => e
  warn "Failed: #{e.message}"
end

چگونه Recaptcha QR را در bash حل کنیم

curl -i -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -X POST -d '{
    "clientKey":"YOUR_API_KEY_HERE",
    "task":
        {
            "type":"RecaptchaV2EnterpriseTaskProxyless",
            "websiteURL":"http://mywebsite.com/recaptcha/test.php",
            "websiteKey":"6Lc_aCMTAAAAABx7u2N0D1XnVbI_v6ZdbM6rYf16",
            "enterprisePayload": {
                "action": "form_submit"
            },
            "isInvisible": true
        },
    "softId": 0
}' https://api.anti-captcha.com/createTask