CAPSOLVER
Blog
Cara mengintegrasikan CapSolver dengan Composio AI Otomasi Peramban

Cara mengintegrasikan CapSolver dengan Composio AI Otomasi Peramban

Logo of CapSolver

Emma Foster

How to use CapSolver

17-Aug-2026

TL;DR

  • Wrap seluruh alur kerja halaman Playwright — buka, selesaikan, terapkan hasil, kirim, dan verifikasi — dalam alat kustom Composio yang dapat dipanggil oleh SDK Agens AI OpenAI dari instruksi berbahasa alami.
  • Contoh ini mencakup dua jenis tantangan: reCAPTCHA v2 dengan token yang dikembalikan dan pengenalan CAPTCHA gambar dengan ImageToTextTask, yang didaftarkan sebagai alat terpisah dalam satu sesi.
  • Alur kerja terhubung langsung ke API OpenAI resmi dan menggunakan Playwright untuk otomasi browser.
  • Dua kegagalan integrasi umum adalah kunci Composio tanpa izin sessions: write, yang mengembalikan 403, dan parameter pertama alat tanpa anotasi BaseModel Pydantic, yang memicu ValidationError.

1. Pendahuluan

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:

text Copy
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

2. Mulai Cepat

bash Copy
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

3. Konfigurasi

python Copy
# 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_KEY harus ditulis ke lingkungan karena SDK membaca dari sana; OpenAIAgentsProvider membuat alat yang dikembalikan oleh session.tools() kompatibel dengan Agent; dan kunci Composio memerlukan izin sessions: write atau 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
Kode Bonus

4. Implementasi Inti

Kondisi berhenti: alat hanya melaporkan keberhasilan jika halaman mengandung teks keberhasilan yang diharapkan. Blok finally menutup browser di jalur keberhasilan dan kegagalan.

python Copy
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()

5. Pengenalan CAPTCHA Gambar dengan ImageToTextTask

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.

Gambar CAPTCHA BotDetect, input, dan elemen validasi yang diinspeksi di browser

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.

5.1 Baca Gambar sebagai Base64

python Copy
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,"

5.2 Implementasi Alat Kustom

python Copy
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:

text Copy
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

5.3 Pilih Model Pengenalan yang Tepat

Parameter module opsional dan defaultnya common. Jika CAPTCHA berisi hanya angka, gunakan number. Gaya khusus dapat menggunakan model independen yang terdokumentasi saat sesuai.

Contoh dan nilai akurasi model independen ImageToTextTask CapSolver

Sebagai contoh, gunakan sumber kode yang tidak berubah untuk pengenalan hanya angka:

python Copy
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.

6. Pemecahan Masalah

6.1 Parameter Pertama Alat Harus Berupa BaseModel

text Copy
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.

6.2 Composio Mengembalikan 403

Pembuatan sesi dapat mengembalikan kesalahan berikut:

text Copy
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:

  1. Buka dashboard Composio dan pergi ke pengaturan API Keys untuk proyek yang relevan.
  2. Ubah izin sesi kunci saat ini dari baca menjadi tulis.
  3. Jika izin tidak dapat diedit, buat kunci baru dengan sessions: write dan ganti COMPOSIO_API_KEY di bagian atas skrip.
  4. Jalankan skrip kembali. Mencapai alur interaktif tanpa 403 memastikan bahwa izin aktif.

7. Kesimpulan dan CTA

Inti dari integrasi ini adalah alur kerja bisnis lengkap yang dikemas sebagai satu alat Composio:

text Copy
Alat Composio = Tindakan halaman Playwright + Hasil CapSolver + Verifikasi state halaman
  • Composio mengonversi fungsi Python menjadi alat agen dan menangani inferensi skema serta eksekusi.
  • Playwright membuka halaman, menerapkan hasil, mengirim formulir, dan membaca state akhir.
  • CapSolver menangani reCAPTCHA v2 dan pengenalan CAPTCHA gambar untuk alur kerja ini.

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.

FAQ

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.

Pernyataan Kepatuhan: Informasi yang diberikan di blog ini hanya untuk tujuan informasi. CapSolver berkomitmen untuk mematuhi semua hukum dan peraturan yang berlaku. Penggunaan jaringan CapSolver untuk kegiatan ilegal, penipuan, atau penyalahgunaan sangat dilarang dan akan diselidiki. Solusi penyelesaian captcha kami meningkatkan pengalaman pengguna sambil memastikan kepatuhan 100% dalam membantu menyelesaikan kesulitan captcha selama pengambilan data publik. Kami mendorong penggunaan layanan kami secara bertanggung jawab. Untuk informasi lebih lanjut, silakan kunjungi Syarat Layanan dan Kebijakan Privasi.

Lebih lanjut