
Emma Foster
Machine Learning Engineer

sessions: write, yang mengembalikan 403, dan parameter pertama alat tanpa anotasi BaseModel Pydantic, yang memicu ValidationError.Panduan ini mengintegrasikan CapSolver dengan Composio sebagai alat agen yang menyelesaikan alur kerja reCAPTCHA v2. Alih-alih hanya mengembalikan token, alat ini menjalankan seluruh urutan halaman dan menganggap respons halaman sebagai kondisi keberhasilan. SDK Agens OpenAI menentukan kapan alat dipanggil, sementara otomasi browser Playwright mempertahankan konteks halaman yang digunakan untuk pengiriman dan verifikasi.
Gunakan pola ini hanya untuk alur kerja yang sah, wajar, bertanggung jawab, dan diizinkan pengguna. Kemampuan teknis tidak memberikan izin untuk mengakses data pribadi, terbatas, sensitif, atau tidak diizinkan; tinjau panduan otomasi AI sebelum deployment.
Alur kerja:
Jalankan skrip
-> SDK Agens OpenAI menentukan alat yang dipanggil
-> Alat kustom Composio: complete_recaptcha_v2
-> Playwright membuka halaman
-> capsolver.solve(...) mengembalikan gRecaptchaResponse
-> Terapkan token ke g-recaptcha-response
-> Playwright mengirim dan menunggu halaman
-> Baca halaman dan tentukan diterima
-> Alat mengembalikan {"accepted": ..., "message": ...}
-> Agen melaporkan hasil dari accepted
Komponen memiliki tanggung jawab berikut:
| Komponen | Tanggung Jawab |
|---|---|
| SDK Agens OpenAI | Memahami instruksi berbahasa alami, menentukan kapan alat dipanggil, menjalankannya, dan mengatur respons |
| Composio | Mendaftarkan fungsi Python standar sebagai alat yang dapat dipanggil agen |
| Playwright | Membuka halaman, menerapkan hasil, mengirim formulir, dan membaca status halaman yang dihasilkan |
| SDK CapSolver | Mengembalikan hasil CAPTCHA melalui panggilan solve() tunggal |
pip install composio composio-openai-agents openai-agents capsolver pydantic playwright
playwright install chromium
Setiap dependensi memiliki peran spesifik:
| Paket | Tujuan |
|---|---|
| composio | Membuat sesi dan mendaftarkan atau memuat alat kustom |
| composio-openai-agents | Mengonversi alat Composio menjadi objek yang dapat dipanggil oleh OpenAI Agents |
| openai-agents | Menyediakan Agent, Runner, dan memori multi-turn SQLite |
| capsolver | Menyediakan SDK resmi dan mengembalikan hasil melalui solve() |
| pydantic | Mendefinisikan skema input alat |
| playwright | Membuka halaman, menerapkan hasil, mengirim formulir, dan membaca respons |
# Kunci API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..." # Kunci API OpenAI resmi Anda.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY # SDK OpenAI membaca kunci dari lingkungan.
# Konfigurasi CapSolver dan Composio.
capsolver.api_key = "CAP-..."
composio = Composio(
api_key=COMPOSIO_API_KEY,
provider=OpenAIAgentsProvider(),
)
Catatan konfigurasi:
OPENAI_API_KEYharus ditulis ke lingkungan karena SDK membaca dari sana;OpenAIAgentsProvidermembuat alat yang dikembalikan olehsession.tools()kompatibel dengan Agent; dan kunci Composio memerlukan izinsessions: writeatau pembuatan sesi mengembalikan 403.
Penyedia OpenAI Composio dan SDK Agens OpenAI saat ini menjelaskan batas penyedia dan agen yang digunakan oleh konfigurasi ini.
Tukarkan Kode Bonus CapSolver Anda
Meningkatkan anggaran otomasi Anda secara instan!
Gunakan kode bonus CAP26 saat menambahkan dana ke akun CapSolver Anda untuk mendapatkan tambahan 5% bonus pada setiap penambahan dana — tanpa batas.
Tukarkan sekarang di Dashboard CapSolver Anda
Kondisi berhenti: alat hanya melaporkan keberhasilan jika halaman mengandung teks keberhasilan yang diharapkan. Blok
finallymenutup browser di jalur keberhasilan dan kegagalan.
import os
from typing import List, cast
import capsolver
from agents import Agent, Runner, SQLiteSession
from composio import Composio
from composio.core.models.custom_tool import CustomTool
from composio.core.models.tool_router import ToolRouterExperimentalConfig
from composio_openai_agents import OpenAIAgentsProvider
from playwright.sync_api import sync_playwright
from pydantic import BaseModel, Field
# Kunci API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..." # Kunci API OpenAI resmi Anda.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
# Konfigurasi CapSolver dan Composio.
capsolver.api_key = "CAP-..."
composio = Composio(
api_key=COMPOSIO_API_KEY,
provider=OpenAIAgentsProvider(),
)
# Skema input untuk alat kustom; Composio memerlukan BaseModel Pydantic di sini.
class CompleteRecaptchaInput(BaseModel):
target_url: str = Field(
default="https://www.google.com/recaptcha/api2/demo",
description="URL halaman yang berisi demo reCAPTCHA v2",
)
website_key: str = Field(
default="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
description="Kunci website reCAPTCHA v2 dari halaman saat ini",
)
# Daftarkan seluruh alur sebagai satu alat Composio yang dapat dipanggil agen.
# Anotasi tipe parameter pertama diperlukan oleh Composio untuk menerka skema.
@composio.experimental.tool(preload=True)
def complete_recaptcha_v2(input: CompleteRecaptchaInput, _ctx):
"""Buka halaman dengan Playwright, selesaikan reCAPTCHA v2, kirim, dan verifikasi."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # Atur headless=True untuk menyembunyikan jendela.
page = browser.new_page()
try:
page.goto(input.target_url)
# Minta CapSolver untuk menyelesaikan tantangan reCAPTCHA v2.
solution = capsolver.solve(
{
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": input.target_url,
"websiteKey": input.website_key,
}
)
token = solution.get("gRecaptchaResponse")
page.evaluate(
"""
(token) => {
const textarea = document.getElementById('g-recaptcha-response');
if (textarea) {
textarea.value = token;
}
}
""",
token,
)
page.click("#recaptcha-demo-submit")
page.wait_for_load_state("networkidle")
result_page = page.content()
# Keberhasilan hanya jika halaman benar-benar menunjukkan teks keberhasilan
accepted = "Verification Success" in result_page
return {
"accepted": accepted,
"message": (
"Verification Success"
if accepted
else "Halaman tidak melaporkan Verification Success"
),
}
finally:
browser.close()
def main():
experimental: ToolRouterExperimentalConfig = {
"custom_tools": cast(List[CustomTool], [complete_recaptcha_v2]),
}
session = composio.sessions.create(
user_id="playwright-recaptcha-demo-user",
experimental=experimental,
sandbox={"enable": False}, # Jalankan alat dalam proses ini, bukan sandbox.
)
agent = Agent(
name="Asisten reCAPTCHA Playwright",
instructions=(
"Ketika pengguna meminta menjalankan demo, panggil complete_recaptcha_v2 "
"dengan nilai defaultnya. Laporkan keberhasilan hanya ketika accepted bernilai true."
),
model="gpt-5.2",
tools=session.tools(),
)
# Memori untuk percakapan multi-turn
memory = SQLiteSession("conversation")
print("Demo Composio + reCAPTCHA v2 Playwright berjalan sekali...")
user_input = (
"Panggil complete_recaptcha_v2 sekarang dengan target_url dan website_key defaultnya. "
"Jangan tanyakan konfirmasi."
)
result = Runner.run_sync(
starting_agent=agent,
input=user_input,
session=memory,
)
print(f"Assistant: {result.final_output}\n")
if __name__ == "__main__":
main()
Pola yang sama dapat menangani CAPTCHA teks gambar standar dengan mendaftarkan alat Composio kedua. Contoh ini menggunakan BotDetect CAPTCHA Demo: elemen gambar adalah #demoCaptcha_CaptchaImage, inputnya adalah #captchaCode, dan tombol validasinya adalah #validateCaptchaButton.

Permintaan ImageToTextTask mengirimkan gambar Base64 melalui body. Berbeda dengan tugas berbasis token, tugas ini mengembalikan teks yang dikenali secara langsung dan tidak memerlukan loop polling terpisah.
image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
if not image_src or "," not in image_src:
raise RuntimeError("Tidak ditemukan URL Data CAPTCHA yang valid")
base64_image = image_src.split(",", 1)[1] # Hilangkan awalan "data:image/...;base64,"
class CompleteImageCaptchaInput(BaseModel):
target_url: str = Field(
default="https://captcha.com/demos/features/captcha-demo.aspx",
description="URL halaman demo CAPTCHA gambar",
)
module: str = Field(
default="common",
description="Modul recognition ImageToTextTask CapSolver",
)
@composio.experimental.tool(preload=True)
def complete_image_captcha(input: CompleteImageCaptchaInput, _ctx):
"""Buka halaman dengan Playwright, kenali CAPTCHA gambar, kirim, dan verifikasi."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
try:
page.goto(input.target_url)
page.wait_for_selector("#demoCaptcha_CaptchaImage", state="visible")
# Src gambar sudah berupa URL data; hilangkan awalan untuk dapatkan Base64.
image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
if not image_src or "," not in image_src:
raise RuntimeError("Tidak ditemukan URL Data CAPTCHA yang valid")
base64_image = image_src.split(",", 1)[1]
solution = capsolver.solve(
{
"type": "ImageToTextTask",
"websiteURL": input.target_url,
"module": input.module,
"body": base64_image,
}
)
captcha_text = solution.get("text")
if not isinstance(captcha_text, str) or not captcha_text:
raise RuntimeError("CapSolver tidak mengembalikan teks yang dikenali")
page.fill("#captchaCode", captcha_text) # Isi teks yang dikenali.
page.click("#validateCaptchaButton")
page.wait_for_load_state("networkidle")
result_page = page.content()
# Halaman demo menunjukkan "Correct!" pada keberhasilan, "Incorrect!" pada kegagalan.
accepted = "Correct!" in result_page
return {
"accepted": accepted,
"recognized_text": captcha_text,
"message": "Correct!" if accepted else "Halaman tidak melaporkan Correct!",
}
finally:
browser.close()
Ringkasan alur:
Playwright membuka halaman CAPTCHA
-> Tunggu #demoCaptcha_CaptchaImage menjadi terlihat
-> Baca src (URL data) dan hapus awalan untuk dapatkan Base64
-> capsolver.solve(ImageToTextTask) mengembalikan teks
-> page.fill menulis hasil ke #captchaCode
-> page.click mengaktifkan #validateCaptchaButton
-> page.content memeriksa Correct! atau Incorrect!
-> finally menutup browser
Parameter module opsional dan defaultnya common. Jika CAPTCHA berisi hanya angka, gunakan number. Gaya khusus dapat menggunakan model independen yang terdokumentasi saat sesuai.

Sebagai contoh, gunakan sumber kode yang tidak berubah untuk pengenalan hanya angka:
solution = capsolver.solve({
"type": "ImageToTextTask",
"module": "number",
"images": [base64_image],
})
answers = solution["answers"]
Model number mendukung beberapa gambar dalam satu pengiriman, dan images dapat berisi hingga sembilan string Base64. Nama model yang didukung dan kasus penggunaan tercantum di halaman ImageToTextTask CapSolver yang terkait.
experimental.tool: parameter pertama dari "complete_recaptcha_v2" harus
dianotasi dengan subclass BaseModel Pydantic. Dapat: <class 'inspect._empty'>
Composio menerka skema input dari anotasi tipe parameter pertama, jadi input: CompleteRecaptchaInput tidak boleh dilewati. Ini adalah anotasi fungsional, bukan tipet yang opsional. Referensi BaseModel Pydantic menjelaskan tipe model yang digunakan untuk skema.
Pembuatan sesi dapat mengembalikan kesalahan berikut:
403 APIKey_InsufficientPermissions
Rute ini memerlukan akses tulis "sessions"
Penyebabnya adalah bahwa composio.sessions.create() memerlukan akses tulis proyek untuk sesi, sementara kunci saat ini hanya memiliki akses baca. Kunci valid, tetapi skopnya tidak memadai, sehingga responsnya 403 alih-alih 401.
Langkah penyelesaian:
sessions: write dan ganti COMPOSIO_API_KEY di bagian atas skrip.Inti dari integrasi ini adalah alur kerja bisnis lengkap yang dikemas sebagai satu alat Composio:
Alat Composio = Tindakan halaman Playwright + Hasil CapSolver + Verifikasi state halaman
Jalankan contoh hanya pada halaman dan proses yang Anda miliki atau diizinkan untuk otomasi. Gunakan variabel lingkungan atau manajer rahasia untuk kredensial, hentikan saat halaman tidak mencapai state bisnis yang diharapkan, dan tinjau kegagalan berulang alih-alih mengulang tak terbatas.
Untuk alur kerja agen Composio yang diizinkan yang membutuhkan lapisan infrastruktur CAPTCHA yang fokus, uji CapSolver dengan halaman yang Anda kendalikan sendiri dan verifikasi hasil aplikasi setelah setiap penyelesaian.
Apa yang dikelola oleh Composio dalam integrasi ini?
Composio mendaftarkan fungsi Python sebagai alat kustom yang dapat dipanggil agen, membuat sesi, mengekspos skema alat, dan mengarahkan eksekusi dari agen OpenAI.
Mengapa parameter alat pertama harus berupa Pydantic BaseModel?
Composio menggunakan anotasi ini untuk menurunkan skema input alat. Menghilangkannya mencegah pembuatan skema dan memicu kesalahan validasi sebelum alur kerja browser dimulai.
Apakah alat reCAPTCHA v2 berhenti setelah CapSolver mengembalikan token?
Tidak. Kode yang tidak berubah menerapkan token, mengirim formulir demo, membaca HTML hasil, dan melaporkan keberhasilan hanya ketika halaman mengandung teks Verifikasi Berhasil yang diharapkan.
Apakah ImageToTextTask memerlukan loop polling terpisah?
Tidak. Dalam alur kerja ini, SDK resmi mengembalikan teks yang dikenali secara langsung. Alat kemudian mengisi input, mengirim halaman, dan memeriksa teks "Benar!" sebagai kondisi berhenti.
Apakah alur kerja ini dapat digunakan di situs apa pun?
Tidak. Gunakan hanya untuk otomasi yang sah, wajar, bertanggung jawab, dan diizinkan pengguna. Hormati ketentuan situs, hukum yang berlaku, batas kecepatan, dan persyaratan minimisasi data.
Sebuah agen AI solver reCAPTCHA v3 hanya dapat diandalkan ketika agen tersebut mempertahankan tindakan, halaman, sesi browser, dan konteks otorisasi yang menghasilkan tantangan tersebut. CapSolver menyediakan lapisan infrastruktur CAPTCHA yang didokumentasikan melalui Core SDK, Agent Tools, dan MCP. Agen tetap memiliki kebijakan, ulang, dan konfirmasi tugas asli. Panduan ini menjelaskan integrasi produksi untuk reCAPTCHA v3, termasuk Enterprise, tanpa memperlakukan token yang dikembalikan sebagai sukses akhir.

Ketika laporan agen AI CAPTCHA tidak berfungsi tiba, laporan tersebut menyembunyikan beberapa kegagalan yang berbeda. Deteksi mungkin salah, agen mungkin mengarahkan ke alat yang tidak tersedia, browser mungkin berpindah sebelum hasil kembali, atau aplikasi mungkin menolak hasil yang secara teknis dihasilkan. CapSolver menyediakan infrastruktur CAPTCHA yang didokumentasikan, sementara pengatur Anda harus menyimpan bukti dan memilih cabang pemulihan yang benar. Panduan ini mengubah insiden yang samar menjadi lapisan
