PHP से reCAPTCHA Enterprise हल करें
आप PHP से सीधे solvethree को कॉल कर सकते हैं। नीचे दिया गया उदाहरण reCAPTCHA v3 Enterprise टोकन का अनुरोध करता है, टास्क पूरा होने तक उसकी स्थिति जाँचता है और समाधान विफल होने पर रुक जाता है।
इस पेज पर
चलाने से पहले
cURL एक्सटेंशन के साथ PHP 8+ का उपयोग करें। इसे अपने सर्वर पर cURL एक्सटेंशन सक्षम करके चलाएँ।
- कंसोल में अपने लक्ष्य होस्टनाम के लिए सक्रिय साइट प्रोफ़ाइल बनाएँ। साइट प्रोफ़ाइल सेटअप देखें।
SOLVETHREE_API_KEYको अपनी वर्कस्पेस API कुंजी औरSOLVETHREE_PROXYको अपने HTTP(S) प्रॉक्सी URL पर सेट करें।accounts.example.comऔरloginकी जगह अपना होस्टनाम और पेज पर इस्तेमाल होने वाला ऐक्शन दें।siteके लिए स्कीम या पाथ के बिना होस्टनाम का उपयोग करें।
टास्क बनाएँ और परिणाम की प्रतीक्षा करें
कोड को solve.php के रूप में सहेजें और php solve.php चलाएँ।
<?php
// Requires PHP 8+ with the cURL extension.
$apiKey = getenv('SOLVETHREE_API_KEY');
$proxy = getenv('SOLVETHREE_PROXY');
if (!$apiKey || !$proxy) throw new RuntimeException('Set the API key and proxy');
function api(string $path, ?array $body = null): array {
global $apiKey, $deadline;
$remaining = $deadline - microtime(true);
if ($remaining <= 0) throw new RuntimeException("Keep the task ID and resume polling");
$curl = curl_init('https://api.solvethree.com/v1' . $path);
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => min(30000, max(1, (int) ceil($remaining * 1000))),
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey, 'Content-Type: application/json'],
]);
if ($body !== null) {
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($body, JSON_THROW_ON_ERROR));
}
$raw = curl_exec($curl);
$error = curl_error($curl);
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
if ($raw === false) throw new RuntimeException('Connection failed: ' . $error);
if ($status < 200 || $status >= 300) throw new RuntimeException('API HTTP ' . $status);
return json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
}
$requestId = bin2hex(random_bytes(16)); // Save this with the task inputs for recovery.
$deadline = microtime(true) + 180;
$task = api('/tasks?waitMs=0', [
'site' => 'accounts.example.com', 'action' => 'login',
'proxy' => $proxy, 'requestId' => $requestId,
]);
while (in_array($task['status'], ['pending', 'solving'], true)) {
if (microtime(true) >= $deadline) throw new RuntimeException('Keep the task ID and resume polling');
$task = api('/tasks/' . rawurlencode($task['id']) . '?waitMs=15000');
if (in_array($task['status'], ['pending', 'solving'], true)) usleep(1000000);
}
if ($task['status'] !== 'ready') throw new RuntimeException(
($task['errorCode'] ?? 'Unexpected task state') . ': ' . ($task['error'] ?? '')
);
$solution = $task['solution'];
// Use $solution['token'], ['userAgent'] and ['secChUa'] with the same proxy.
echo 'Ready task: ' . $task['id'] . PHP_EOL;POST तुरंत टास्क लौटाने के लिए waitMs=0 का उपयोग करता है। फिर हर GET अपडेट के लिए अधिकतम 15 सेकंड प्रतीक्षा करता है। लूप pending या solving पर चलता रहता है और ready या failed पर रुक जाता है।
अनुरोध डिफ़ॉल्ट रूप से Enterprise v3 का उपयोग करता है। मानक v3 के लिए recaptchaType: v3 जोड़ें। reCAPTCHA टास्क बॉडी में type और url शामिल न करें।
अपने एप्लिकेशन में टोकन का उपयोग करें
टोकन $solution['token'] में है। प्रोग्राम द्वारा प्रिंट किया गया टास्क ID, टास्क प्राप्त करने के लिए है; अपने एप्लिकेशन के CAPTCHA फ़ील्ड में टोकन का मान उपयोग करें।
लक्ष्य अनुरोध में $solution['userAgent'] को User-Agent और $solution['secChUa'] को sec-ch-ua के रूप में उपयोग करें।
वह अनुरोध उसी प्रॉक्सी से भेजें जिसका उपयोग समाधान के लिए हुआ था। फिर एप्लिकेशन की प्रतिक्रिया जाँचें: टोकन जनरेट हो जाने से यह साबित नहीं होता कि लक्ष्य ने अनुरोध स्वीकार कर लिया।
अगर अनुरोध विफल हो जाए
विफल टास्क में errorCode और error शामिल होते हैं; उदाहरण रुककर इन्हें रिपोर्ट करता है। विफल समाधानों का शुल्क वापस कर दिया जाता है। 401 या 402 जैसी HTTP त्रुटि अनुरोध की एक अलग समस्या है—दोबारा कोशिश करने से पहले API त्रुटि संदर्भ देखें।
अगर टाइमआउट या प्रोसेस रीस्टार्ट के बाद रिकवरी चाहिए, तो requestId और टास्क के सटीक इनपुट सहेजकर रखें। अगर आपके पास टास्क ID है, तो उसकी पोलिंग करें। अन्यथा, मूल इनपुट उसी requestId के साथ दोबारा भेजें। केवल प्रोग्राम रीस्टार्ट करने से दूसरा ID जनरेट होता है और एक और शुल्क योग्य समाधान बन सकता है।
कॉलर अपनी समय-सीमा के बाद प्रतीक्षा बंद कर देता है; इससे पहले से बना टास्क रद्द नहीं होता। पूरी प्रक्रिया के लिए पोलिंग और टाइमआउट रिकवरी देखें।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।