PHP में reCAPTCHA v3 कैसे हल करें और एक Action सेट करें

reCAPTCHA v3 कभी कोई challenge render नहीं करता। यह चुपचाप visit को score देता है और page को एक token देता है, जिसे फिर site’s का backend सत्यापित करता है। आपके code के लिहाज़ से इसका मतलब है कि क्लिक करने के लिए कुछ नहीं है, इसलिए पूरा काम बस एक ऐसा token बनाना है जिसे site स्वीकार कर ले। PHP में वह वही है recaptcha वही method जो आप v2 के लिए इस्तेमाल करेंगे, options array में एक version flag के साथ।
जो चीज़ तय करती है कि यह काम करेगा या नहीं वह action है।
Setup
# 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 आपकी अपनी मशीन पर चलता है, इसलिए पहले डेस्कटॉप ऐप का खुला होना ज़रूरी है।
बुनियादी call
$result = $solver->recaptcha(
'6Lc...YOUR_SITEKEY',
'https://example.com/checkout',
[
'version' => 'v3',
'action' => 'submit',
]
);
echo $result['code']; // the v3 tokenv2 से दो चीज़ें अलग हैं। version होना चाहिए v3, और action उससे मेल खाना चाहिए जो पेज पास करता है grecaptcha.execute। इसे छोड़ दें तो यह default होता है verify.
action क्यों मायने रखता है
Actions वे labels हैं जिन्हें कोई site हर सुरक्षित interaction से जोड़ती है ताकि किसी login और किसी checkout को अलग-अलग score दिया जा सके। ज़्यादातर backends यह जाँचते हैं कि token द्वारा लाया गया action उसी से मेल खाता है जिसकी उन्होंने उस endpoint के लिए उम्मीद की थी।
गलत लेबल भेजें और टोकन असली तो होता है लेकिन एक अलग इंटरैक्शन के लिए टैग हो जाता है, जिसे कई verifier सीधे अस्वीकार कर देते हैं। अंदाज़ा लगाने के बजाय पेज से असली वैल्यू पढ़ें:
$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,
]);सामान्य मान हैं login, submit, homepage और checkout, लेकिन ये मनमानी strings हैं जिन्हें साइट बनाने वाले ने चुना था।
Enterprise v3
$result = $solver->recaptcha($sitekey, $pageUrl, [
'version' => 'v3',
'enterprise' => 1,
'action' => 'submit',
]);Enterprise एक अलग प्रोडक्ट के बजाय एक ऑर्थोगोनल फ्लैग है, इसलिए यह v3 कॉल पर स्टैक होता है। इन्हें पेज द्वारा लोड की जाने वाली स्क्रिप्ट से अलग पहचानें: Enterprise खींचता है enterprise.js, standard खींचता है api.js. ग़लत अंदाज़ा लगाना एक ख़राब token लौटाने के बजाय हल को फ़ेल कर देता है, इसलिए टेस्ट करने में कुछ नहीं लगता।
token सबमिट करना
$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 के विपरीत आकार को बाँधने वाला कोई मानक form widget नहीं होता, इसलिए v3 इंटीग्रेशन अलग-अलग होते हैं। कुछ एक hidden इस्तेमाल करते हैं g-recaptcha-response input, अन्य एक custom key के साथ JSON पोस्ट करते हैं। किसी field नाम को मान लेने से पहले पेज का अपना JavaScript जांचें।
Errors
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
}इस पर ध्यान दें CapSkip\Exceptions namespace। Python या Node उदाहरणों से imports कॉपी करना यहां घातक त्रुटियों का एक आम स्रोत है।
अक्सर पूछे जाने वाले सवाल
क्या मैं सबमिट करने से पहले score जांच सकता हूं?
नहीं। score Google के पास रहता है और साइट मालिक को केवल तब पता चलता है जब उनका backend token को verify करता है। client side से आपको एक token मिलता है और कुछ नहीं, इसलिए पहले से जाँचने या फ़िल्टर करने के लिए कुछ नहीं होता।
क्या मुझे एक web request के अंदर हल करना चाहिए?
बेहतर होगा नहीं। PHP synchronous है और एक हल में कई सेकंड लग सकते हैं, इसलिए पेज render के दौरान ऐसा करना उस अवधि के लिए एक worker को बांध देता है। इसे एक queued job या एक CLI worker में ले जाएं।
अगर पेज कभी कोई action सेट न करे तो क्या?
कुछ पेज call करते हैं execute बिना किसी के, जिस स्थिति में default verify सही है। अगर आपका regex कुछ नहीं ढूँढ़ पाता, तो आमतौर पर यही कारण होता है, न कि कोई parsing बग।
सारांश
सेट करें version को v3, मिलान action पेज जो एक्ज़ीक्यूट करता है, उसके अनुसार जोड़ें enterprise जब यह लोड होता है enterprise.js, exceptions यहाँ से import करें CapSkip\Exceptions, और टोकन को जल्दी सबमिट करें क्योंकि यह लगभग दो मिनट में एक्सपायर हो जाता है।
अन्य भाषाएँ यहाँ शामिल हैं reCAPTCHA v3 सॉल्वर page, Enterprise का विवरण इस पर Enterprise सॉल्वर पेज, और व्यापक PHP सतह यहाँ PHP कैप्चा सॉल्वर page। हमारे यहाँ एक token को live generate होते देखें v3 डेमो। CapSkip एक है कैप्चा सॉल्वर जो आपके अपने hardware पर चलता है।
