PHP'de Invisible Dahil reCAPTCHA v2 Nasıl Çözülür

reCAPTCHA v2'nin üç çeşidi vardır ve PHP'de bunlar bir seçenek dizisine sahip tek bir metottur. Onay kutusu çıplak çağrıdır, Invisible ve Enterprise ise bayraklardır ve ikisi birlikte de ayarlanabilir. PHP ayrıca hiç async desteği olmayan tek CapSkip SDK'sıdır; bu, kodu basitleştirir ancak toplu işleri nasıl yapılandırmanız gerektiğini değiştirir.
Kurulum
# PHP 8.0 or newer. Needs the curl and json extensions, # both of which ship with almost every PHP install. composer require capskip/capskip
CapSkip kendi makinenizde çözer; bu nedenle masaüstü uygulamasının çalışıyor olması gerekir. İstemciyi ayarlarındaki porta yönlendirin:
use CapSkip\CapSkip;
$solver = new CapSkip([
'apiKey' => 'capskip', // any string when key validation is off
'host' => '127.0.0.1',
'port' => 8080,
'recaptchaTimeout' => 300, // seconds
]);Üretimde, bunları ortamdan okuyun:
use CapSkip\CapSkip;
$solver = new CapSkip([
'apiKey' => getenv('CAPSKIP_API_KEY') ?: 'capskip',
'host' => getenv('CAPSKIP_HOST') ?: '127.0.0.1',
'port' => (int) (getenv('CAPSKIP_PORT') ?: 8080),
]);Üç varyant
| Varyant | Ekleme seçeneği |
|---|---|
| Checkbox | yok |
| Invisible | ['invisible' => 1] |
| Enterprise | ['enterprise' => 1] |
| Invisible Enterprise | her iki key |
// Checkbox: sitekey and page URL only.
$result = $solver->recaptcha(
'6Lc...YOUR_SITEKEY',
'https://example.com/login'
);
echo $result['code']; // g-recaptcha-response token
// Invisible.
$result = $solver->recaptcha($sitekey, $pageUrl, ['invisible' => 1]);
// Enterprise, and both together.
$result = $solver->recaptcha($sitekey, $pageUrl, ['enterprise' => 1]);
$result = $solver->recaptcha($sitekey, $pageUrl, [
'enterprise' => 1,
'invisible' => 1,
]);Dönüş değeri bir ilişkisel dizidir, bu nedenle $result['code'] token'dır. $result['captchaId'] hangi çözümün onu ürettiğini kaydetmek isterseniz o da oradadır.
Girdileri doğru yapmak
sitekey şudur: data-sitekey widget kapsayıcısındaki öznitelik ya da şuna verilen ilk argüman: grecaptcha.render Invisible modu, bakılacak bir konteyner olmadığı anlamına geldiğinde. Her zaman şununla başlar: 6L ve herkese açıktır.
URL, widget'ın oluşturulduğu sayfa olmalıdır. Form işleyicinizi veya giriş sonrası bir yönlendirmeyi geçmek, sorunsuz çözülüp ardından doğrulamada başarısız olan bir token'ın olağan nedenidir.
Token'ı gönderme
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'g-recaptcha-response' => $result['code'],
'username' => '...',
'password' => '...',
]),
]);
$response = curl_exec($ch);
curl_close($ch);Token'lar tek kullanımlıktır ve yaklaşık iki dakika sürer, dolayısıyla akışta mümkün olduğunca geç çözün. Site token'ı bir form alanı yerine bir JavaScript callback'ine iletirse, çözüm aynıdır ancak gönderim farklıdır. Bizim reCAPTCHA v2 callback çözücü sayfa o biçimi kapsar.
Hatalar ve insanların gözden kaçırdığı ad alanı
PHP, istisnalarını kendi ad alanı altına koyar; bu da Python veya Node örneklerinden import kopyalayan herkesin kafasını karıştırır:
use CapSkip\CapSkip;
use CapSkip\Exceptions\ValidationException;
use CapSkip\Exceptions\NetworkException;
use CapSkip\Exceptions\ApiException;
use CapSkip\Exceptions\TimeoutException;
try {
$result = $solver->recaptcha($sitekey, $pageUrl);
} catch (ValidationException $e) {
// missing or malformed arguments
} 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
}Dördü de şunu genişletir: CapSkip\Exceptions\CapSkipError, böylece hataları tek bir yerde ele almayı tercih ederseniz, temel sınıf üzerindeki tek bir catch her şeyi halleder.
Birkaçını çözme
PHP eşzamanlı olarak çalışır; bu nedenle her çözüm bitene kadar bloke eder:
use CapSkip\CapSkip;
$solver = new CapSkip();
foreach ($targets as $target) {
$results[] = $solver->recaptcha($target['sitekey'], $target['url']);
}Paket şunları dışa aktarır: AsyncCapSkip, ancak PHP'de bu, yalnızca diğer SDK'lardan taşınan kodun çalışmaya devam etmesi için bir takma addır. Eşzamanlılık eklemez. Gerçek paralellik için, SDK'nın çözümleri üst üste bindirmesini beklemek yerine birden çok işçi süreci çalıştırın veya bir kuyruk kullanın.
Proxy kullanmak
$result = $solver->recaptcha($sitekey, $pageUrl, [
'proxy' => ['type' => 'HTTPS', 'uri' => 'user:[email protected]:3128'],
]);Proxy'ler reCAPTCHA, Turnstile ve GeeTest için desteklenir, ancak görüntü baytlarından çözülen ve hedef siteye asla ulaşmayan görüntü CAPTCHA'ları için desteklenmez.
Sık sorulan sorular
Sonuç için sorgulama yapmam gerekir mi?
Hayır. SDK dahili olarak sorgular ve tamamlanan token'ı döndürür; bu nedenle CAPCHA_NOT_READY kodunuza asla ulaşmaz. 250ms sonra kontrol etmeye başlar ve oradan itibaren geri çekilir.
Bir çözüm web isteğimi engeller mi?
Evet ve bu PHP'de önemlidir. Bir reCAPTCHA çözümü birkaç saniye sürebilir, dolayısıyla bunu bir sayfa oluşturma sırasında yapmak bir işçiyi (worker) meşgul eder. Bir istek iş parçacığını engellemek yerine çözmeyi kuyruğa alınmış bir işe veya bir CLI işçisine aktarın.
Gereksinimler nelerdir?
PHP 8.0 veya daha yenisi, şununla: curl ve json uzantıları, ikisi de çoğu kurulumla birlikte gelir. Başka çalışma zamanı bağımlılığı yoktur; bu nedenle bir paket ağacını çekmeden mevcut bir projeye dâhil olur.
Özet
Bir yöntem, üç çeşit, şununla seçilir: invisible ve enterprise seçenekler dizisinde. Okuyun: $result['code'], şu şekilde gönderin: g-recaptcha-response, exception'ları şuradan içe aktarın: CapSkip\Exceptions, ve çözümleri istek iş parçacıklarınızın dışında tutun.
Daha geniş PHP yüzeyi şuradadır: PHP CAPTCHA çözücü sayfası, diğer diller şurada: reCAPTCHA v2 çözücü sayfa ve bir şey var canlı v2 demosu karşı test etmek için. CapSkip bir yerel captcha çözücü, dolayısıyla çözüm başına hiçbir ücret alınmaz.
