
Emma Foster
Machine Learning Engineer

Cara paling aman untuk menyelesaikan reCAPTCHA v3 di CrewAI adalah dengan mengekspos CapSolver melalui alat yang berjenis dan dikendalikan kebijakan. CrewAI harus menentukan kapan tugas perlu verifikasi, tetapi kode aplikasi yang tepercaya harus menyelesaikan target yang disetujui, kunci situs, tindakan halaman, mode proxy, dan kebijakan skor. Dokumentasi reCAPTCHA v3 CapSolver mendefinisikan jenis tugas dan parameter yang didukung, sementara SDK Agent yang disediakan pengguna memetakan panggilan alat terstruktur ke capsolver-core. Alat tersebut harus mengirim token di sisi server, memverifikasi keadaan halaman yang dihasilkan, dan memberikan hasil kecil seperti verified, review_required, atau stopped kepada kru. Desain ini mencegah pergeseran URL, tebakan tindakan, kebocoran rahasia, penyelesaian ganda, dan sinyal keberhasilan palsu.
reCAPTCHA v3 berbasis skor dan biasanya berjalan tanpa checkbox yang terlihat. Aplikasi target memanggil tindakan, menerima token, dan mengevaluasi token tersebut di sisi server. Oleh karena itu, alur kerja CrewAI dapat gagal bahkan ketika tidak pernah melihat tantangan visual.
Penyebab umumnya bersifat operasional, bukan komunikasi:
pageAction tidak sesuai dengan tindakan runtime halaman;Blog reCAPTCHA CapSolver https://www.capsolver.com/blog/recaptcha memiliki panduan implementasi pendukung, sementara FAQ AI dan otomasi https://www.capsolver.com/faq/ai-and-automation membantu menentukan batas agen yang aman.
Kru multi-agent bekerja paling baik ketika tanggung jawabnya jelas.
| Peran | Tanggung jawab yang diizinkan | Tidak boleh mengontrol |
|---|---|---|
| Navigator | Mengamati keadaan aplikasi yang disetujui | Kunci API, kredensial proxy, token mentah |
| Perencana Verifikasi | Memutuskan apakah langkah yang disetujui memerlukan alat | URL atau kunci situs arbitrer |
| Alat CapSolver | Menyelesaikan kebijakan, membuat satu tugas, mengirim token | Pengulangan tak terbatas atau penjelajahan yang tidak terkait |
| Validator Keadaan | Memastikan rute dan penanda semantik yang diharapkan | Keputusan persetujuan bisnis |
| Peninjau | Memeriksa bukti yang diremehkan pada kegagalan | Materi sesi rahasia |
Model dapat memilih ID target yang terdaftar. Ia tidak boleh membuat URL target atau parameter tantangan.
Dokumentasi alat kustom CrewAI mendukung BaseTool dengan args_schema Pydantic, dekorator @tool, hasil berjenis, dan alat asinkron untuk operasi I/O-bound.
Dokumentasi CapSolver Agent yang disediakan pengguna menjelaskan bahwa capsolver-agent mengelilingi capsolver-core: create_executor() membuat executor, dan executor.execute("solve_captcha", args) mengirimkan permintaan berjenis ke mesin inti.
Instal paket yang terdokumentasi:
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install git+https://github.com/capsolver-ai/capsolver-agent.git
pip install crewai
export CAPSOLVER_API_KEY="CAP-..."
Simpan kunci di penyimpanan rahasia runtime. Jangan tempatkan mereka di prompt kru, deskripsi tugas, atau hasil alat.
from dataclasses import dataclass
@dataclass(frozen=True)
class RecaptchaV3Policy:
target_id: str
website_url: str
website_key: str
page_action: str
minimum_score: float
enterprise: bool
proxy_profile: str | None
allowed_crew_role: str
max_attempts: int = 1
TARGETS = {
"approved_login_test": RecaptchaV3Policy(
target_id="approved_login_test",
website_url="https://approved.example.com/login",
website_key="PUBLIC_SITE_KEY",
page_action="login",
minimum_score=0.7,
enterprise=False,
proxy_profile=None,
allowed_crew_role="verification_specialist",
)
}
Kunci situs publik bukan rahasia akun, tetapi tetap harus berasal dari konfigurasi tepercaya sehingga model tidak dapat mengarahkan alat.
pageAction Daripada MenebaknyaDokumentasi reCAPTCHA v3 CapSolver reCAPTCHA v3 dokumentasi menyebutkan pageAction sebagai bidang tugas opsional dan menjelaskan bahwa nilai tersebut dapat ditemukan dalam panggilan grecaptcha.execute halaman.
@dataclass(frozen=True)
class PageObservation:
target_id: str
current_url: str
observed_action: str
observed_site_key: str
form_state: str
observed_at: str
def validate_observation(
observation: PageObservation,
policy: RecaptchaV3Policy,
) -> None:
if observation.current_url != policy.website_url:
raise PermissionError("URL yang diamati tidak sesuai dengan kebijakan")
if observation.observed_site_key != policy.website_key:
raise ValueError("Kunci situs yang diamati tidak sesuai dengan kebijakan")
if observation.observed_action != policy.page_action:
raise ValueError("Tindakan halaman yang diamati tidak sesuai dengan kebijakan")
if observation.form_state != "READY_FOR_VERIFICATION":
raise ValueError("Keadaan aplikasi tidak siap")
Alat harus menolak ketidakcocokan daripada membuat token untuk parameter yang tidak pasti.
| Parameter | Tujuan | Aturan kebijakan |
|---|---|---|
captcha_type |
Memilih reCAPTCHA v3 dalam SDK Agent | Tetapkan ke reCaptchaV3 |
website_url |
Halaman yang menampilkan tantangan | Dimuat dari daftar |
website_key |
Kunci situs publik | Dimuat dari daftar dan diverifikasi terhadap halaman |
page_action |
Tindakan v3 runtime | Harus sesuai dengan pengamatan |
min_score |
Skor minimum yang diminta | Diatur oleh kebijakan target |
enterprise |
Jalur Standar atau Enterprise | Tetapkan oleh konfigurasi integrasi |
proxy |
Identitas jaringan opsional | Diselesaikan dari profil rahasia jika diperlukan |
CapSolver mendokumentasikan varian tugas Standar, Enterprise, proxy, dan tanpa proxy. Hasilnya dapat berisi gRecaptchaResponse, data user-agent, dan nilai sesi ketika mode relevan diaktifkan.
Halaman produk CapSolver https://www.capsolver.com/products membantu memverifikasi keluarga tugas yang didukung sebelum implementasi.
import os
from typing import Literal
from crewai.tools import tool
from pydantic import BaseModel, Field
from capsolver_agent.schema import create_executor
executor = create_executor(api_key=os.environ["CAPSOLVER_API_KEY"])
class SolveRequest(BaseModel):
target_id: str = Field(description="Identifikasi target yang terdaftar")
crew_role: str = Field(description="Peran yang meminta verifikasi")
observed_action: str = Field(description="Tindakan yang diamati di halaman hidup")
observed_site_key: str = Field(description="Kunci situs yang diamati di halaman hidup")
state_id: str = Field(description="Identifikasi keadaan aplikasi sisi server yang tidak terlihat")
class SolveResult(BaseModel):
status: Literal["verified", "review_required", "stopped"]
target_id: str
state_id: str
reason: str
task_attempted: bool
Model hasil secara sengaja tidak mencakup token, kunci API, proxy, cookie, atau respons penyedia mentah.
PROXY_VAULT = {
"approved_proxy": os.environ.get("APPROVED_PROXY")
}
async def submit_token_and_verify(
*,
state_id: str,
token: str,
policy: RecaptchaV3Policy,
) -> bool:
"""Fungsi submit dan periksa yang dimiliki aplikasi."""
response = await application_sessions.submit_recaptcha_v3(
state_id=state_id,
token=token,
expected_action=policy.page_action,
)
return (
response.current_url.startswith("https://approved.example.com/account")
and response.semantic_marker == "AUTHENTICATED_ACCOUNT_PAGE"
and response.challenge_present is False
)
application_sessions mewakili layanan sesi browser atau HTTP yang sah Anda. Solver tool menggunakannya, tetapi model tidak menerima kredensialnya.
@tool("Selesaikan reCAPTCHA v3 yang disetujui", result_schema=SolveResult)
async def solve_approved_recaptcha_v3(
target_id: str,
crew_role: str,
observed_action: str,
observed_site_key: str,
state_id: str,
) -> dict:
"""Selesaikan satu langkah reCAPTCHA v3 yang terdaftar dan verifikasi keadaan aplikasi."""
policy = TARGETS.get(target_id)
if policy is None:
return SolveResult(
status="stopped",
target_id=target_id,
state_id=state_id,
reason="Target tidak dikenal",
task_attempted=False,
).model_dump()
if crew_role != policy.allowed_crew_role:
return SolveResult(
status="stopped",
target_id=target_id,
state_id=state_id,
reason="Peran tidak diizinkan memanggil alat ini",
task_attempted=False,
).model_dump()
if observed_action != policy.page_action:
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Tindakan yang diamati tidak sesuai dengan kebijakan target",
task_attempted=False,
).model_dump()
if observed_site_key != policy.website_key:
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Kunci situs yang diamati tidak sesuai dengan kebijakan target",
task_attempted=False,
).model_dump()
args = {
"captcha_type": "reCaptchaV3",
"website_url": policy.website_url,
"website_key": policy.website_key,
"page_action": policy.page_action,
"min_score": policy.minimum_score,
"enterprise": policy.enterprise,
}
if policy.proxy_profile:
args["proxy"] = PROXY_VAULT[policy.proxy_profile]
result = await executor.execute("solve_captcha", args)
if not result.get("success"):
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Tugas CapSolver tidak selesai",
task_attempted=True,
).model_dump()
solution = result.get("solution") or {}
token = solution.get("token")
if not token:
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Hasil tugas tidak mengandung token",
task_attempted=True,
).model_dump()
verified = await submit_token_and_verify(
state_id=state_id,
token=token,
policy=policy,
)
return SolveResult(
status="verified" if verified else "review_required",
target_id=target_id,
state_id=state_id,
reason="Keadaan aplikasi diverifikasi" if verified else "Keadaan aplikasi tidak diverifikasi",
task_attempted=True,
).model_dump()
Implementasi ini menjaga kredensial di dalam kode yang tepercaya dan memberikan kru hanya status yang aman kebijakan.
from crewai import Agent, Crew, Process, Task
verification_agent = Agent(
role="verification_specialist",
goal="Selesaikan hanya langkah verifikasi yang terdaftar dan laporkan keadaan yang diverifikasi",
backstory=(
"Anda mengoperasikan alat verifikasi yang disetujui. Anda tidak pernah menciptakan ID target, "
"kunci situs, tindakan, kredensial, atau keadaan keberhasilan."
),
tools=[solve_approved_recaptcha_v3],
allow_delegation=False,
verbose=True,
)
verification_task = Task(
description=(
"Untuk target yang terdaftar dalam pengamatan yang disediakan, panggil alat sekali "
"hanya jika URL, kunci situs, tindakan, dan keadaan dikonfirmasi. Kembalikan "
"hasil terstruktur tanpa rahasia."
),
expected_output="Hasil terstruktur verified, review_required, atau stopped.",
agent=verification_agent,
)
crew = Crew(
agents=[verification_agent],
tasks=[verification_task],
process=Process.sequential,
verbose=True,
)
Jangan hubungkan alat solver ke setiap agen. Batasi hanya ke satu peran membuat otorisasi dan audit lebih jelas.
from datetime import datetime, timedelta, timezone
ATTEMPTS: dict[tuple[str, str], datetime] = {}
def claim_attempt(target_id: str, state_id: str) -> bool:
key = (target_id, state_id)
now = datetime.now(timezone.utc)
prior = ATTEMPTS.get(key)
if prior and now - prior < timedelta(minutes=2):
return False
ATTEMPTS[key] = now
return True
Panggil claim_attempt() sebelum executor.execute(). Pesan kru yang berulang tidak boleh menciptakan token kedua untuk keadaan aplikasi yang sama.
Memori CrewAI, jejak, dan log verbose mungkin menyimpan output alat. Kembalikan hanya:
{
"status": "verified",
"target_id": "approved_login_test",
"state_id": "state_7c19",
"reason": "Keadaan aplikasi diverifikasi",
"task_attempted": true
}
Jangan pernah mengembalikan token, kunci API CapSolver, nilai proxy, cookie browser, HTML mentah, kata sandi, atau data formulir pribadi.
FAQ kesalahan dan pemecahan masalah CapSolver https://www.capsolver.com/faq/errors-and-troubleshooting dapat mendukung klasifikasi kesalahan penyedia tanpa mengungkap respons mentah ke kru.
Validator harus membutuhkan beberapa sinyal independen:
@dataclass(frozen=True)
class StateCheck:
expected_path_prefix: str
required_marker: str
forbidden_markers: tuple[str, ...]
def is_verified(page, check: StateCheck) -> bool:
return (
page.url.path.startswith(check.expected_path_prefix)
and page.has_semantic_marker(check.required_marker)
and not any(page.contains(marker) for marker in check.forbidden_markers)
and page.http_status == 200
)
Perubahan URL saja tidak cukup. Harus ada rute yang diharapkan, penanda semantik, status, dan ketiadaan keadaan tantangan atau kesalahan yang diketahui.
CapSolver mendokumentasikan varian Enterprise dan mode sesi opsional. Jangan biarkan kru menebak opsi ini.
@dataclass(frozen=True)
class RecaptchaV3Policy:
target_id: str
website_url: str
website_key: str
page_action: str
minimum_score: float
enterprise: bool
is_session: bool
proxy_profile: str | None
allowed_crew_role: str
max_attempts: int = 1
Jika target yang disetujui menggunakan Enterprise, simpan fakta tersebut dalam kebijakan. Jika mode sesi diperlukan, tangani nilai sesi yang dikembalikan di dalam layanan sesi aplikasi dan jangan biarkan mereka muncul di output kru.
| Desain | Integritas parameter | Keamanan rahasia | Jaminan state halaman | Rekomendasi |
|---|---|---|---|---|
| Model menyediakan URL, kunci, dan aksi | Rendah | Rendah | Rendah | Hindari |
| Alat mengembalikan token ke kru | Menengah | Rendah | Rendah | Hindari |
| Alat yang diselesaikan melalui registri mengirim dan memverifikasi | Tinggi | Tinggi | Tinggi | Disarankan |
| Langkah verifikasi hanya manusia | Tinggi | Tinggi | Tinggi | Gunakan untuk state sensitif atau tidak pasti |
Desain yang disarankan memberikan otoritas keputusan kepada model tetapi menjaga otoritas eksekusi di dalam kode yang tepercaya.
Lacak bidang yang dihapus seperti:
SAFE_FIELDS = {
"target_id",
"crew_role",
"action_match",
"task_attempted",
"provider_category",
"duration_ms",
"verified",
"review_reason",
}
def safe_event(event: dict) -> dict:
return {key: event[key] for key in SAFE_FIELDS if key in event}
Halaman status CapSolver https://status.capsolver.com/status/capsolver dapat membantu membedakan ketersediaan penyedia dari kegagalan aplikasi spesifik.
import pytest
@pytest.mark.asyncio
async def test_unknown_target_stops_before_task():
result = await solve_approved_recaptcha_v3.run(
target_id="unknown",
crew_role="verification_specialist",
observed_action="login",
observed_site_key="x",
state_id="state-1",
)
assert result["status"] == "stopped"
assert result["task_attempted"] is False
@pytest.mark.asyncio
async def test_action_mismatch_requests_review():
result = await solve_approved_recaptcha_v3.run(
target_id="approved_login_test",
crew_role="verification_specialist",
observed_action="checkout",
observed_site_key="PUBLIC_SITE_KEY",
state_id="state-2",
)
assert result["status"] == "review_required"
assert result["task_attempted"] is False
Juga uji pemblokiran percobaan ganda, penghapusan rahasia, penanganan token yang hilang, kebijakan Enterprise, dan kegagalan verifikasi halaman.
Kode Bonus: Gunakan kode WEBS di Dashboard CapSolver untuk mendapatkan bonus tambahan 5% pada setiap pengisian ulang.
FAQ penyelesaian CAPTCHA CapSolver menyediakan panduan tambahan tentang siklus hidup tugas.
Hanya gunakan solver reCAPTCHA v3 CrewAI pada situs yang Anda miliki, uji, atau memiliki izin eksplisit untuk otomatisasi. Hormati ketentuan, batas kecepatan, batas otorisasi, kewajiban privasi, dan kebijakan akses internal. Kunci situs publik tidak memberikan izin untuk mengakses alur kerja yang dilindungi. Jaga agar pengiriman yang berdampak, pembayaran, perubahan akun, dan keputusan data sensitif di belakang kontrol persetujuan terpisah.
Solver reCAPTCHA v3 CrewAI produksi harus spesifik, berjenis, dan dikendalikan kebijakan. CrewAI dapat mengidentifikasi kebutuhan verifikasi, tetapi kode yang tepercaya harus menyelesaikan target, kunci situs, aksi halaman, skor, mode Enterprise, dan pengaturan jaringan. CapSolver harus dijalankan sekali untuk state yang diverifikasi, token harus dikirim di sisi server, dan kru harus menerima hanya hasil yang direkam setelah halaman yang dimaksud diverifikasi.
Mulai implementasi yang diizinkan dengan CapSolver, uji di halaman yang terkendali, dan tambahkan uji parameter, panggilan duplikat, penghapusan, dan state halaman sebelum penggunaan produksi.
CrewAI dapat memanggil alat yang berjenis yang mengalihkan ke eksekutor CapSolver yang telah didokumentasikan. Jaga resolusi target, rahasia, pengiriman token, dan verifikasi di dalam kode aplikasi yang tepercaya.
URL target dan kunci situs diperlukan. Aksi halaman, skor minimum, pengaturan Enterprise, mode sesi, dan proxy tergantung pada konfigurasi target yang disetujui.
Tidak. Amati aksi dari halaman yang disetujui dan bandingkan dengan nilai kebijakan sisi server.
Tidak. Kirimnya di dalam kode yang tepercaya dan kembalikan hanya status yang diverifikasi, diperlukan ulasan, atau dihentikan.
Gunakan satu percobaan per state aplikasi yang diamati secara default. Percobaan kedua harus memerlukan pengamatan baru dan keputusan kebijakan eksplisit.
Ulasan CloakBrowser untuk 2026 yang mencakup fitur, harga, lisensi, opsi penyebaran, kelebihan, keterbatasan, alternatif, dan kasus penggunaan ideal.

Integrasikan CloakBrowser dengan CapSolver melalui otomatisasi Python yang kompatibel dengan Playwright, termasuk reCAPTCHA v2, tugas gambar, kode, dan penyelesaian masalah.
