
Rajinder Singh
Deep Learning Researcher

202 चुनौति उत्तर या 405 कैप्चा उत्तर लौटा सकता है; एजेंट को राउटिंग से पहले स्थिति और x-amzn-waf-action हेडर दोनों की जांच करनी चाहिए।capsolver-core पर एक एजेंट अनुकूलक के साथ एक तैयार LangChain उपकरण और ब्राउज़र-मुख्य डिटेक्शन और भरने के तरीके प्रदान करता है।resolved, not_needed, review, या denied दें।AWS WAF चुनौति और कैप्चा कार्रवाई नॉर्मल अनुरोध मार्ग को बदल देती है। AWS WAF कार्रवाई दस्तावेज़ के अनुसार, एक वैध टोकन वाला अनुरोध अगले नियम तक जाता है। एक अवैध टोकन के साथ अनुरोध के बजाय, इसे एक चुनौति उत्तर प्राप्त हो सकता है।
चुनौति के लिए, AWS एक x-amzn-waf-action: challenge उत्तर हेडर और HTTP स्थिति 202 दस्तावेज़ करता है। कैप्चा के लिए, यह x-amzn-waf-action: captcha और स्थिति 405 दस्तावेज़ करता है। जब क्लाइंट के पास HTML अपेक्षा होती है, तो AWS WAF एक जावास्क्रिप्ट इंटरस्टीशियल लौटा सकता है। सफल अंतर्क्रिया टोकन को अपडेट करती है और मूल अनुरोध को फिर से भेजती है।
इस व्यवहार का एजेंट पर महत्व है क्योंकि एक सामान्य HTTP क्लाइंट उत्तर को एक सामान्य पृष्ठ, अस्थायी सर्वर त्रुटि या खाली परिणाम के रूप में अनुमान लगा सकता है। एक भाषा मॉडल को यह अनुमान नहीं लगाना चाहिए। होस्ट एप्लिकेशन को उत्तर का वर्गीकरण, प्राधिकरण की जांच करना और वर्कफ़्लो को नियंत्रित बहाली चरण में राउट करना चाहिए।
लक्ष्य चुनौति निपटान को अदृश्य नहीं करना है। लक्ष्य इसे स्पष्ट, सीमित, निरीक्षण योग्य और कानूनी स्वामित्व वाली प्रणालियों पर कानूनी ऑटोमेशन तक सीमित रखना है।
एक उत्पादन डिज़ाइन में पांच अलग-अलग जिम्मेदारियां होती हैं:
CapSolver के आधिकारिक एजेंट उपकरण गाइड में capsolver-agent को capsolver-core पर एक पतला अनुकूलक के रूप में वर्णित किया गया है। मुख्य पैकेज ऑपरेशन जैसे solve, detect और solve_on_page करता है; एजेंट पैकेज फ्रेमवर्क-मित्र उपकरण स्कीमा प्रदान करता है। इसके दस्तावेज़ किए गए LangChain मार्ग द्वारा get_langchain_tools() के माध्यम से तैयार उपकरण प्रदान किए जाते हैं।
इस सीमा उपयोगी है। मॉडल को क्रमशः प्राधिकरण, टोकन, ब्राउज़र ऑब्जेक्ट या असीमित नेटवर्क कार्य की आवश्यकता नहीं होती है। यह निश्चित एप्लिकेशन कोड द्वारा तब तक चलाया जा सकता है जब तक कि उपकरण चलाया जा सकता है।
एजेंट कोड लिखने से पहले, संचालन सीमा को परिभाषित करें:
CAPSOLVER_API_KEY और मॉडल प्राधिकरण के लिए एक गोपनीय स्टोर;एक अलग Python वातावरण का उपयोग करें। नीचे दिए गए इंस्टॉल कमांड वर्तमान CapSolver एजेंट गाइड के अनुसार हैं:
python -m venv .venv
source .venv/bin/activate
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install "capsolver-agent[langchain] @ git+https://github.com/capsolver-ai/capsolver-agent.git"
pip install langchain-openai langgraph playwright
playwright install chromium
प्राधिकरण को स्रोत नियंत्रण से बाहर रखें:
export CAPSOLVER_API_KEY="set-this-in-your-secret-manager"
export OPENAI_API_KEY="set-this-in-your-secret-manager"
वास्तविक गोपनीयता को प्रॉम्प्ट, ट्रेस, नोटबुक, अनुरोध या चेकपॉइंट में न चिपकाएं। वातावरण चर लोकल उदाहरणों के लिए उपयोगी हैं; डेप्लॉइड सिस्टम में एक प्रबंधित गोपनीय स्टोर बेहतर है।
पहला निश्चित घटक उत्तर का वर्गीकरण होना चाहिए। इस उदाहरण में AWS द्वारा दस्तावेज़ किए गए स्थिति और हेडर संयोजन का उपयोग किया गया है:
from dataclasses import dataclass
from typing import Mapping, Literal
WafAction = Literal["challenge", "captcha", "none", "unknown"]
@dataclass(frozen=True)
class WafSignal:
action: WafAction
status_code: int
needs_review: bool = False
def classify_aws_waf_response(
status_code: int,
headers: Mapping[str, str],
) -> WafSignal:
normalized = {key.lower(): value.lower() for key, value in headers.items()}
action = normalized.get("x-amzn-waf-action", "")
if action == "challenge" and status_code == 202:
return WafSignal(action="challenge", status_code=status_code)
if action == "captcha" and status_code == 405:
return WafSignal(action="captcha", status_code=status_code)
if action in {"challenge", "captcha"}:
return WafSignal(
action="unknown",
status_code=status_code,
needs_review=True,
)
return WafSignal(action="none", status_code=status_code)
दोनों संकेतों की आवश्यकता है। एक 202 अकेले एक वैध एप्लिकेशन उत्तर हो सकता है, और एक 405 अकेले एंडपॉइंट के HTTP विधि के अनुमति न होने का अर्थ हो सकता है। अपेक्षित संयोजन के बजाय, एक अनुमानित बहाली लूप को चालू न करें, बल्कि जांच करें।
AWS यह भी नोट करता है कि विभिन्न मूलों पर चल रहा ब्राउज़र जावास्क्रिप्ट x-amzn-waf-action हेडर को CORS के माध्यम से पढ़ नहीं सकता है। इस स्थिति में, ब्राउज़र ऑटोमेशन लेयर में नेटवर्क उत्तर का वर्गीकरण करें या एक समान मूल एकीकरण का उपयोग करें। केवल पृष्ठ पाठ से एक चुनौति के अनुमान न करें।
अपना CapSolver बोनस कोड जमा करें
अपने स्वयं के ऑटोमेशन बजट को तुरंत बढ़ाएं!
CapSolver खाता में अपना बोनस कोड CAP26 डालें ताकि प्रत्येक भरोसे पर 5% बोनस मिले — कोई सीमा नहीं।
अपने CapSolver डैशबोर्ड में अब इसे जमा करें
चुनौति निपटान प्रत्येक URL के लिए उपलब्ध नहीं होना चाहिए जिसके बारे में मॉडल उल्लेख कर सकता है। किसी भी एजेंट उपकरण के चलाने से पहले लक्ष्य की जांच करें:
from dataclasses import dataclass
from urllib.parse import urlparse
@dataclass(frozen=True)
class PolicyDecision:
allowed: bool
reason: str
ALLOWED_HOSTS = {"staging.example.com", "research.example.org"}
ALLOWED_PURPOSES = {"qa-validation", "authorized-research"}
def authorize_recovery(
url: str,
purpose: str,
attempts: int,
) -> PolicyDecision:
host = (urlparse(url).hostname or "").lower()
if host not in ALLOWED_HOSTS:
return PolicyDecision(False, "host-not-allowed")
if purpose not in ALLOWED_PURPOSES:
return PolicyDecision(False, "purpose-not-allowed")
if attempts >= 2:
return PolicyDecision(False, "retry-budget-exhausted")
return PolicyDecision(True, "authorized")
इस फ़ंक्शन को भाषा मॉडल से बाहर रखें। उत्पादन में, अनुमोदित होस्ट और उद्देश्य को संस्करण युक्त विनिर्देश में लोड करें, पुनर्निर्देशन को अन्य होस्ट पर अस्वीकृत करें, और केवल असंवेदनशील निर्णय मेटाडेटा को दर्ज करें।
दस्तावेज़ किए गए एजेंट पैकेज LangChain-अनुरूप उपकरण प्रस्तुत कर सकता है। एक न्यूनतम सेटअप इस प्रकार दिखता है:
import os
from capsolver_agent.langchain import get_langchain_tools
capsolver_tools = get_langchain_tools(
api_key=os.environ["CAPSOLVER_API_KEY"],
)
ठीक एजेंट-निर्माण एपीआई लैंगचेन और लैंगग्राफ रिलीज़ के साथ बदल सकती है। CapSolver उपकरण प्राप्ति को एक छोटे अनुकूलक मॉड्यूल में रखें, परीक्षित डिपेंडेंसी संस्करण को फिक्स करें, और capsolver_tools को उन संस्करणों द्वारा समर्थित एजेंट बिल्डर माध्यम से जोड़ें।
हर एजेंट के सभी उपकरण न दें। एक सुरक्षित पैटर्न यह है कि केवल एक बहाली उपग्रह या एक विशेष एक्सीक्यूटर में चुनौति उपकरण प्रदान करें जो authorize_recovery() के allowed=True लौटने के बाद चलता है।
CapSolver उच्च स्तर पर एजेंट-उपकरण मैपिंग के बारे में दस्तावेज़ करता है:
solve_captcha कोर solve क्षमता कॉल करता है;detect_captchas कोर detect क्षमता कॉल करता है;solve_on_page कोर solve_on_page क्षमता कॉल करता है;केवल आवश्यकता के छोटे उपकरण का उपयोग करें। एक लाइव ब्राउज़र सत्र के लिए, ब्राउज़र-मुख्य डिटेक्शन और भरने के कार्य प्रक्रिया आमतौर पर एक कच्चा समाधान को नियंत्रित करने की तुलना में अधिक संदर्भ बनाए रखती है।
AWS WAF टोकन क्लाइंट सत्र का हिस्सा हैं। AWS WAF टोकन दस्तावेज़ बताता है कि चुनौति और कैप्चा कार्रवाई टोकन का उपयोग सफल अंतर्क्रिया की ट्रैकिंग के लिए करती हैं। डिटेक्शन और पुनर्प्रयास के बीच ब्राउज़र को बदलना या इसकी कुकीज खो देना उस स्थिति को खो देता है।
LangChain संदेश या ग्राफ चेकपॉइंट में Playwright Page को सीरियलाइज न करें। इसे एप्लिकेशन-मालिक रजिस्टर में संग्रहीत करें:
class BrowserRegistry:
def __init__(self) -> None:
self._pages: dict[str, object] = {}
def register(self, page_id: str, page: object) -> None:
self._pages[page_id] = page
def get(self, page_id: str) -> object:
if page_id not in self._pages:
raise KeyError("browser page is not registered")
return self._pages[page_id]
async def close(self, page_id: str) -> None:
page = self._pages.pop(page_id, None)
if page is not None:
await page.close()
एजेंट राज्य में केवल अस्पष्ट page_id, वर्तमान URL, उद्देश्य, प्रयास संख्या और स्थिति को शामिल करें। कुकीज, स्थानीय भंडारण, समाधान टोकन, API कुंजी और कच्चा HTML को बाहर रखें।
छोटा परिणाम प्रकार इसलिए उपयोग करें कि मॉडल कम-स्तरीय उत्तर को पुनर्व्याख्या न कर सके:
from typing import Literal, TypedDict
RecoveryStatus = Literal[
"not_needed",
"authorized",
"resolved",
"retry",
"review",
"denied",
]
class RecoveryState(TypedDict, total=False):
request_id: str
purpose: str
current_url: str
page_id: str
attempts: int
waf_action: str
recovery_status: RecoveryStatus
error_code: str | None
final_assertion_passed: bool
def route_after_detection(state: RecoveryState) -> str:
if state.get("waf_action") not in {"challenge", "captcha"}:
return "continue"
if state.get("recovery_status") == "authorized":
return "recover"
if state.get("recovery_status") in {"denied", "review"}:
return "human_review"
return "authorize"
def route_after_recovery(state: RecoveryState) -> str:
status = state.get("recovery_status")
if status == "resolved":
return "verify"
if status == "retry":
return "authorize"
return "human_review"
बहाली नोड प्रमाणित CapSolver ब्राउज़र उपकरण को कॉल कर सकता है, लेकिन यह केवल एक स्थिति और स्थिर त्रुटि कोड लौटाना चाहिए। कभी-कभी कच्चा उपकरण परिणाम को अगले मॉडल प्रॉम्प्ट में न रखें।
चुनौति पूरा होना मूल व्यावसायिक कार्य की सफलता के प्रमाण के रूप में नहीं होता है। उसी सत्र में इरादेपूर्वक नेविगेशन या अनुरोध को दोहराएं और अपने एप्लिकेशन संकेत की जांच करें:
async def verify_expected_page(page, expected_url_prefix: str) -> bool:
await page.wait_for_load_state("domcontentloaded")
if not page.url.startswith(expected_url_prefix):
return False
marker = page.get_by_test_id("authorized-content")
try:
await marker.wait_for(state="visible", timeout=15_000)
return True
except Exception:
return False
अपने एप्लिकेशन द्वारा नियंत्रित एक स्थिर मार्कर चुनें: एक परीक्षण ID, एक विशिष्ट API प्रतिक्रिया, या एक ज्ञात स्थिति संक्रमण। व्यापक दावों जैसे "पृष्ठ में पाठ होता है" के बजाय बचें क्योंकि एक त्रुटि पृष्ठ इसी तरह के शब्दों को समाविष्ट कर सकता है।
यदि सत्यापन विफल रहता है, तो तुरंत सॉल्वर फिर से न बुलाएं। वर्तमान उत्तर को पुनः वर्गीकृत करें, जांचें कि क्या सत्र बदल गया है, पुनर्प्रयास बजट को लागू करें, और अस्पष्ट मामलों को मानव के पास भेजें।
एक सीमित वर्कफ़्लो कम से कम इन मामलों को अलग करता है:
| स्थिति | सिफारिश किया गया मार्ग |
|---|---|
| कोई AWS WAF संकेत नहीं | सामान्य वर्कफ़्लो जारी रखें |
| अनुमोदित होस्ट पर ज्ञात संकेत | अनुमोदित बहाली नोड चलाएं |
| अज्ञात स्थिति/हेडर संयोजन | मानव समीक्षा |
| अनुमोदित होस्ट पर पुनर्निर्देशन | अस्वीकृत |
| चुनौति उपकरण समय सीमा समाप्त | यदि कुल बजट अनुमति देता है, तो एक बार फिर से प्रयास करें |
| बहाली रिपोर्ट सफलता के बावजूद पृष्ठ सत्यापन विफल | पुनः वर्गीकृत करें, फिर समीक्षा करें |
| पुनर्प्रयास सीमा पूरी हो गई | रोकें और स्थिर त्रुटि कोड दर्ज करें |
| कम अधिकृत या ब्राउज़र सत्र | कॉन्फ़िगरेशन त्रुटि; मॉडल को इसे ठीक करने के लिए न बुलाएं |
अस्थायी ट्रांसपोर्ट त्रुटि के लिए एक्स्पोनेंशियल बैकऑफ़ का उपयोग करें, लेकिन असीमित लूप का उपयोग न करें। पुनर्प्रयास गणना निश्चित राज्य के हिस्सा है, मॉडल स्मृति नहीं।
घटनाओं जैसे waf_signal_detected, policy_allowed, recovery_started, recovery_finished, और page_verified को लॉग करें। एक अनुरोध पहचानकर्ता, होस्ट, अवधि, प्रयास संख्या और त्रुटि कोड शामिल करें। क्रेडेंशियल, कुकीज, टोकन, कच्चा चुनौति भार और संवेदनशील पृष्ठ सामग्री को बाहर रखें।
एजेंट ट्रेस वर्कफ़्लो के निर्णय को दिखाते हैं; AWS मीट्रिक्स सुरक्षा परत द्वारा अवलोकित को दिखाते हैं। AWS चैलेंज और CAPTCHA गतिविधि के लिए CloudWatch मीट्रिक्स सूचीबद्ध करता है, जिसमें अनुरोध, प्रयास, हल किए गए और वैध-टोकन गणना शामिल हैं इसके WAF मीट्रिक्स संदर्भ में।
उपयोगी ऑपरेशनल प्रश्न शामिल हैं:
आंतरिक अनुरोध पहचानकर्ता के साथ प्रणालियों को संबंधित करें, क्रेडेंशियल या टोकन के बजाय। अचानक बढ़े चैलेंज ट्रैफिक के कारण निदान करें, डिफ़ॉल्ट रूप से बड़े पुनर्प्रयास बजट के बजाय।
टेक्स्ट अस्पष्ट है और बदलने में आसान है। दस्तावेज़ी प्रतिक्रिया स्थिति और हेडर, ब्राउज़र नेटवर्क घटनाएं, या एप्लिकेशन-स्वामित्व संकेत पसंद करें।
एक नया ब्राउज़र कुकीज़ और टोकन स्थिति खो सकता है। पहचान, बरीकी, पुनर्प्रयास और सत्यापन के माध्यम से एक ही अनुमोदित सत्र बनाए रखें।
मॉडल को उनकी आवश्यकता नहीं है। संवेदनशील मान निर्धारित एडेप्टर में रखें और एक टाइप किए गए स्थिति वापस करें।
हमेशा इच्छित कार्य को दोहराएं और एक क्षेत्र-विशिष्ट सत्यापन जांचें।
होस्टनाम अनुमति सूची, उद्देश्य जांच, रीडायरेक्ट जांच, पुनर्प्रयास बजट और मॉडल के बाहर रास्ता समीक्षा के लिए बाध्य करें।
LangChain और LangGraph निर्माण API विकसित होते रहते हैं। जो संस्करण आपके परीक्षणों को पास करता है, उन्हें बांधें, फ्रेमवर्क वायरिंग को एक मॉड्यूल में अलग करें और अपग्रेड करने से पहले एकीकृत परीक्षण दोहराएं।
एक स्वामित्व वाले स्टेजिंग पृष्ठ का उपयोग करें और इन मामलों को कवर करें:
इकाई परीक्षणों में वर्गीकरणकर्ता, नीति गेट और सत्यापक के मॉक बनाएं। अनुमोदित पर्यावरण में क्रेडेंशियल एंड-टू-एंड परीक्षण आरक्षित करें। लॉग के साथ भी परीक्षण करें: क्रेडेंशियल, कुकीज़ और टोकन की अनुपस्थिति की पुष्टि करें।
CapSolver के प्रारंभिक गाइड इसके कार्यक्रम जीवन चक्र और समर्थित CAPTCHA श्रेणियों का वर्णन करता है। एक कार्य पथ चुनते समय वर्तमान प्रथम-पक्ष दस्तावेज़ का उपयोग करें; पुराने स्निपेट या तीसरे पक्ष के पोस्ट से फील्ड के अनुमान न लगाएं।
एक विश्वसनीय AWS WAF LangChain एकीकरण एक नियंत्रित स्थिति मशीन है, एक एकल "हल" प्रॉम्प्ट नहीं। दस्तावेज़ी WAF संकेत की पहचान करें, लक्ष्य और उद्देश्य की पुष्टि करें, एक निर्दिष्ट श्रेणी वाले उपकरण का उपयोग करें, एक ही क्लायंट सत्र को बरकरार रखें, और एजेंट आगे बढ़ने से पहले मूल कार्य की पुष्टि करें।
अधिकृत स्वचालन के लिए, CapSolver चैलेंज प्रबंधन को LangChain से जोड़ने के लिए एजेंट और मुख्य परतों की आवश्यकता होती है जबकि नीति, गुप्त जानकारी और अंतिम सत्यापन को एप्लिकेशन कोड में रखा जाता है।
CapSolver के दस्तावेज़ का उपयोग करें वर्तमान एकीकरण मार्ग की पुष्टि करें, फिर CapSolver का प्रयास करें एक स्वामित्व वाले या स्पष्ट अनुमोदित परीक्षण पर्यावरण पर। जमा करते समय बोनस कोड CAP26 लागू करें ताकि विनिर्दिष्ट 5% बोनस प्राप्त हो।
प्रश्न: एक LangChain एजेंट AWS WAF चैलेंज की पहचान कैसे करता है?
निर्धारित HTTP या ब्राउज़र लेयर में HTTP 202 और x-amzn-waf-action: challenge के दस्तावेज़ी संयोजन की जांच करें। पृष्ठ के टेक्स्ट से स्थिति के अनुमान लगाने के लिए भाषा मॉडल को नहीं पूछें।
प्रश्न: AWS WAF CAPTCHA कार्यवाही के लिए कौन सा प्रतिक्रिया संकेत है?
AWS अनुरोध में वैध टोकन न होने पर HTTP 405 के साथ x-amzn-waf-action: captcha के लिए CAPTCHA प्रतिक्रिया के रूप में दस्तावेज़ करता है। असंगत स्थिति/हेडर संयोजन को अज्ञात मानें और इसे समीक्षा के लिए रास्ता दें।
प्रश्न: क्या CapSolver API कुंजी को LangChain मॉडल को पास करना चाहिए?
नहीं। इसे अनुमोदित सीक्रेट स्टोर से होस्ट एप्लिकेशन या टूल एडेप्टर में लोड करें। मॉडल को कुंजी, कुकीज़, WAF टोकन या क्रूड समाधान मानकों के दृश्य नहीं होना चाहिए।
प्रश्न: चैलेंज पूरा होने के बाद एजेंट एक नया ब्राउज़र का उपयोग कर सकता है?
जब संभव हो तो एक ही ब्राउज़र संदर्भ बनाए रखें क्योंकि AWS WAF टोकन स्थिति क्लायंट सत्र से जुड़ी होती है। सत्र को बदलने से दोहराए गए अनुरोध के लिए आवश्यक स्थिति खो जाती है।
प्रश्न: सफल चैलेंज उपकरण परिणाम पर आगे बढ़ने के लिए पर्याप्त है?
नहीं। इच्छित कार्य को दोहराएं और एक एप्लिकेशन-विशिष्ट सत्यापन सुनिश्चित करें। उपकरण परिणाम केवल एक मध्यवर्ती स्थिति है।
प्रश्न: एजेंट कितनी बार पुनर्प्रयास करे?
कार्यप्रवाह के जोखिम और समय सीमा के आधार पर छोटा स्पष्ट पुनर्प्रयास बजट सेट करें। उदाहरणों में दो प्रयासों का उपयोग एक एप्लिकेशन नीति के रूप में किया जाता है, न कि CapSolver या AWS की गारंटी।
प्रश्न: क्या इस वर्कफ़्लो का उपयोग किसी भी वेबसाइट पर किया जा सकता है?
नहीं। इसका उपयोग केवल आपके स्वामित्व वाले प्रणालियों या स्पष्ट रूप से अनुमोदित स्वचालन के लिए करें। मॉडल के बाहर लक्ष्य और उद्देश्य जांच के लिए बाध्य करें और अनिश्चित मामलों को मानव समीक्षा के लिए रास्ता दें।
कैपसॉल्वर के साथ वेब स्क्रैपिंग में AWS WAF कैप्चा हल करें। कार्यकुशलता में वृद्धि करें, चुनौतियां हल करें और डेटा के सुचारू रूप से प्रवाह करें।

एक विस्तृत PHP गाइड, AWS WAF कैप्चा और चुनौती के समाधान के लिए भरोसेमंद स्क्रैपिंग और स्वचालन के लिए
