FastAPI बैकएंड से solvethree को कॉल करें
टास्क बनने के बाद उसे लौटाएँ, पूरी समाधान प्रक्रिया के बाद नहीं। कॉलर उसका स्टेटस ready या failed होने तक प्राप्त करता रहता है, फिर समाधान सफल होने पर लक्ष्य को टोकन सबमिट करता है।
इस पेज पर
सर्वर और टार्गेट कॉन्फ़िगर करें
Python 3.10 या बाद का संस्करण इस्तेमाल करें। python -m pip install "fastapi[standard]" से FastAPI इंस्टॉल करें, फिर python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl से आधिकारिक SDK इंस्टॉल करें।
ऐप शुरू करने से पहले सर्वर प्रोसेस में ये एनवायरनमेंट वैरिएबल सेट करें:
SOLVETHREE_API_KEY: आपकी वर्कस्पेस API की। इसे सर्वर पर रखें; SDK इसे solvethree के साथ प्रमाणीकरण के लिए इस्तेमाल करता है।INTEGRATION_KEY: एक अलग सीक्रेट, जिसे कॉलर आपके FastAPI रूट के साथ प्रमाणीकरण के लिएX-Integration-Keyहेडर में भेजते हैं।CAPTCHA_SITE: लक्ष्य का होस्टनाम, पूरा URL नहीं।SOLVETHREE_PROXY: इस टास्क के लिए इस्तेमाल किया जाने वाला HTTP या HTTPS प्रॉक्सी URL, जिसमें पाथ, क्वेरी या फ़्रैगमेंट न हो।
रूट को कॉल करने से पहले अपने वर्कस्पेस में लक्ष्य के लिए एक सक्रिय प्रोफ़ाइल बनाएँ। उदाहरण ऐक्शन को login पर तय करता है, इसलिए प्रोफ़ाइल और इच्छित लक्ष्य अनुरोध उस उपयोग से मेल खाने चाहिए। होस्टनाम देने से प्रोफ़ाइल नहीं बनती; साइट प्रोफ़ाइल सेटअप देखें।
FastAPI रूट जोड़ें और चलाएँ
इस उदाहरण को main.py के रूप में सहेजें। दोनों रूट के लिए X-Integration-Key ज़रूरी है। टास्क बनाने वाला रूट अपना टास्क पूरी तरह सर्वर कॉन्फ़िगरेशन से बनाता है; कॉलर अनुरोध बॉडी में साइट, ऐक्शन या प्रॉक्सी नहीं देते।
# pip install "fastapi[standard]" and the official solvethree SDK wheel.
import hmac
import os
from fastapi import FastAPI, HTTPException, Request
from fastapi.concurrency import run_in_threadpool
from solvethree import Solvethree, SolvethreeError
app = FastAPI()
def authorize(request):
if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
raise HTTPException(status_code=401, detail="Unauthorized")
@app.post("/captcha/tasks")
async def create(request: Request):
authorize(request)
task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
if request.headers.get("x-request-id"):
task["requestId"] = request.headers["x-request-id"]
def submit():
return Solvethree(os.environ["SOLVETHREE_API_KEY"]).create_task(task, wait_ms=0, timeout=20)
try:
return await run_in_threadpool(submit)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid task input")
except SolvethreeError as error:
raise HTTPException(status_code=502, detail={"requestId": error.request_id, "taskId": error.task_id})
@app.get("/captcha/tasks/{task_id}")
async def retrieve(task_id: str, request: Request):
authorize(request)
def fetch():
return Solvethree(os.environ["SOLVETHREE_API_KEY"]).get_task(task_id, wait_ms=15000, timeout=25)
try:
return await run_in_threadpool(fetch)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid task ID")
except SolvethreeError as error:
raise HTTPException(status_code=502, detail={"requestId": error.request_id, "taskId": error.task_id})टास्क डिफ़ॉल्ट रूप से reCAPTCHA Enterprise v3 इस्तेमाल करता है। यह type या url फ़ील्ड के बिना site, action और एक proxy भेजता है।
Python SDK सिंक्रोनस है। इसे सीधे async def के अंदर कॉल करने से इवेंट लूप ब्लॉक हो जाएगा, इसलिए दोनों हैंडलर run_in_threadpool इस्तेमाल करते हैं। टास्क बनाने में wait_ms=0 और 20 सेकंड का SDK अनुरोध टाइमआउट इस्तेमाल होता है; टास्क प्राप्त करने में 25 सेकंड के SDK अनुरोध टाइमआउट के साथ 15 सेकंड तक इंतज़ार की अनुमति है। कोई भी हैंडलर client.solve का इस्तेमाल करके पूरी समाधान प्रक्रिया का इंतज़ार नहीं करता।
स्थानीय डेवलपमेंट के लिए फ़ाइल वाली डायरेक्टरी से fastapi dev main.py चलाएँ। रूट POST http://127.0.0.1:8000/captcha/tasks और GET http://127.0.0.1:8000/captcha/tasks/{task_id} हैं। FastAPI app ऑब्जेक्ट ढूँढ लेता है; रजिस्टर करने के लिए कोई अलग URLconf नहीं है।
टास्क बनाएँ, प्राप्त करें और बाधित अनुरोध पुनः प्राप्त करें
- 1.
स्थिर अनुरोध ID के साथ एक बार बनाएँ
X-Integration-Key और इस तार्किक टास्क के लिए सहेजकर रखे गए X-Request-ID के साथ POST /captcha/tasks भेजें। अनुरोध ID में 1–64 ASCII अक्षर, अंक, अंडरस्कोर या हाइफ़न होने चाहिए। रूट इसे requestId के रूप में solvethree को भेजता है। लौटाई गई टास्क id सहेजें।
- 2.
टास्क स्टेटस पढ़ने से पहले HTTP स्टेटस जाँचें
रैपर असफल प्रमाणीकरण के लिए 401, ValueError इनपुट विफलताओं के लिए 400 और पकड़े गए SolvethreeError अपवादों के लिए 502 लौटाता है। इसके 502 detail में SDK त्रुटि के requestId और taskId होते हैं। रिस्पॉन्स को टास्क मानने से पहले उस HTTP त्रुटि को संभालें।
- 3.
मौजूदा टास्क प्राप्त करें
X-Integration-Key के साथ GET /captcha/tasks/{task_id} कॉल करें। हर सफल HTTP रिस्पॉन्स के बाद status जाँचें। इंतज़ार समाप्त होने के बाद भी टास्क प्राप्त करने का अनुरोध ऐसा टास्क लौटा सकता है जो अभी अंतिम स्थिति में नहीं पहुँचा है; दूसरा टास्क बनाने के बजाय उसी टास्क को फिर प्राप्त करें।
- 4.
अनिश्चित टास्क निर्माण से पुनर्प्राप्ति करें
अगर टास्क बनाने का अनुरोध टाइमआउट हो जाए और आपके पास टास्क ID हो, तो उसे प्राप्त करें। अन्यथा, अपने मूल X-Request-ID और बिना बदले सर्वर-साइड टास्क इनपुट के साथ POST दोहराएँ। उसी टास्क के साथ उस ID का दोबारा इस्तेमाल करने पर मौजूदा टास्क लौटता है; बदले हुए इनपुट से टकराव होता है। मूल ID को किसी त्रुटि रिस्पॉन्स के requestId से बदलने के बजाय अलग से सहेजकर रखें।
| कार्य की स्थिति | कॉलर की कार्रवाई |
|---|---|
| pending या solving | उसी टास्क को प्राप्त करना जारी रखें। अभी कोई उपयोग योग्य समाधान नहीं है। |
| तैयार | solution पढ़ें और लक्ष्य अनुरोध तैयार करें। |
| failed | पोलिंग रोकें। नया टास्क बनाना उचित है या नहीं, यह तय करने से पहले errorCode और error जाँचें; असफल समाधान प्रक्रियाओं का शुल्क वापस कर दिया जाता है। |
मूल प्रॉक्सी और लौटाई गई पहचान के साथ टोकन सबमिट करें
ये रूट टास्क डेटा लौटाते हैं; लक्ष्य वेबसाइट पर कुछ भी सबमिट नहीं करते। status के ready होने पर लक्ष्य अनुरोध भेजने वाले कंपोनेंट को टास्क ID नहीं, बल्कि solution.token इस्तेमाल करना होगा।
लौटाई गई solution.userAgent और solution.secChUa ब्राउज़र पहचान के साथ उसी प्रॉक्सी से सबमिट करें जिसका इस्तेमाल उस टास्क को बनाने में हुआ था। यह मानने के बजाय कि वर्तमान एनवायरनमेंट में अब भी वही प्रॉक्सी है, मूल टास्क कॉन्फ़िगरेशन सहेजकर रखें। SDK का successful_proxy(original_task, ready_result) हेल्पर उस मूल टास्क से प्रॉक्सी चुनता है।
सबमिशन को इच्छित लक्ष्य और ऐक्शन से जुड़ा रखें। ready टास्क का मतलब है कि solvethree ने समाधान जनरेट किया है; केवल लक्ष्य का रिस्पॉन्स बताता है कि एप्लिकेशन अनुरोध स्वीकार हुआ या नहीं।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।