PHP में reCAPTCHA v2 कैसे हल करें, Invisible सहित

solve recaptcha v2 in php - How to Solve reCAPTCHA v2 in PHP, Including Invisible

reCAPTCHA v2 के तीन variants हैं, और PHP में वे एक options array के साथ एक ही method हैं। Checkbox सीधा कॉल है, Invisible और Enterprise flags हैं, और दोनों एक साथ सेट किए जा सकते हैं। PHP इकलौता CapSkip SDK भी है जिसमें कोई async कहानी बिल्कुल नहीं है, जो कोड को सरल बनाता है पर बदल देता है कि आपको bulk काम को कैसे structure करना चाहिए।

Setup

# 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 आपकी अपनी मशीन पर हल करता है, इसलिए desktop app का चलना ज़रूरी है। client को उसकी settings से मिले port पर पॉइंट करें:

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
]);

production में, उन्हें environment से पढ़ें:

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),
]);

तीन variants

Variantजोड़ने का विकल्प
Checkboxnone
Invisible['invisible' => 1]
Enterprise['enterprise' => 1]
Invisible Enterpriseदोनों keys
// 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,
]);

रिटर्न वैल्यू एक associative array है, इसलिए $result['code'] टोकन है। $result['captchaId'] वहाँ भी है अगर आप लॉग करना चाहते हैं कि किस solve ने इसे बनाया।

inputs सही करना

sitekey है data-sitekey widget container पर attribute, या इसका पहला argument grecaptcha.render जब Invisible mode का मतलब है कि देखने के लिए कोई container नहीं है। यह हमेशा इससे शुरू होता है 6L और सार्वजनिक है।

URL वही page होना चाहिए जिस पर widget render होता है। अपने form handler या किसी post-login redirect को पास करना उस token का आम कारण है जो ठीक हल हो जाता है और फिर verification में विफल हो जाता है।

token सबमिट करना

$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);

Tokens एक-बार उपयोग वाले होते हैं और लगभग दो मिनट चलते हैं, इसलिए flow में जितना देर से हो सके उतना हल करें। अगर साइट token को किसी form field के बजाय किसी JavaScript callback को सौंपती है, तो हल एक जैसा है पर सबमिशन अलग होता है। हमारा reCAPTCHA v2 callback सॉल्वर पेज उस आकार को कवर करता है।

Errors, और वह namespace जिसे लोग चूक जाते हैं

PHP अपने exceptions को उनके अपने namespace के तहत रखता है, जो Python या Node उदाहरणों से imports कॉपी करने वाले किसी भी व्यक्ति को उलझा देता है:

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
}

चारों extend करते हैं CapSkip\Exceptions\CapSkipError, इसलिए base class पर एक अकेला catch सब कुछ संभाल लेता है अगर आप failures को एक ही जगह निपटाना पसंद करें।

कई को हल करना

PHP समकालिक रूप से execute होता है, इसलिए हर हल पूरा होने तक ब्लॉक करता है:

use CapSkip\CapSkip;

$solver = new CapSkip();

foreach ($targets as $target) {
    $results[] = $solver->recaptcha($target['sitekey'], $target['url']);
}

package export करता है AsyncCapSkip, लेकिन PHP में यह केवल एक alias है ताकि दूसरे SDKs से पोर्ट किया गया code चलता रहे। यह concurrency नहीं जोड़ता। असली parallelism के लिए, SDK से हल overlap करने की उम्मीद रखने के बजाय कई worker processes चलाएं या एक queue इस्तेमाल करें।

प्रॉक्सी का उपयोग

$result = $solver->recaptcha($sitekey, $pageUrl, [
    'proxy' => ['type' => 'HTTPS', 'uri' => 'user:[email protected]:3128'],
]);

प्रॉक्सी reCAPTCHA, Turnstile और GeeTest के लिए समर्थित हैं, लेकिन image कैप्चा के लिए नहीं, जो image bytes से हल किए जाते हैं और कभी लक्ष्य साइट तक नहीं पहुँचते।

अक्सर पूछे जाने वाले सवाल

क्या मुझे परिणाम के लिए पोल करने की ज़रूरत है?

नहीं। SDK आंतरिक रूप से पोल करता है और पूरा हुआ टोकन लौटाता है, इसलिए CAPCHA_NOT_READY कभी आपके code तक नहीं पहुंचता। यह 250ms के बाद जांच शुरू करता है और वहां से पीछे हटता जाता है।

क्या एक हल मेरे web request को ब्लॉक करेगा?

हाँ, और PHP में यह मायने रखता है। एक reCAPTCHA हल में कई सेकंड लग सकते हैं, इसलिए इसे किसी page render के अंदर करने से एक worker बँध जाता है। किसी request thread को ब्लॉक करने के बजाय हल को किसी queued job या CLI worker में डालें।

आवश्यकताएँ क्या हैं?

PHP 8.0 या इससे नया, के साथ curl और json extensions, दोनों ज़्यादातर installs के साथ बंडल होते हैं। कोई अन्य runtime dependencies नहीं हैं, इसलिए यह packages का एक पेड़ खींचे बिना किसी मौजूदा प्रोजेक्ट में शामिल हो जाता है।

सारांश

एक method, तीन variants, इससे चुने गए invisible और enterprise options array में। पढ़ें $result['code'], इसे इस रूप में सबमिट करें g-recaptcha-response, exceptions यहाँ से import करें CapSkip\Exceptions, और हल को अपने request threads से दूर रखें।

व्यापक PHP surface यहाँ है PHP कैप्चा सॉल्वर पेज, अन्य भाषाएँ यहाँ reCAPTCHA v2 सॉल्वर पेज, और एक है लाइव v2 डेमो जिसके विरुद्ध परीक्षण किया जाए। CapSkip एक है लोकल captcha सॉल्वर, इसलिए प्रति हल कुछ भी बिल नहीं होता।