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:
- Site anahtarını ve sayfa URL'sini
method=userrecaptchailein.php'ye gönderir - standart v2 ile aynıdır. - Belirteç hazır olana kadar her 5 saniyede bir
res.php'yi yoklar. - DOM sayfasından geri çağırma işlevi adını algılar.
execute_scriptkullanarak çözülmüş belirteçle geri arama işlevini çağırır.- 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:
data-callback'yi veya dahili yapılandırmayı inceleyerek adı doğrulayın.- Çağırmadan önce sayfanın tamamen yüklenmesini bekleyin.
- 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
- API anahtarınızı alın —captchaai.com/api.php
- Geri arama adını tespit edin —
data-callback,grecaptcha.render()veya dahili yapılandırmayı kontrol edin - 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
- Çalıştırın — jeton 60 saniyeden kısa sürede ulaşır, geri arama tetiklenir ve sayfa sonucu işler
- Takıldınız mı? BaşlayınYaygın reCAPTCHA v2 Çözümleme Hatalarıveya tamamını okuyunCaptchaAI API belgeleri