Captcha solver PHP ile: cURL kullanan çalışan örnek (2026)
PHP'de bir captcha çözmek için çoğu kurulumla gelen cURL eklentisi yeter. Scarnox API'sine bir JSON POST gönderirsiniz, yanıttan solution.token değerini okursunuz ve bu token'ı sitenin formuna gönderirsiniz. Bu rehber, Scarnox'un bugün proxysiz olarak çözdüğü PopularCaptcha için tam PHP akışını anlatır.
Ücretsiz deneme kredisiyle, kredi kartı gerekmeden başlayın ve scripti başka bir yerde kullanmadan önce sahibi olduğunuz bir sayfada deneyin.
Gereksinimler
- PHP 8.0 veya daha yeni;
curlvejsoneklentileri etkin.php -mile kontrol edin. - Bir Scarnox API anahtarı.
- Sayfadaki PopularCaptcha widget'ının sitekey'i. Bulmak için captcha sitekey nasıl bulunur rehberine bakın.
Solver fonksiyonu
Bu fonksiyon API'ye POST gönderir, errorId değerini kontrol eder ve token'ı döndürür. Herhangi bir hatada istisna fırlatır; böylece çağıran taraf yeniden denemeye karar verebilir:
<?php
declare(strict_types=1);
const SCARNOX_API_KEY = 'scarnox_YOURAPIKEY';
const SCARNOX_API_URL = 'https://api.scarnox.com/api/tasks/create';
function solveCaptcha(string $sitekey, string $pageUrl, bool $invisible = false): string
{
$body = [
'captcha_type' => 'PopularCaptchaTaskProxyless',
'site_key' => $sitekey,
'site_url' => $pageUrl,
];
if ($invisible) {
$body['is_invisible'] = true;
}
$ch = curl_init(SCARNOX_API_URL);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($body, JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . SCARNOX_API_KEY,
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 185, // çağrı token hazır olduğunda döner
]);
$raw = curl_exec($ch);
if ($raw === false) {
$error = curl_error($ch);
throw new RuntimeException('cURL error: ' . $error);
}
$data = json_decode((string) $raw, true);
if (!is_array($data)) {
throw new RuntimeException('Response was not JSON');
}
if (($data['errorId'] ?? 1) !== 0) {
throw new RuntimeException(
($data['errorCode'] ?? 'ERROR') . ': ' . ($data['errorDescription'] ?? 'unknown')
);
}
return (string) $data['solution']['token'];
}
Authorization başlığı Bearer önekini kullanır. Zaman aşımı 185 saniyedir, çünkü API token hazır olana kadar bloke olur ve yoklama adımı yoktur.
Geçici hataları yeniden deneyin
Başarısız bir çözüm ücretlendirilmez; bu yüzden birkaç deneme ucuzdur. Döngüyü çağrının etrafına koyun ve her hatadan sonra biraz daha uzun bekleyin:
function solveWithRetry(string $sitekey, string $pageUrl, int $attempts = 3): string
{
$lastError = null;
for ($i = 1; $i <= $attempts; $i++) {
try {
return solveCaptcha($sitekey, $pageUrl);
} catch (RuntimeException $e) {
$lastError = $e;
fwrite(STDERR, "Attempt $i failed: " . $e->getMessage() . PHP_EOL);
sleep($i);
}
}
throw $lastError;
}
Hangi hatalarda duracağınız dahil tam hata politikası için captcha solver hata yönetimi rehberine bakın.
Token'ı çerez jar'ı ile gönderin
Birçok site captcha'yı formu yükleyen oturuma bağlar. Bir çerez dosyası, cURL'ün GET ve POST'ta aynı çerezleri göndermesini sağlar. Aşağıdaki fonksiyon token'ı sayfanın formuna gönderir:
function submitToken(string $pageUrl, string $token): string
{
$cookieFile = sys_get_temp_dir() . '/scarnox-cookies.txt';
// Önce GET yap, böylece site oturum çerezini ayarlar.
$ch = curl_init($pageUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIEFILE => $cookieFile,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_TIMEOUT => 60,
]);
curl_exec($ch);
// Ardından token'ı iki captcha alanında da taşıyan formu POST et.
$fields = http_build_query([
'email' => 'you@example.com',
'h-captcha-response' => $token,
'g-recaptcha-response' => $token,
]);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $fields,
CURLOPT_TIMEOUT => 60,
]);
$body = curl_exec($ch);
if ($body === false) {
throw new RuntimeException('Form submit failed: ' . curl_error($ch));
}
return (string) $body;
}
İki şey önemlidir. GET, çözümden önce çalışır; böylece çerez yerinde olur. Token ise çözümden hemen sonra gider, çünkü yaklaşık iki dakikada süresi dolar. Çözme çağrısını uzun bir toplu işin başına değil, doğrudan bu fonksiyondan önce koyun.
Çerez dosyası aynı süreçteki her çağrı tarafından paylaşılır. Birkaç kaydı paralel çalıştırıyorsanız her hesap ya da oturum için ayrı bir dosya verin. Aksi halde bir oturum diğerinin çerezlerinin üzerine yazar ve ikinci POST, captcha sorunu gibi görünen ama olmayan nedenlerle başarısız olur.
Her şeyi birleştirmek
$pageUrl = 'https://example.com/signup';
$token = solveWithRetry('YOUR-SITEKEY-UUID', $pageUrl);
$html = submitToken($pageUrl, $token);
echo strlen($html) . " bytes returned\n";
Komut satırından çalıştırın:
php signup.php
Görünmez widget'lar
Widget görünmezse solveCaptcha($sitekey, $pageUrl, true) çağırın. is_invisible alanı o zaman istekle birlikte gönderilir. Bazı sayfalar token ile çağrılacak bir JavaScript callback'i de gerektirir; bunu sunucu tarafındaki bir script tetikleyemez. Bu durumda bir tarayıcı aracı kullanın. Durumları görünmez captcha rehberi kapsar.
Zamanlama ve süre dolumu
Token yaklaşık iki dakika geçerlidir. Çözme ile gönderimi birbirine yakın tutun. Captcha token süresi, süresi dolmuş bir token ile reddedilmiş bir token'ı nasıl ayırt edeceğinizi açıklar.
Sorumlu scraping
PHP scriptiniz herkese açık sayfaları scrape ediyorsa başlamadan önce robots.txt dosyasını ve sitenin koşullarını kontrol edin. İstekler arasına gecikme ekleyin ve ihtiyacınız olmayan kişisel veriyi saklamayın. Captcha çözmek, neyi toplayabileceğinizi değiştirmez. Yasal taraf için web scraping yasal mı rehberine bakın.
Fiyatlandırma
Başarılı her çözüm için ödeme yaparsınız. Başarısız çözümler ücretlendirilmez. Güncel oranlar için fiyatlandırma sayfasına bakın ve ücretsiz deneme kredisiyle, kredi kartı gerekmeden başlayın.