حل الكابتشا
لوكلاء CrewAI
الوكيل الذي يصادف تحديًا لا يملك في مجموعة أدواته ما يجيب عنه، فيتوقف أو يلتف عليه بالهلوسة. زوّده بأداة حل، فيصبح العائق مجرد استدعاء آخر.
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 crewai import Agent
from crewai.tools import tool
@tool("Solve captcha")
def solve_captcha(kind: str, sitekey: str, url: str) -> str:
"""Call when a captcha blocks the task. Returns the token to submit."""
return solve({"type": kind, "sitekey": sitekey, "url": url})["token"]
researcher = Agent(role="Researcher", goal="...", backstory="...", tools=[solve_captcha])لماذا يحتاج الوكلاء إلى هذا تحديدًا
أداة الـ scraping التي تصطدم بتحدٍّ تفشل بشكل واضح فتصلحها. أما الوكيل فيفشل بصمت: يستنتج حول الصفحة المحجوبة، ويختلق خطوة تالية معقولة، ويبلّغ عن تقدم لم يحققه قط. والفشل هنا أسوأ لأنه صامت. أداة حل محددة النوع تحوّل الطريق المسدود الغامض إلى نتيجة حتمية يستطيع الوكيل بناء قراراته عليها.
ما الذي تعيده الأداة
- رمز token أو ملف cookie — بحسب نوع التحدي. الأنظمة التي تقيّم الجلسة تعيد ملف cookie مع مجموعة الترويسات (headers) المستخدمة للحصول عليه.
- وكيل المستخدم المستخدَم، كي يعيد الوكيل استخدامه عند الإرسال.
- تكلفة عملية الحل، كي يتمكن الوكيل العامل ضمن ميزانية من احتسابها بدلًا من الإنفاق دون رؤية.
إبقاء الحلقة محدودة
امنح الوكيل ميزانية حل لكل تشغيل. تبلّغ كل استجابة عن تكلفتها، لذا يمكن لجهة الإشراف قطع الحلقة عندما يتجاوز الإنفاق حدًا معينًا بدلًا من اكتشاف ذلك في الفاتورة. بسعر $0.00598 لكل عملية حل، تكلف عملية تشغيل الوكيل المعتادة بضعة سنتات أو أقل، لكن حلقة إعادة المحاولة غير المحدودة تبقى حلقة غير محدودة.
اجعل استدعاء الأداة متزامنًا (blocking)
تستدعي الأمثلة ?wait=60، فتعيد الأداة رمز token جاهزًا في خطوة واحدة. وهذا أهم للوكلاء منه للسكربتات: الأداة التي تعيد "ما زال الحل جاريًا" تجبر النموذج على التفكير في الاستطلاع الدوري (polling)، وهو ما يجيده بشكل سيئ. إذا احتجت إلى سقف أطول، فارفع wait حتى 120 ثانية. أشكال الطلبات لكل أنواع التحديات موجودة في مرجع API.
كيف تندمج عملية الحل في CrewAI
في CrewAI، تكون أداة الحل أداةً مخصصة تُسند إلى الوكيل الذي يتصفح. ولا يحتاج الوكلاء الآخرون في الفريق (crew) إلى معرفة أي شيء عن الكابتشا.
- 01أنشئ صنفًا فرعيًا من BaseTool
عرّف name وdescription ومخطط args، واستدعِ API داخل _run.
- 02أسندها
أعطِ الأداة فقط للوكيل الذي يتولى التصفح.
- 03صِف شرط الاستدعاء
ينص الوصف على استخدامها عندما تعرض الصفحة كابتشا.
- 04أعِد الرمز token
أعِد سلسلة الرمز token أو رسالة خطأ قصيرة.
إدخال الرمز token في الصفحة
تُعيد الأداة الرمز token إلى وكيل التصفح، الذي يرسله باستخدام أدواته الخاصة.
أين تخطئ عمليات التكامل عادةً
وكيل التصفح وحده يحتاج إليها. إعطاؤها للجميع يفتح الباب لاستدعاءات غير ضرورية.
الرموز token صالحة للاستخدام مرة واحدة. عطّل التخزين المؤقت لنتائج الأدوات في CrewAI بالنسبة لأداة الحل.
الأسئلة الشائعة حول الكابتشا في CrewAI
هل تحتوي CrewAI على أداة كابتشا مدمجة؟
ليس للحل. أداة مخصصة من بضعة أسطر تكفي، وتُبقي المفتاح تحت سيطرتك.
هل يمكن لعدة وكلاء مشاركة مفتاح واحد؟
نعم، أو أنشئ مفتاحًا لكل فريق من لوحة التحكم ليُعرض الاستخدام بشكل منفصل.
هل يعمل مع CrewAI Flows؟
نعم. يستدعي الأداةَ وكيلٌ، أينما كان ذلك الوكيل يعمل.
لماذا يجب تعطيل التخزين المؤقت؟
النتيجة المخزنة مؤقتًا ستعيد رمز token قديمًا يرفضه الموقع، لأن الرموز token صالحة للاستخدام مرة واحدة وتنتهي صلاحيتها خلال دقيقتين تقريبًا.
أدلة مفيدة
هل أنت مستعد للبناء؟
ابدأ بفترة تجريبية مجانية لمدة 3 أيام، ثم ادفع مقابل كل عملية حل ناجحة مع نمو حركة المرور لديك. لا حاجة إلى بطاقة للفترة التجريبية.