Cloudflare Workers से CAPTCHA API को कॉल करें
सर्वर-साइड fetch से solvethree के टास्क API को कॉल करने के लिए Worker का उपयोग करें। वर्कस्पेस API कुंजी को सीक्रेट बाइंडिंग में रखें, लक्ष्य इनपुट Worker में तय करें और टास्क के रिस्पॉन्स केवल अपने अधिकृत एप्लिकेशन कॉलर को लौटाएँ।
इस पेज पर
लक्ष्य और सीक्रेट कॉन्फ़िगर करें
पहले कंसोल में अपने वर्कस्पेस के लिए लक्ष्य साइट की प्रोफ़ाइल सक्रिय करें। होस्टनेम और ऐक्शन भेजने से प्रोफ़ाइल नहीं बनती। यदि यह पूर्वापेक्षा पूरी नहीं हुई है, तो साइट प्रोफ़ाइल सेटअप देखें।
SOLVETHREE_API_KEY: आपकी वर्कस्पेस API कुंजी, जिसे Worker सीक्रेट के रूप में संग्रहीत किया जाता है।INTEGRATION_KEY: एक अलग सीक्रेट, जिसे आपके एप्लिकेशन कॉलर कोx-integration-keyमें भेजना होगा।SOLVETHREE_PROXY: समाधान के लिए उपयोग किया जाने वाला प्रॉक्सी URL। यदि इसमें क्रेडेंशियल हों, तो इसे सीक्रेट के रूप में संग्रहीत करें।CAPTCHA_SITE: लक्ष्य का होस्टनाम, पूरा URL नहीं।
उदाहरण में ऐक्शन login तय है और एक प्रॉक्सी दी गई है। इन डिप्लॉय किए गए इनपुट को अपने इंटीग्रेशन के अनुसार बदलें; कॉलर से मनमाने लक्ष्य इनपुट स्वीकार न करें। recaptchaType छोड़ने पर API डिफ़ॉल्ट रूप से reCAPTCHA Enterprise v3 का उपयोग करता है।
इंटीग्रेशन कुंजी का उपयोग किसी विश्वसनीय एप्लिकेशन कॉलर और Worker के बीच करें, सार्वजनिक रूप से वितरित ब्राउज़र कोड में नहीं। यह साझा क्रेडेंशियल है, प्रति-उपयोगकर्ता टास्क प्राधिकरण नहीं।
टास्क बनाएँ और प्राप्त करें
export default {
async fetch(request, env) {
if (!env.INTEGRATION_KEY || request.headers.get('x-integration-key') !== env.INTEGRATION_KEY) {
return new Response('Unauthorized', { status: 401 });
}
const url = new URL(request.url);
const headers = { Authorization: `Bearer ${env.SOLVETHREE_API_KEY}`, 'Content-Type': 'application/json' };
let response;
if (request.method === 'POST') {
const requestId = request.headers.get('x-request-id');
if (!requestId || !/^[A-Za-z0-9_-]{1,64}$/.test(requestId)) return new Response('Provide X-Request-ID', { status: 400 });
response = await fetch('https://api.solvethree.com/v1/tasks?waitMs=0', {
method: 'POST', headers, redirect: 'error', signal: AbortSignal.timeout(20000),
body: JSON.stringify({ site: env.CAPTCHA_SITE, action: 'login', proxy: env.SOLVETHREE_PROXY, requestId }),
});
} else if (request.method === 'GET') {
const id = url.searchParams.get('id');
if (!id || !/^[A-Za-z0-9_-]{1,128}$/.test(id)) return new Response('Provide a valid id', { status: 400 });
response = await fetch(`https://api.solvethree.com/v1/tasks/${encodeURIComponent(id)}?waitMs=15000`, {
headers, redirect: 'error', signal: AbortSignal.timeout(25000),
});
} else return new Response('Use POST or GET', { status: 405 });
if (!response.ok) return Response.json({ error: 'Solver API request failed', status: response.status }, { status: response.status });
return Response.json(await response.json(), { headers: { 'Cache-Control': 'no-store' } });
},
};
// Store keys in Worker secret bindings. The task proxy field does not add a
// generic HTTP proxy option to Workers fetch; another client must submit through it.- 1.
टास्क बनाएँ
Worker को
x-integration-keyऔरx-request-idके साथ POST भेजें। ऐसा अनुरोध ID चुनें जिसमें 1–64 ASCII अक्षर, अंक, अंडरस्कोर या हाइफ़न हों। Worker अपनी कॉन्फ़िगर की गई लक्ष्य जानकारी और प्रॉक्सी से टास्क बॉडी बनाता है; वह कॉलर की दी हुई बॉडी का उपयोग नहीं करता। - 2.
टास्क ID सहेजें
Worker सॉल्वर का JSON रिस्पॉन्स लौटाता है। लौटाए गए टास्क ID को सहेजें और उसे बनाने में उपयोग किए गए अनुरोध ID को भी सुरक्षित रखें।
- 3.
परिणाम प्राप्त करें
Worker को GET भेजें, जिसमें
idक्वेरी पैरामीटर में टास्क ID और वही इंटीग्रेशन-कुंजी हेडर हो। हैंडलर ID का सिंटैक्स जाँचता है और solvethree से वह टास्क प्राप्त करता है।
दोनों अपस्ट्रीम अनुरोध वर्कस्पेस कुंजी से प्रमाणित होते हैं। हैंडलर असफल HTTP स्टेटस कोड को सामान्य त्रुटि बॉडी के साथ आगे भेजता है और सफल JSON रिस्पॉन्स पर Cache-Control: no-store सेट करता है। वह साझा इंटीग्रेशन कुंजी के अलावा टास्क स्वामित्व की जाँच नहीं करता; अलग-अलग उपयोगकर्ताओं को टास्क प्राप्त करने की सुविधा देने से पहले यह प्राधिकरण जोड़ें।
दूसरा टास्क बनाए बिना टाइमआउट सँभालें
टास्क बनाने के लिए waitMs=0 और 20-सेकंड का fetch टाइमआउट उपयोग होता है। टास्क प्राप्त करने के लिए waitMs=15000 और 25-सेकंड का fetch टाइमआउट उपयोग होता है। ये सीमाएँ अलग-अलग HTTP कॉल पर लागू होती हैं, टास्क की पूरी अवधि पर नहीं।
यदि टास्क ID मिलने से पहले टास्क बनाने का अनुरोध टाइमआउट हो जाए, तो उसी अनुरोध ID के साथ वही टास्क अनुरोध दोबारा भेजें। यदि टास्क बन चुका है, तो इससे वही टास्क रिकवर हो जाता है। केवल कनेक्शन विफल होने के कारण नया ID न बनाएँ: पहला अनुरोध पहले ही solvethree तक पहुँच चुका हो सकता है। बदले हुए इनपुट के साथ ID दोबारा उपयोग करने पर टकराव होता है।
उदाहरण टाइमआउट सहित fetch अपवादों को कैच नहीं करता। यदि आपके कॉलर को संरचित त्रुटि रिस्पॉन्स चाहिए, तो अपवाद प्रबंधन जोड़ें, लेकिन रिकवरी के लिए अनुरोध ID उपलब्ध रखें।
pendingयाsolving: अपने कॉलर की समग्र समय-सीमा के भीतर उसी टास्क को फिर से प्राप्त करें।ready: समाधान उपलब्ध है; पोलिंग रोकें और उसे सबमिशन क्लाइंट को दें।failed: पोलिंग रोकें औरerrorCodeतथाerrorकी जाँच करें। दूसरा टास्क बनाने से पहले बताई गई समस्या ठीक करें।
HTTP त्रुटि और failed स्थिति वाला टास्क अलग-अलग विफलताएँ हैं। हैंडलर पहले HTTP स्टेटस जाँचता है; सफल रिस्पॉन्स में भी कॉलर को टास्क की स्थिति जाँचनी होगी। निदान के लिए CAPTCHA API त्रुटियाँ देखें।
प्रॉक्सी का उपयोग कर सकने वाले क्लाइंट से सबमिट करें
Worker का उदाहरण केवल solvethree को कॉल करता है। टास्क का proxy फ़ील्ड सॉल्वर को बताता है कि किस प्रॉक्सी का उपयोग करना है; यह Worker की नेटवर्क रूटिंग नहीं बदलता। Workers fetch में सामान्य प्रॉक्सी URL का कोई विकल्प नहीं है।
तैयार समाधान ऐसे क्लाइंट को भेजें जो उसी प्रॉक्सी के माध्यम से निर्धारित लक्ष्य पर सबमिट कर सके। असंबंधित ब्राउज़र हेडर के बजाय समाधान में लौटाए गए userAgent और secChUa का उपयोग करें। टास्क तैयार होने का अर्थ है कि solvethree ने समाधान जनरेट कर दिया है; उसकी स्वीकृति लक्ष्य को भेजे जाने वाले अगले अनुरोध पर निर्भर करती है।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।