حل الكابتشا
لوكلاء LangChain
الوكيل الذي يصادف تحديًا لا يملك في مجموعة أدواته ما يجيب عنه، فيتوقف أو يلتف عليه بالهلوسة. زوّده بأداة حل، فيصبح العائق مجرد استدعاء آخر.
import time
import requests
CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}
def solve(task: dict) -> dict:
"""Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
r = requests.post(
"https://api.captchano.com/v1/solve",
params={"wait": 60},
json=task,
headers=HEADERS,
timeout=75,
)
data = r.json()
# A solve can outlast the 60 s wait: poll the task until it finishes.
while data.get("status") in ("queued", "solving"):
time.sleep(5)
data = requests.get(
f"https://api.captchano.com/v1/task/{data['id']}",
headers=HEADERS,
timeout=30,
).json()
if data.get("status") != "ready":
raise RuntimeError(data.get("error") or data)
return data["solution"]
from langchain_core.tools import tool
@tool
def solve_captcha(kind: str, sitekey: str, url: str) -> str:
"""Call when a captcha blocks the task. kind is recaptcha_v2, recaptcha_v3
or turnstile. Returns the token to submit with the form."""
return solve({"type": kind, "sitekey": sitekey, "url": url})["token"]
# add solve_captcha to your agent's tools listلماذا يحتاج الوكلاء إلى هذا تحديدًا
أداة الـ scraping التي تصطدم بتحدٍّ تفشل بشكل واضح فتصلحها. أما الوكيل فيفشل بصمت: يستنتج حول الصفحة المحجوبة، ويختلق خطوة تالية معقولة، ويبلّغ عن تقدم لم يحققه قط. والفشل هنا أسوأ لأنه صامت. أداة حل محددة النوع تحوّل الطريق المسدود الغامض إلى نتيجة حتمية يستطيع الوكيل بناء قراراته عليها.
ما الذي تعيده الأداة
- رمز token أو ملف cookie — بحسب نوع التحدي. الأنظمة التي تقيّم الجلسة تعيد ملف cookie مع مجموعة الترويسات (headers) المستخدمة للحصول عليه.
- وكيل المستخدم المستخدَم، كي يعيد الوكيل استخدامه عند الإرسال.
- تكلفة عملية الحل، كي يتمكن الوكيل العامل ضمن ميزانية من احتسابها بدلًا من الإنفاق دون رؤية.
إبقاء الحلقة محدودة
امنح الوكيل ميزانية حل لكل تشغيل. تبلّغ كل استجابة عن تكلفتها، لذا يمكن لجهة الإشراف قطع الحلقة عندما يتجاوز الإنفاق حدًا معينًا بدلًا من اكتشاف ذلك في الفاتورة. بسعر $0.00598 لكل عملية حل، تكلف عملية تشغيل الوكيل المعتادة بضعة سنتات أو أقل، لكن حلقة إعادة المحاولة غير المحدودة تبقى حلقة غير محدودة.
اجعل استدعاء الأداة متزامنًا (blocking)
تستدعي الأمثلة ?wait=60، فتعيد الأداة رمز token جاهزًا في خطوة واحدة. وهذا أهم للوكلاء منه للسكربتات: الأداة التي تعيد "ما زال الحل جاريًا" تجبر النموذج على التفكير في الاستطلاع الدوري (polling)، وهو ما يجيده بشكل سيئ. إذا احتجت إلى سقف أطول، فارفع wait حتى 120 ثانية. أشكال الطلبات لكل أنواع التحديات موجودة في مرجع API.
كيف تندمج عملية الحل في LangChain
في LangChain، تكون أداة الحل أداةً (tool) ذات مخطط محدد النوع. يستدعيها الوكيل عندما تبلّغ أداة المتصفح الخاصة به عن تحدٍّ.
- 01عرّف الأداة
غلّف استدعاء API باستخدام المزخرف @tool مع docstring واضح.
- 02اربطها بالوكيل
أضفها إلى قائمة الأدوات إلى جانب أدوات المتصفح لديك.
- 03صِف متى تُستخدم
يخبر docstring النموذج بأن يستدعيها فقط عند وجود كابتشا.
- 04أعِد نتيجة واضحة
أعِد الرمز token أو رسالة خطأ قصيرة يستطيع النموذج التصرف بناءً عليها.
إدخال الرمز token في الصفحة
تُعيد الأداة الرمز token كسلسلة نصية يمررها الوكيل إلى أداة المتصفح أو أداة HTTP الخاصة به.
أين تخطئ عمليات التكامل عادةً
يقرر النموذج متى يستدعي الأداة بناءً على وصفها. اذكر بدقة المدخلات التي تحتاجها وما تعيده.
حدّد سقفًا لعمليات الحل في كل تشغيل، حتى لا يدخل وكيل مرتبك في حلقة على صفحة تواصل عرض التحدي عليه.
الأسئلة الشائعة حول الكابتشا في LangChain
هل يعمل مع LangGraph؟
نعم. أداة LangChain هي أيضًا دالة قابلة للاستدعاء من العقد في LangGraph، لذا يعمل التعريف نفسه في كليهما.
ما النموذج الذي يعمل بشكل أفضل مع الأداة؟
أي نموذج يدعم استدعاء الأدوات. مدخلات الأداة سلاسل نصية بسيطة، لذا تتعامل معها النماذج الأصغر بشكل جيد.
كيف يعرف الوكيل بوجود كابتشا؟
يجب أن تبلّغ عنها أداة المتصفح أو الـ scraping الخاصة به، على سبيل المثال بإعادة sitekey عندما تعثر عليه. اجعل ذلك جزءًا من مخرجات الأداة.
هل يمكنني استخدامها في وكيل غير متزامن؟
نعم. استخدم عميل HTTP غير متزامن داخل الأداة وعرّفها باستخدام async def.
أدلة مفيدة
هل أنت مستعد للبناء؟
ابدأ بفترة تجريبية مجانية لمدة 3 أيام، ثم ادفع مقابل كل عملية حل ناجحة مع نمو حركة المرور لديك. لا حاجة إلى بطاقة للفترة التجريبية.