PHP'de reCAPTCHA v3 Nasıl Çözülür ve Action Nasıl Ayarlanır

solve recaptcha v3 in php - How to Solve reCAPTCHA v3 in PHP and Set an Action

reCAPTCHA v3 asla bir doğrulama göstermez. Ziyareti sessizce puanlar ve sayfaya bir token verir; ardından bunu sitenin arka ucu doğrular. Kodunuz açısından bu, tıklanacak bir şey olmadığı anlamına gelir; dolayısıyla tüm görev, sitenin kabul ettiği bir token üretmektir. PHP'de bu, aynı recaptcha v2 için kullanacağınız metot, seçenek dizisinde bir sürüm bayrağı ile.

Çalışıp çalışmadığına karar veren şey action'dır.

Kurulum

# PHP 8.0+, with the curl and json extensions.
composer require capskip/capskip
use CapSkip\CapSkip;

$solver = new CapSkip([
    'host' => '127.0.0.1',
    'port' => 8080,
    'recaptchaTimeout' => 300,   // seconds, shared with Turnstile and GeeTest
]);

CapSkip kendi makinenizde çalışır; bu nedenle önce masaüstü uygulamasının açık olması gerekir.

Temel çağrı

$result = $solver->recaptcha(
    '6Lc...YOUR_SITEKEY',
    'https://example.com/checkout',
    [
        'version' => 'v3',
        'action' => 'submit',
    ]
);

echo $result['code'];   // the v3 token

v2'den iki şey farklıdır. version olmalıdır v3, ve action sayfanın şuraya geçirdiği her neyse onunla eşleşmelidir: grecaptcha.execute. Onu atlayın, varsayılanı şudur: verify.

Eylem neden önemlidir

Action'lar, bir sitenin her korunan etkileşime eklediği etiketlerdir; böylece bir giriş ve bir ödeme ayrı ayrı puanlanabilir. Çoğu arka uç, token'ın taşıdığı action'ın o uç nokta için bekledikleriyle eşleşip eşleşmediğini kontrol eder.

Yanlış etiketi gönderirseniz token gerçektir ancak farklı bir etkileşim için etiketlenmiştir; birçok doğrulayıcı bunu doğrudan reddeder. Tahmin etmek yerine gerçek değeri sayfadan okuyun:

$html = file_get_contents('https://example.com/checkout');

// Sites normally call execute() with the action as a string literal.
preg_match('/execute\([^,]+,\s*\{\s*action:\s*[\'"]([^\'"]+)/', $html, $m);
$action = $m[1] ?? 'verify';

$result = $solver->recaptcha($sitekey, $pageUrl, [
    'version' => 'v3',
    'action' => $action,
]);

Yaygın değerler şunlardır: login, submit, homepage ve checkout, ancak bunlar siteyi kim oluşturduysa onun seçtiği rastgele dizelerdir.

Enterprise v3

$result = $solver->recaptcha($sitekey, $pageUrl, [
    'version' => 'v3',
    'enterprise' => 1,
    'action' => 'submit',
]);

Enterprise, ayrı bir ürün değil dikey bir bayraktır; bu nedenle v3 çağrısının üzerine eklenir. Bunları, sayfanın yüklediği scriptle ayırt edin: Enterprise şunu çeker enterprise.js, standart şunu çeker: api.js. Yanlış tahmin etmek, hatalı bir token döndürmek yerine çözümü başarısız kılar; dolayısıyla test etmenin bir maliyeti yoktur.

Token'ı gönderme

$ch = curl_init('https://example.com/checkout');

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'token' => $result['code'],
        'order_id' => '...',
    ]),
]);

$response = curl_exec($ch);
curl_close($ch);

v2'nin aksine, biçimi kısıtlayan standart bir form widget'ı yoktur; bu nedenle v3 entegrasyonları değişir. Bazıları gizli bir g-recaptcha-response input, diğerleri özel bir anahtarla JSON gönderir. Bir alan adını varsaymadan önce sayfanın kendi JavaScript'ini kontrol edin.

Hatalar

use CapSkip\Exceptions\ApiException;
use CapSkip\Exceptions\NetworkException;
use CapSkip\Exceptions\TimeoutException;

try {
    $result = $solver->recaptcha($sitekey, $pageUrl, ['version' => 'v3']);
} catch (NetworkException $e) {
    // CapSkip is not running on the configured port
} catch (ApiException $e) {
    // the sitekey or pageurl was rejected
} catch (TimeoutException $e) {
    // exceeded recaptchaTimeout
}

Şuna dikkat edin: CapSkip\Exceptions ad alanı. Python veya Node örneklerinden içe aktarmaları kopyalamak, burada yaygın bir ölümcül hata kaynağıdır.

Sık sorulan sorular

Göndermeden önce puanı kontrol edebilir miyim?

Hayır. Skor Google'da bulunur ve yalnızca site sahibinin arka ucu token'ı doğruladığında ona açıklanır. İstemci tarafında bir token alırsınız ve başka hiçbir şey almazsınız; dolayısıyla önceden incelenecek veya filtrelenecek bir şey yoktur.

Bir web isteğinin içinde çözmeli miyim?

Tercihen hayır. PHP senkrondur ve bir çözüm birkaç saniye sürebilir, bu yüzden sayfa oluşturma sırasında yapmak bir işçiyi süre boyunca meşgul eder. Bunu kuyruğa alınmış bir işe veya bir CLI işçisine taşıyın.

Sayfa hiç bir action ayarlamazsa ne olur?

Bazı sayfalar şunu çağırır: execute biri olmadan, bu durumda varsayılan verify doğrudur. regex'iniz hiçbir şey bulamazsa, bunun nedeni genellikle bir ayrıştırma hatasından ziyade budur.

Özet

Ayarla version şuraya v3, eşleştir action sayfanın çalıştırdığına göre, şunu ekleyin enterprise yüklendiğinde enterprise.js, exception'ları şuradan içe aktarın: CapSkip\Exceptions, ve token'ı hızlıca gönderin, çünkü yaklaşık iki dakika içinde sona erer.

Diğer diller şurada ele alınmıştır: reCAPTCHA v3 çözücü sayfası, Enterprise ayrıntıları şurada: Enterprise çözücü sayfası ve daha geniş PHP yüzeyi şurada: PHP CAPTCHA çözücü sayfası. Bizim şuramızda canlı olarak üretilen bir token'ı görün: v3 demosu. CapSkip bir captcha çözücü kendi donanımınızda çalışan.