Menu

Tantangan kode QR Recaptcha baru didukung secara native oleh Anti-Captcha

Tim Anti-Captcha telah mengonfirmasi bahwa Tantangan Recaptcha dengan kode QR yang baru didukung secara native oleh layanan kami. Tidak ada perubahan pada integrasi Anda yang diperlukan: karena setiap captcha di Anti-Captcha diselesaikan oleh orang sungguhan, para pekerja kami menangani tantangan baru ini dengan cara yang sama seperti pengunjung situs web biasa.

Tantangan kode QR Recaptcha baru didukung secara native oleh Anti-Captcha

Apa itu tantangan kode QR Recaptcha

Google memperkenalkan tantangan baru ini dalam musim panas 2026. Saat ini tantangan tersebut sedang diuji dalam mode tertutup pada sejumlah situs web terbatas, sebelum diluncurkan ke semua pelanggan Recaptcha. Alih-alih memilih gambar atau mencentang kotak, pengguna ditampilkan kode QR dan diminta menyelesaikan verifikasi di ponsel mereka. Tantangan kode QR ini tidak terikat pada satu versi Recaptcha: tantangan ini muncul di situs web yang menggunakan baik Recaptcha V2 maupun Recaptcha V3.

Ide di baliknya sederhana: relatif murah bagi sebuah bot untuk mengemulasi browser desktop, tetapi jauh lebih sulit untuk mengemulasi smartphone fisik sungguhan dengan kamera, sistem operasi asli, dan akses ke toko aplikasi resmi.

Fitur teknis

  • Berpusat pada perangkat seluler. Tantangan tidak dapat diselesaikan di dalam browser tempat tantangan itu ditampilkan. Verifikasi dipindahkan ke perangkat terpisah — smartphone pengguna — dan browser hanya menunggu konfirmasi.
  • Dipindai dengan kamera ponsel. Kode QR dipindai dengan aplikasi kamera biasa di ponsel. Tidak diperlukan pemindai QR pihak ketiga: kamera mengenali kode dan menawarkan untuk membuka verifikasi.
  • Diselesaikan oleh mini-app dari Google Play dan App Store. Memindai kode akan meluncurkan mini-app ringan yang didistribusikan melalui Google Play (Android dengan Google Play Services 25.41.30) atau App Store (iOS 15/16+). Mini-app terbuka secara instan tanpa instalasi penuh dan melakukan verifikasi di perangkat.
  • Verifikasi terikat perangkat. Hasilnya terikat pada perangkat fisik sungguhan, yang membuat tantangan ini sangat sulit diotomatisasi dengan browser headless, emulator, atau solver berbasis AI.

Bagaimana pekerja Anti-Captcha menanganinya

Kami menjalankan pengujian internal di antara pekerja Anti-Captcha: sekitar 50% dari mereka mampu menyelesaikan tantangan baru ini seketika menggunakan ponsel mereka sendiri, tanpa instruksi atau persiapan tambahan apa pun. Sisanya sebagian besar hanya perlu memperbarui sistem operasi mereka atau beralih ke perangkat yang didukung, yang lebih merupakan soal waktu daripada hambatan yang nyata.

Di sinilah tepatnya sebuah layanan yang digerakkan oleh manusia memiliki keunggulan dibandingkan solver otomatis. Seseorang dengan smartphone biasa menyelesaikan tantangan dalam hitungan detik, sementara sebuah bot harus mengoperasikan sekumpulan perangkat sungguhan untuk melakukan hal yang sama.

Apa artinya bagi pelanggan kami

Anda tetap mengirim tugas Recaptcha V2 atau V3 dengan cara yang sama seperti yang Anda lakukan sekarang. Ketika sebuah situs web menampilkan tantangan kode QR, tantangan tersebut diselesaikan oleh pekerja kami di ponsel mereka dan Anda menerima token g-recaptcha-response biasa dalam hasil tugas.

Cara mengetahui versi Recaptcha yang digunakan sebuah situs web

Buka halaman yang berisi captcha di Chrome, buka konsol pengembang (F12, lalu tab Console), tempel skrip di bawah ini, dan tekan Enter. Jalankan skrip setelah captcha muncul di halaman, misalnya setelah mengeklik tombol kirim pada formulir.

(() => {
  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;
})();

Skrip ini mencetak skrip, widget, dan pengaturan Recaptcha (sitekey, size, action) dalam bentuk tabel, diikuti oleh baris VERDICT:

  • v3/score — Recaptcha V3: sitekey diteruskan dalam parameter render dari skrip Recaptcha.
  • v2 checkbox / v2 invisible — Recaptcha V2 dengan kotak centang atau widget tak terlihat.
  • Enterprise — situs web menggunakan Recaptcha Enterprise (skrip enterprise.js).

Gunakan sitekey dari output sebagai kunci situs web, dan nilai action, jika ada, sebagai action halaman dalam contoh kode di bawah ini.

Contoh kode

Pilih versi Recaptcha yang ditemukan pada situs web:

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

Cara menyelesaikan Recaptcha QR di 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)

Cara menyelesaikan Recaptcha QR di 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());

Cara menyelesaikan Recaptcha QR di 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)
}

Cara menyelesaikan Recaptcha QR di 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";

}

Cara menyelesaikan Recaptcha QR di 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);
        }
    }
}

Cara menyelesaikan Recaptcha QR di 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}")
    }
}

Cara menyelesaikan Recaptcha QR di 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);
    }
}

Cara menyelesaikan Recaptcha QR di 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;
}

Cara menyelesaikan Recaptcha QR di 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(())
}

Cara menyelesaikan Recaptcha QR di 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

Cara menyelesaikan Recaptcha QR di 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