API Eğitimleri

API Kullanarak reCAPTCHA v2 Geri Arama Sorunu Nasıl Çözülür?

Bazı web siteleri reCAPTCHA v2'yi standart g-recaptcha-response gizli alanı yerine geri arama işlevi ile uygular. CAPTCHA'yı çözdüğünüzde ve jetonu gizli alana enjekte ettiğinizde hiçbir şey olmuyor; sayfa bunu yok sayıyor. Bunun nedeni, sitenin bunun yerine jetonla bir JavaScript işlevini çağırmanızı beklemesidir.

Bu kılavuz, geri arama tabanlı reCAPTCHA v2'yi nasıl tespit edeceğinizi, bunu CaptchaAI API aracılığıyla nasıl çözeceğinizi ve geri aramayı doğru şekilde nasıl başlatacağınızı gösterir. API çağrısı standart reCAPTCHA v2 ile aynıdır; yalnızca belirteç ekleme adımı değişir.

reCAPTCHA v2'de yeni misiniz? İle başlayınAPI Kullanarak reCAPTCHA v2 Nasıl Çözülür?standart akış için, ardından geri arama çeşidi için buraya geri gelin.


Başlamadan önce ihtiyacınız olan şey

Gereksinim Ayrıntılar
CaptchaAI API anahtarı Şuradan bir tane alcaptchaai.com/api.php. 32 karakterlik dize.
Hedef sayfa URL'si reCAPTCHA v2 widget'ının yüklendiği tam URL.
reCAPTCHA v2 site anahtarı Widget örneğine bağlı ortak anahtar.
Tarayıcı otomasyon aracı Selenium, Puppeteer veya Playwright — geri aramayı başlatmak için JavaScript yürütmeniz gerekir.
Geri arama işlevi adı Sitenin jetonu almayı beklediği JavaScript işlevi.

Geri arama uygulaması nasıl belirlenir

Standart reCAPTCHA v2, çözülmüş jetonu gizli bir g-recaptcha-response metin alanına yazar. Geri çağırma uygulamaları bunu atlar ve doğrudan bir JavaScript işlevini çağırır. Farkı nasıl anlatacağınız aşağıda açıklanmıştır.

Yöntem 1: data-callback özniteliğini kontrol edin

Sayfa kaynağındaki reCAPTCHA widget div'ini inceleyin:

<div class="g-recaptcha"
     data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
     data-callback="SubmitToken">
</div>

data-callback mevcutsa site bir geri arama kullanır. (SubmitToken) değeri ihtiyacınız olan işlev adıdır.

Yöntem 2: grecaptcha.render() çağrılarını kontrol edin

Sayfanın JavaScript'inde grecaptcha.render'yi arayın:

grecaptcha.render('recaptcha-container', {
  sitekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
  callback: userVerified
});

callback özelliği işlevi adlandırır. Bu durumda userVerified.

Yöntem 3: Dahili reCAPTCHA yapılandırmasını inceleyin

Hedef sayfada tarayıcı konsolunu açın ve şunu çalıştırın:

___grecaptcha_cfg.clients[0]

callback özelliğini bulmak için nesne ağacında gezinin. Tam yol siteye göre değişir; reCAPTCHA sürümüne ve küçültmeye bağlı olarak clients[0].aa.l.callback veya başka bir şey olabilir. Sayfada birden fazla reCAPTCHA örneği varsa clients[1], clients[2] vb.'yi kontrol edin.

Hızlı algılama komut dosyası

Geri arama adlarını otomatik olarak bulmak için bunu tarayıcı konsolunda çalıştırın:

// Check data-callback attributes
document.querySelectorAll('[data-callback]').forEach(el => {
  console.log('data-callback:', el.getAttribute('data-callback'));
});

// Check internal config
if (typeof ___grecaptcha_cfg !== 'undefined') {
  Object.keys(___grecaptcha_cfg.clients).forEach(key => {
    const client = ___grecaptcha_cfg.clients[key];
    console.log(`Client ${key}:`, JSON.stringify(client, null, 2));
  });
}

Geri arama çözümünün standart v2'den farkı nedir?

CaptchaAI'ye yapılan API çağrısı aynıdır. Tek fark, jetonu aldıktan sonra onunla ne yapacağınızdır.

Adım Standart v2 Geri arama v2
1. CaptchaAI'ye gönderin method=userrecaptcha + site anahtarı + sayfa adresi Aynı
2. Sonuç için anket action=get + captcha kimliği Aynı
3. Jeton alın Aynı jeton formatı Aynı
4. Jetonu enjekte et g-recaptcha-response alan değerini ayarlayın Belirteçle geri arama işlevini çağırın
5. Formu gönderin Form gönderimini tetikleyin Genellikle otomatiktir; geri arama işlemi gerçekleştirir

Kritik: g-recaptcha-response'yi geri arama tabanlı uygulamalarda ayarlamayın. Sayfa bu alanı yok sayar ve geri arama işlevinin devreye girmesini bekler. Alanı geri aramayı çağırmadan ayarlamak, CAPTCHA'nın hiç çözülmemiş gibi görünmesini sağlayacaktır.


Akışı çözme

Page → extract sitekey + pageurl + callback name
                    ↓
      POST to in.php (method=userrecaptcha)
                    ↓
           receive captcha ID
                    ↓
         wait 15–20 seconds
                    ↓
      GET res.php (action=get, id=…)
          ↓                    ↓
   CAPCHA_NOT_READY       status=1 → token
    (wait 5s, retry)            ↓
                     invoke callback(token)
                              ↓
               site processes token automatically

Python uygulaması (Selenyum)

import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_CAPTCHAAI_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGE_URL = "https://staging.example.com/qa-login"
CALLBACK_NAME = "SubmitToken"  # The callback function name from the page

SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"


def solve_recaptcha_v2(api_key, sitekey, pageurl):
    """Submit a reCAPTCHA v2 task and return the solved token."""

    # Step 1: Submit the captcha
    submit_resp = requests.post(
        SUBMIT_URL,
        data={
            "key": api_key,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": 1,
        },
        timeout=30,
    )
    submit_resp.raise_for_status()
    submit_data = submit_resp.json()

    if submit_data.get("status") != 1:
        raise RuntimeError(f"Submit failed: {submit_data}")

    captcha_id = submit_data["request"]
    print(f"Task created — captcha ID: {captcha_id}")

    # Step 2: Wait before first poll
    time.sleep(15)

    # Step 3: Poll for result
    for _ in range(60):
        result_resp = requests.get(
            RESULT_URL,
            params={
                "key": api_key,
                "action": "get",
                "id": captcha_id,
                "json": 1,
            },
            timeout=30,
        )
        result_resp.raise_for_status()
        result_data = result_resp.json()

        if result_data.get("request") == "CAPCHA_NOT_READY":
            time.sleep(5)
            continue

        if result_data.get("status") == 1:
            return result_data["request"]

        raise RuntimeError(f"Polling error: {result_data}")

    raise TimeoutError("reCAPTCHA v2 solve timed out")


def detect_callback_name(driver):
    """Detect the reCAPTCHA callback function name from the page."""

    # Try data-callback attribute first
    callback = driver.execute_script("""
        const el = document.querySelector('[data-callback]');
        if (el) return el.getAttribute('data-callback');
        return null;
    """)
    if callback:
        return callback

    # Try internal reCAPTCHA config
    callback = driver.execute_script("""
        if (typeof ___grecaptcha_cfg === 'undefined') return null;
        const clients = ___grecaptcha_cfg.clients;
        for (const key of Object.keys(clients)) {
            const client = clients[key];
            // Walk the object tree to find a callback function
            const json = JSON.stringify(client);
            const match = json.match(/"callback":"(\\w+)"/);
            if (match) return match[1];
        }
        return null;
    """)
    return callback


# Main workflow
driver = webdriver.Chrome()
driver.get(PAGE_URL)

# Detect the callback name (or use the known name)
detected = detect_callback_name(driver)
callback_name = detected or CALLBACK_NAME
print(f"Using callback: {callback_name}")

# Solve the CAPTCHA
token = solve_recaptcha_v2(API_KEY, SITEKEY, PAGE_URL)
print(f"Solved token: {token[:80]}...")

# Invoke the callback with the token
driver.execute_script(f"{callback_name}(arguments[0]);", token)
print("Callback invoked — site should process the token automatically")

# Wait for the page to process
time.sleep(3)
driver.quit()

Bu ne işe yarar:

  1. Site anahtarını ve sayfa URL'sini method=userrecaptcha ile in.php'ye gönderir - standart v2 ile aynıdır.
  2. Belirteç hazır olana kadar her 5 saniyede bir res.php'yi yoklar.
  3. DOM sayfasından geri çağırma işlevi adını algılar.
  4. execute_script kullanarak çözülmüş belirteçle geri arama işlevini çağırır.
  5. Sitenin kendi JavaScript'i geri kalan işlemleri (form gönderimi, doğrulama veya sayfa yönlendirme) halleder.

Node.js uygulaması (Puppeteer)

const puppeteer = require("puppeteer");

const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-";
const PAGE_URL = "https://staging.example.com/qa-login";
const CALLBACK_NAME = "SubmitToken";

const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function solveRecaptchaV2(apiKey, sitekey, pageurl) {
  // Step 1: Submit the captcha
  const submitResp = await fetch(SUBMIT_URL, {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({
      key: apiKey,
      method: "userrecaptcha",
      googlekey: sitekey,
      pageurl: pageurl,
      json: "1",
    }),
  });

  const submitData = await submitResp.json();
  if (submitData.status !== 1) {
    throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
  }

  const captchaId = submitData.request;
  console.log(`Task created — captcha ID: ${captchaId}`);

  // Step 2: Wait before first poll
  await sleep(15_000);

  // Step 3: Poll for result
  for (let i = 0; i < 60; i++) {
    const resultResp = await fetch(
      `${RESULT_URL}?${new URLSearchParams({
        key: apiKey,
        action: "get",
        id: captchaId,
        json: "1",
      })}`
    );

    const resultData = await resultResp.json();

    if (resultData.request === "CAPCHA_NOT_READY") {
      await sleep(5_000);
      continue;
    }

    if (resultData.status === 1) {
      return resultData.request;
    }

    throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
  }

  throw new Error("reCAPTCHA v2 solve timed out");
}

async function detectCallbackName(page) {
  return page.evaluate(() => {
    // Try data-callback attribute
    const el = document.querySelector("[data-callback]");
    if (el) return el.getAttribute("data-callback");

    // Try internal config
    if (typeof ___grecaptcha_cfg !== "undefined") {
      const clients = ___grecaptcha_cfg.clients;
      for (const key of Object.keys(clients)) {
        const json = JSON.stringify(clients[key]);
        const match = json.match(/"callback":"(\w+)"/);
        if (match) return match[1];
      }
    }

    return null;
  });
}

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto(PAGE_URL, { waitUntil: "networkidle2" });

  // Detect callback
  const detected = await detectCallbackName(page);
  const callbackName = detected || CALLBACK_NAME;
  console.log(`Using callback: ${callbackName}`);

  // Solve the CAPTCHA
  const token = await solveRecaptchaV2(API_KEY, SITEKEY, PAGE_URL);
  console.log(`Solved token: ${token.slice(0, 80)}...`);

  // Invoke the callback
  await page.evaluate(
    (name, tkn) => {
      window[name](tkn);
    },
    callbackName,
    token
  );
  console.log("Callback invoked — site should process the token automatically");

  await sleep(3_000);
  await browser.close();
})();

PHP uygulaması

API çağrısı PHP'de aynıdır. Geri arama çağrısı bir tarayıcı bağlamı gerektirir; dolayısıyla bu örnek, sunucu tarafı çözümünü kapsar. Enjeksiyon adımı için headless bir tarayıcı aracı (örneğin, PHP WebDriver) kullanın.

<?php
$apiKey  = "YOUR_CAPTCHAAI_API_KEY";
$sitekey = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-";
$pageurl = "https://staging.example.com/qa-login";

// Step 1: Submit
$submit = file_get_contents("https://ocr.captchaai.com/in.php?" . http_build_query([
    "key"       => $apiKey,
    "method"    => "userrecaptcha",
    "googlekey" => $sitekey,
    "pageurl"   => $pageurl,
    "json"      => 1,
]));

$submitData = json_decode($submit, true);
if ($submitData["status"] !== 1) {
    die("Submit failed: " . $submit);
}

$captchaId = $submitData["request"];
echo "Task created — captcha ID: $captchaId\n";

// Step 2: Wait and poll
sleep(15);

for ($i = 0; $i < 60; $i++) {
    $result = file_get_contents("https://ocr.captchaai.com/res.php?" . http_build_query([
        "key"    => $apiKey,
        "action" => "get",
        "id"     => $captchaId,
        "json"   => 1,
    ]));

    $resultData = json_decode($result, true);

    if ($resultData["request"] === "CAPCHA_NOT_READY") {
        sleep(5);
        continue;
    }

    if ($resultData["status"] === 1) {
        $token = $resultData["request"];
        echo "Solved token: " . substr($token, 0, 80) . "...\n";
        // Pass $token to your browser automation to invoke the callback
        break;
    }

    die("Polling error: " . $result);
}

Belirteci PHP'de aldıktan sonra, yürütmek için bir tarayıcı otomasyon aracı (örneğin, php-webdriver) kullanın:

SubmitToken("TOKEN_FROM_CAPTCHAAI");

Yaygın hatalar

# hata Ne olur? Düzeltme
1 Geri aramayı çağırmak yerine g-recaptcha-response'yi ayarlama Sayfa belirteci yok sayıyor; form hiçbir zaman gönderilmiyor Geri arama adını bulun ve jetonla çağırın
2 Yanlış geri arama işlevi adı JavaScript hatası: işlev tanımlanmadı data-callback, grecaptcha.render() veya dahili yapılandırmayı yeniden kontrol edin
3 Geri arama farklı bir müşteri dizinindedir Çoklu widget sayfalarında yanlış reCAPTCHA örneği hedefleniyor ___grecaptcha_cfg.clients[1], clients[2], vb.'yi kontrol edin.
4 Sayfa hazır olmadan geri aramanın yapılması İşlev henüz sayfa bağlamında tanımlanmadı Çağırmadan önce DOMContentLoaded veya networkidle'yi bekleyin
5 Gizli bir /minified adı kullanma Kaynaktaki geri arama adı karışık Gerçek işlev referansını bulmak için çalışma zamanı tarayıcı konsolunu kullanın
6 Geri arama v2'yi görünmez v2 ile karıştırma Bazı görünmez uygulamalar aynı zamanda geri aramaları da kullanır data-size="invisible"'nin mevcut olup olmadığını kontrol edin — öyleyse, bkz.API Kullanarak reCAPTCHA Invisible Nasıl Çözülür?

Sorun giderme

Belirteç çözüldü ancak sayfa tepki vermiyor

En yaygın neden: geri aramayı çağırmak yerine g-recaptcha-response'yi ayarlamanızdır. Widget'ın grecaptcha.render()'de data-callback veya callback olup olmadığını kontrol edin. Eğer öyleyse, bu işlevi çağırmanız gerekir.

ReferenceError: SubmitToken is not defined

Geri çağırma işlevi henüz yüklenmedi veya adı yanlış. Şunu deneyin:

  1. data-callback'yi veya dahili yapılandırmayı inceleyerek adı doğrulayın.
  2. Çağırmadan önce sayfanın tamamen yüklenmesini bekleyin.
  3. Küçültülmüş sitelerde, işlev bir değişkene atanabilir; konsoldaki window.SubmitToken'yi kontrol edin.

Token standart v2'de çalışıyor ancak bu sayfada başarısız oluyor

Muhtemelen bir geri arama uygulamasıyla karşı karşıyasınız. Yukarıdaki algılama adımlarını izleyerek onaylayın, ardından geri arama çağrısına geçin.

ERROR_BAD_TOKEN_OR_PAGEURL

Sitekey/pageurl çifti geçersiz. Bu bir API hatasıdır ve geri arama ve standartla ilgili değildir. Her iki değeri de sayfadan yeniden çıkarın.

Sayfada birden fazla reCAPTCHA widget'ı var

Her widget'ın kendi geri araması olabilir. Her g-recaptcha div'i inceleyin veya kayıtlı tüm örnekler için ___grecaptcha_cfg.clients'yi kontrol edin. Widget'ı hedeflediğiniz formla eşleştirin.

ERROR_CAPTCHA_UNSOLVABLE

Sorun çözülemedi. Yeni bir istekle yeniden deneyin. Bu geri aramaya özgü değildir.

Hata referansının tamamı için bkz.Yaygın reCAPTCHA v2 Çözümleme Hataları.


CaptchaAI neden bunun için çalışıyor?

Faktör Detay
Aynı API çağrısı submit/poll akışı standart reCAPTCHA v2 ile aynıdır; ekstra parametreye gerek yoktur
Başarı oranı reCAPTCHA v2 için %99,5+ (geri arama ve standart aynı çözücüyü kullanır)
Hızı çöz 60 saniyenin altında
Jeton uyumluluğu Döndürülen jeton hem g-recaptcha-response enjeksiyonu hem de geri arama çağrısıyla çalışır
Fiyatlandırma Sınırsız çözüm için 15$/month'den başlayan iş parçacığı tabanlı planlar

CaptchaAI belirteci, sitenin reCAPTCHA v2'yi nasıl uyguladığına bakılmaksızın aynıdır. Aradaki fark tamamen müşteri tarafı kodunuzdadır; yani jetonu sayfaya nasıl ilettiğinizde.


Tam çalıştırılabilir örnek

Ortam kurulumu, yoklama, yeniden denemeler ve hata işleme ile eksiksiz bir çalışma projesine mi ihtiyacınız var?

GitHub →'deki çalıştırılabilir örneğin tamamına bakın


SSS

reCAPTCHA v2 geri arama nedir?

Geri arama, bir web sitesinin çözülmüş reCAPTCHA jetonunu almak için kaydettiği bir JavaScript işlevidir. ReCAPTCHA, belirteci gizli g-recaptcha-response alanına yazmak yerine doğrudan işlevi çağırır. İşlev genellikle form gönderimini, doğrulamayı veya sayfa yönlendirmesini tetikler.

API çağrısı için geri aramanın standart reCAPTCHA v2'den farkı nedir?

Hiç de farklı değil. Aynı method=userrecaptcha isteğini aynı site anahtarı ve sayfa URL'si ile gönderirsiniz. Tek fark, jetonu aldıktan sonra onunla ne yaptığınızdır; alan değeri ayarlamak yerine geri çağırma işlevini çağırırsınız.

Geri arama işlevinin adını nasıl bulabilirim?

Kontrol edilecek üç yer: (1) reCAPTCHA div'deki data-callback özelliği, (2) JavaScript sayfasındaki bir grecaptcha.render() çağrısındaki callback özelliği, (3) tarayıcı konsolundaki ___grecaptcha_cfg.clients[0] nesnesi - callback özelliğini bulmak için ağaçta gezinin.

Belirteci her iki yöntemle de kullanabilir miyim?

Belirtecin kendisi her iki şekilde de çalışır. Ancak site bir geri arama bekliyorsa g-recaptcha-response ayarı göz ardı edilecektir. Enjeksiyon yöntemini her zaman tesisin beklentileriyle eşleştirin.

Geri aramayı başlatmak için bir tarayıcıya ihtiyacım var mı?

Evet. Geri arama, sayfa bağlamındaki bir JavaScript işlevidir. Hedef sayfada JavaScript çalıştırabilen Selenium, Puppeteer, Playwright veya benzeri bir araca ihtiyacınız var.


reCAPTCHA v2 geri aramasını çözmeye başlayın

  1. API anahtarınızı alıncaptchaai.com/api.php
  2. Geri arama adını tespit edindata-callback, grecaptcha.render() veya dahili yapılandırmayı kontrol edin
  3. Yukarıdaki Python veya Node.js kodunu kopyalayın — yer tutucuları anahtarınız, site anahtarınız, sayfa URL'niz ve geri arama adınızla değiştirin
  4. Çalıştırın — jeton 60 saniyeden kısa sürede ulaşır, geri arama tetiklenir ve sayfa sonucu işler
  5. Takıldınız mı? BaşlayınYaygın reCAPTCHA v2 Çözümleme Hatalarıveya tamamını okuyunCaptchaAI API belgeleri

İlgili Makaleler

Bu makale için yorumlar devre dışı bırakılmıştır.