PowerShell से CAPTCHA API को कॉल करें
solvethree को सीधे कॉल करने के लिए PowerShell 7.5+ और Invoke-RestMethod का उपयोग करें। नीचे दी गई स्क्रिप्ट एक reCAPTCHA Enterprise टास्क बनाती है और उसी टास्क ID को तब तक पोल करती है जब तक वह पूरा न हो जाए या प्रतीक्षा के लिए तय स्थानीय समय समाप्त न हो जाए।
इस पेज पर
क्रेडेंशियल और लक्ष्य इनपुट सेट करें
- 1.
साइट को अपने वर्कस्पेस के लिए उपलब्ध करें
कंसोल में लक्ष्य होस्टनाम के लिए सक्रिय प्रोफ़ाइल कॉन्फ़िगर करें। होस्टनाम और ऐक्शन भेजने से प्रोफ़ाइल नहीं बनती। यदि यह अभी नहीं किया गया है, तो साइट प्रोफ़ाइल सेटअप देखें।
- 2.
एनवायरनमेंट वेरिएबल दें
सीक्रेट संभालने के अपने सामान्य तरीके से PowerShell प्रक्रिया के एनवायरनमेंट में
SOLVETHREE_API_KEYऔरSOLVETHREE_PROXYसेट करें। चलाने से पहले जाँच लें कि दोनों में मान हैं। API कुंजी Bearer हेडर में जाती है; इसे टास्क JSON में न रखें। - 3.
उदाहरण का होस्टनाम और ऐक्शन बदलें
accounts.example.comऔरloginको अपने इंटीग्रेशन के लिए आवश्यक होस्टनाम और ऐक्शन से बदलें। पूरे URL के बजाय होस्टनाम इस्तेमाल करें। अनुरोध डिफ़ॉल्ट रूप से Enterprise v3 का उपयोग करता है, इसलिए इसमें न तोtypeऔर न हीurlफ़ील्ड की ज़रूरत है।
एक बार बनाएँ, फिर टास्क ID को पोल करें
#requires -Version 7.5
$ErrorActionPreference = 'Stop'
$apiBase = 'https://api.solvethree.com/v1'
$headers = @{ Authorization = "Bearer $env:SOLVETHREE_API_KEY"; Accept = 'application/json' }
$taskInput = @{ site = 'accounts.example.com'; action = 'login'; proxy = $env:SOLVETHREE_PROXY; requestId = [guid]::NewGuid().ToString() }
$requestClock = [Diagnostics.Stopwatch]::StartNew()
function Call-TaskApi($Method, $Path, $Payload = $null) {
$remaining = 180 - $requestClock.Elapsed.TotalSeconds
if ($remaining -le 0) { throw 'Local deadline reached' }
$seconds = [int][Math]::Ceiling([Math]::Min(25, $remaining))
$options = @{ Method = $Method; Uri = "$apiBase$Path"; Headers = $headers;
ConnectionTimeoutSeconds = $seconds; OperationTimeoutSeconds = $seconds;
MaximumRetryCount = 0; MaximumRedirection = 0 }
if ($null -ne $Payload) { $options.Body = $Payload | ConvertTo-Json -Depth 6; $options.ContentType = 'application/json' }
Invoke-RestMethod @options
}
$taskId = $null
try {
$result = Call-TaskApi 'POST' '/tasks?waitMs=0' $taskInput
$taskId = $result.id
while ($result.status -in @('pending', 'solving')) {
$escapedId = [uri]::EscapeDataString($taskId)
$result = Call-TaskApi 'GET' "/tasks/$escapedId`?waitMs=15000"
if ($result.status -in @('pending', 'solving')) { Start-Sleep -Seconds 1 }
}
if ($result.status -ne 'ready') { throw "Task failed: $($result.errorCode)" }
Write-Host "Ready task: $taskId"
# Submit $result.solution.token with userAgent/secChUa and the original proxy.
} catch {
Write-Host "Recovery requestId=$($taskInput.requestId) taskId=$taskId"
throw
}स्क्रिप्ट /v1/tasks?waitMs=0 पर एक POST भेजती है। इसके बाद के अनुरोध लौटाई गई ID के लिए GET होते हैं, जिनमें waitMs=15000 इस्तेमाल होता है। pending और solving लूप को चालू रखते हैं; कोई अन्य स्थिति इसे समाप्त कर देती है।
ConvertTo-Json हाथ से उद्धरण चिह्न लगाकर बनाए गए JSON या शेल कमांड पर निर्भर रहने के बजाय टास्क हैशटेबल को सीरियलाइज़ करता है। पोलिंग से पहले टास्क ID को URL-एस्केप किया जाता है। उदाहरण में बदलाव करते समय इन हिस्सों को बनाए रखें।
Stopwatch हर API कॉल से पहले 180 सेकंड की स्थानीय समय-सीमा जाँचता है। हर कॉल के लिए कनेक्शन और ऑपरेशन टाइमआउट अधिकतम 25 सेकंड होते हैं, जो बचा हुआ समय घटने के साथ कम किए जाते हैं। अंतिम स्थिति न मिलने वाली पोल के बाद स्क्रिप्ट एक सेकंड रुकती है। यह समय-सीमा अंतहीन पोलिंग रोकती है; यह वास्तविक बीते समय के हिसाब से बिल्कुल सटीक कटऑफ़ नहीं है।
MaximumRetryCount = 0 स्वचालित HTTP पुनःप्रयास बंद करता है, और MaximumRedirection = 0 रीडायरेक्ट अस्वीकार करता है। यहाँ इस्तेमाल किए गए टाइमआउट पैरामीटर के लिए PowerShell 7.5+ चाहिए, केवल कोई भी PowerShell 7 इंस्टॉलेशन पर्याप्त नहीं है। Microsoft के Invoke-RestMethod संदर्भ में इन पैरामीटर का दस्तावेज़ीकरण है।
टोकन इस्तेमाल करें, टास्क ID नहीं
ready होने पर सबमिट करने वाला reCAPTCHA मान $result.solution.token है। $taskId केवल solvethree टास्क की पहचान करता है। यह उदाहरण आपके लक्ष्य पर ऐप्लिकेशन अनुरोध भेजने से पहले रुक जाता है।
मूल प्रॉक्सी का इस्तेमाल करते हुए, लौटाए गए समाधान के userAgent और secChUa के साथ टोकन सबमिट करें। इसकी जगह किसी असंबंधित ब्राउज़र पहचान का इस्तेमाल न करें और न ही इसे किसी दूसरे लक्ष्य पर भेजें। ready का मतलब है कि solvethree ने समाधान तैयार कर दिया है; इससे यह साबित नहीं होता कि लक्ष्य ने आपका ऐप्लिकेशन अनुरोध स्वीकार कर लिया।
- Invoke-RestMethod HTTP या कनेक्शन अपवाद फेंकता है
स्क्रिप्ट के सफल रिस्पॉन्स को प्रोसेस करने से पहले API अनुरोध विफल हो गया। catch ब्लॉक रिकवरी ID प्रिंट करता है और मूल अपवाद को फिर से फेंकता है।
यह आज़माएँ: उपलब्ध होने पर HTTP स्थिति और रिस्पॉन्स के विवरण जाँचें। अमान्य इनपुट को बिना बदले दोबारा भेजने के बजाय उन्हें ठीक करें। अगर टास्क बनाने का परिणाम अनिश्चित था, तो नीचे बताए गए तरीके से उसे रिकवर करें।
- टास्क failed लौटाता है
$result.errorCodeऔर$result.errorदोनों जाँचें। स्क्रिप्ट के टास्क की अंतिम स्थिति वाले अपवाद में केवल त्रुटि कोड होता है।यह आज़माएँ: उस टास्क की पोलिंग रोकें और बताए गए कारण को ठीक करें। उदाहरण के लिए,
site-unreachableटास्क की त्रुटि है, यह इस बात का प्रमाण नहीं है कि API अनुरोध स्वयं विफल हुआ। CAPTCHA API त्रुटियाँ देखें।
दूसरा टास्क बनाए बिना अनिश्चित परिणाम वाले अनुरोध को रिकवर करें
टाइमआउट से यह साबित नहीं होता कि बनाने का अनुरोध विफल हुआ। catch ब्लॉक requestId और, अगर मिला हो, तो taskId प्रिंट करता है। इन मानों को संभालकर रखें।
- 1.
यदि आपके पास टास्क ID है, तो वह टास्क प्राप्त करें
दूसरा टास्क बनाने के बजाय GET
/v1/tasks/:idके साथ आगे बढ़ें। स्क्रिप्ट की स्थानीय समय-सीमा पूरी होने से यह साबित नहीं होता कि रिमोट टास्क विफल हो गया। - 2.
अगर बनाने पर टास्क ID नहीं मिली, तो मूल अनुरोध दोबारा इस्तेमाल करें
मौजूदा टास्क रिकवर करने के लिए उन्हीं टास्क इनपुट को उसी
requestIdके साथ फिर से सबमिट करें। उस ID को दोबारा इस्तेमाल करते हुए इनपुट बदलने से टकराव होता है। - 3.
रिकवरी के लिए इस स्क्रिप्ट को फिर से शुरू न करें
नए सिरे से चलाने पर नया GUID बनता है और इसलिए एक नया तार्किक अनुरोध बनता है। बिना निगरानी के इस्तेमाल के लिए, POST से पहले मूल requestId और टास्क इनपुट सुरक्षित रूप से सहेजें, फिर टास्क ID मिलने पर उसे सहेजें। उदाहरण विफलता पर रिकवरी ID प्रिंट करता है, लेकिन प्रक्रिया बंद हो जाने पर उन्हें सुरक्षित नहीं रखता।
अगर प्रॉक्सी URL में क्रेडेंशियल हैं, तो सहेजे गए इनपुट को सामान्य लॉग में न रखें। रिकवरी के लिए आपको मूल इनपुट चाहिए, API कुंजी की एक और कॉपी नहीं।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।