CAPTCHA टास्क API के साथ Guzzle का उपयोग करें
टास्क बनाने के लिए Guzzle 7 इस्तेमाल करें, फिर उसके ready या failed होने तक उसका ID पोल करें। कुछ भी गलत होने पर requestId सहेजकर रखें: कनेक्शन टाइमआउट यह साबित नहीं करता कि टास्क बनाना विफल हुआ था।
यह REST इंटीग्रेशन है, आधिकारिक PHP SDK नहीं।
इस पेज पर
reCAPTCHA अनुरोध तैयार करें
- Composer से Guzzle 7 इंस्टॉल करें। इंस्टॉलेशन कमांड उदाहरण के सबसे ऊपर दी गई है।
- SOLVETHREE_API_KEY को अपनी वर्कस्पेस API कुंजी और SOLVETHREE_PROXY को प्रॉक्सी URL पर सेट करें। कुंजी सर्वर पर रखें।
- समाधान का अनुरोध करने से पहले कंसोल में अपनी लक्षित साइट के लिए सक्रिय प्रोफ़ाइल बनाएँ। साइट प्रोफ़ाइल सेटअप देखें।
- accounts.example.com और login को लक्षित होस्टनाम और ऐक्शन से बदलें। site फ़ील्ड में होस्टनाम जाता है, पूरा URL नहीं।
उदाहरण reCAPTCHA Enterprise v3 का अनुरोध करता है, जो डिफ़ॉल्ट recaptchaType है। type या url फ़ील्ड न जोड़ें। यह एक proxy देता है; यदि आप इसके बजाय proxyCandidates इस्तेमाल करते हैं, तो proxy पूरी तरह छोड़ दें।
एक बार बनाएँ, फिर निश्चित समय-सीमा में पोल करें
<?php
// composer require guzzlehttp/guzzle:^7
require __DIR__.'/vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'https://api.solvethree.com/v1/',
'headers' => ['Authorization' => 'Bearer '.getenv('SOLVETHREE_API_KEY'), 'Accept' => 'application/json'],
'allow_redirects' => false,
'http_errors' => false,
]);
$input = ['site' => 'accounts.example.com', 'action' => 'login',
'proxy' => getenv('SOLVETHREE_PROXY'), 'requestId' => bin2hex(random_bytes(16))];
$deadline = microtime(true) + 180;
$call = function (string $method, string $path, array $options = []) use ($client, $deadline): array {
$remaining = $deadline - microtime(true);
if ($remaining <= 0) throw new RuntimeException('Local deadline reached');
$response = $client->request($method, $path, $options + ['timeout' => min(25, $remaining), 'connect_timeout' => min(10, $remaining)]);
if ($response->getStatusCode() < 200 || $response->getStatusCode() >= 300) {
throw new RuntimeException('API HTTP '.$response->getStatusCode());
}
return json_decode((string)$response->getBody(), true, 512, JSON_THROW_ON_ERROR);
};
$id = null;
try {
$result = $call('POST', 'tasks?waitMs=0', ['json' => $input]);
$id = $result['id'];
while (in_array($result['status'], ['pending', 'solving'], true)) {
$result = $call('GET', 'tasks/'.rawurlencode($id).'?waitMs=15000');
if (in_array($result['status'], ['pending', 'solving'], true)) usleep(1000000);
}
if ($result['status'] !== 'ready') {
throw new RuntimeException('Task failed: '.($result['errorCode'] ?? 'unknown'));
}
echo 'Ready task: '.$id.PHP_EOL;
// Submit $result['solution']['token'] with userAgent/secChUa and the same proxy.
} catch (Throwable $error) {
fwrite(STDERR, 'Recovery requestId='.$input['requestId'].' taskId='.($id ?? 'unknown').PHP_EOL);
throw $error;
}क्लाइंट Bearer कुंजी से प्रमाणित होता है। उसका base_uri /v1/ पर समाप्त होता है और अनुरोध पाथ सापेक्ष हैं, इसलिए उनमें वह API प्रीफ़िक्स बना रहता है। Guzzle का json विकल्प टास्क इनपुट को JSON के रूप में भेजता है।
हेल्पर टास्क बनाने के लिए एक POST करता है। फिर जब तक स्थिति pending या solving रहती है, वह लौटाए गए टास्क ID को पोल करता है। टास्क बनाने और पोलिंग के लिए कुल 180 सेकंड की साझा सीमा है; हर HTTP कॉल शेष समय तक सीमित है, और अनुरोध व कनेक्शन के अधिकतम टाइमआउट क्रमशः 25 और 10 सेकंड हैं। नया पोल कुल समय-सीमा को फिर से शुरू नहीं करता।
रीडायरेक्ट बंद हैं। http_errors को false पर सेट करने से हेल्पर सफल पेलोड डिकोड करने से पहले गैर-2xx रिस्पॉन्स स्पष्ट रूप से जाँच सकता है; इससे कनेक्शन त्रुटियाँ या टाइमआउट दबते नहीं हैं।
- गैर-2xx HTTP रिस्पॉन्स पर API HTTP त्रुटि फेंकी जाती है। इसे असफल समाधान मानने के बजाय रिस्पॉन्स की स्थिति और बॉडी की जाँच करके कारण पता करें।
- failed की अंतिम स्थिति वाला टास्क पोलिंग रोक देता है। उदाहरण उसका errorCode फेंकता है; निदान संदेश के लिए टास्क का error फ़ील्ड भी जाँचें। असफल समाधानों की राशि वापस कर दी जाती है।
- केवल ready में उपयोग करने योग्य समाधान होता है। प्रिंट की गई “Ready task” पंक्ति बताती है कि टास्क तैयार है, यह नहीं कि लक्षित वेबसाइट ने उसे स्वीकार कर लिया है।
दूसरे कार्य का भुगतान किए बिना टाइमआउट हुए अनुरोध को रिकवर करें
POST भेजने से पहले जनरेट किया गया requestId और सटीक टास्क इनपुट सहेजें। catch ब्लॉक requestId और, यदि टास्क बनाने पर मिला हो, taskId प्रिंट करता है। वह आउटपुट रिकवरी में मदद करता है, लेकिन अनुरोध भेजने से पहले उसे सहेजने का विकल्प नहीं है।
- 1.
यदि आपके पास टास्क ID है, तो वह टास्क प्राप्त करें
उसकी स्थिति जाँचने के लिए GET /v1/tasks/:id इस्तेमाल करें। हेल्पर की स्थानीय समय-सीमा तक पहुँचने से यह साबित नहीं होता कि रिमोट टास्क विफल हो गया।
- 2.
यदि टास्क बनाने का अनुरोध ID लौटाए बिना टाइमआउट हुआ, तो requestId से रिकवरी करें
सहेजे गए requestId के साथ वही टास्क अनुरोध सबमिट करें। मेल खाते इनपुट पर मौजूदा टास्क लौटता है; उस ID के साथ अलग इनपुट भेजने पर कॉन्फ़्लिक्ट होता है।
- 3.
रिकवरी के शॉर्टकट के तौर पर स्क्रिप्ट दोबारा न चलाएँ
हर बार चलाने पर नया requestId जनरेट होता है। ऐसा स्वचालित POST रीट्राई न जोड़ें जो दूसरा ID जनरेट करे, और अमान्य इनपुट को बिना बदले आँख मूँदकर दोबारा न भेजें।
उसी प्रॉक्सी से टोकन सबमिट करें
उदाहरण लक्ष्य से संपर्क करने से पहले रुक जाता है। टास्क ID नहीं, solution.token सबमिट करें—और लौटाए गए solution.userAgent तथा solution.secChUa को लक्षित अनुरोध के User-Agent और Sec-CH-UA हेडर के रूप में इस्तेमाल करें।
टास्क के JSON में मौजूद proxy, solvethree को बताता है कि समाधान के लिए कौन-सी प्रॉक्सी इस्तेमाल करनी है। यह Guzzle के API कनेक्शन या लक्ष्य को बाद में भेजे जाने वाले आपके अनुरोध को कॉन्फ़िगर नहीं करता। लक्षित अनुरोध को अलग से कॉन्फ़िगर करें ताकि वह उसी प्रॉक्सी का इस्तेमाल करे।
लक्षित अनुरोध के लिए अलग क्लाइंट इस्तेमाल करें ताकि API क्लाइंट का डिफ़ॉल्ट Authorization हेडर वेबसाइट को न भेजा जाए। टोकन, लौटाई गई ब्राउज़र पहचान, प्रॉक्सी और इच्छित लक्ष्य को साथ रखें। यदि अगला अनुरोध मेल नहीं खाता, तो तैयार टोकन भी अस्वीकार हो सकता है।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।