
Aloísio Vítor
Image Processing Expert
Diterbitkan Oct 23, 2026
Diperbarui Oct 23, 2026 · min baca

Browser self-hosted dapat menavigasi ke halaman yang benar tetapi tetap membuat alur kerja Anda tertahan di CAPTCHA. Jika Anda menjalankan Steel secara lokal, menambahkan flag pemecahan milik layanan cloud saja tidak cukup: deployment lokal dan cloud memiliki kapabilitas yang berbeda.
Panduan ini menunjukkan di mana solver CAPTCHA ditempatkan dalam Steel Browser self-hosted, dengan satu pemeriksaan koneksi Python kecil. Contoh menggunakan halaman pengembangan lokal dan kunci uji publik reCAPTCHA milik Google. Contoh ini tidak menargetkan situs pihak ketiga dan tidak memerlukan model AI.
Steel Browser adalah API browser untuk pengembang yang membangun agen web dan aplikasi automasi. Steel mengelola sesi browser yang dapat dikontrol klien melalui alat automasi yang sudah dikenal. Repositori resmi Steel mendokumentasikan self-hosting dan koneksi dari Playwright, Puppeteer, dan Selenium.
Bagi pengembang yang menjalankan alur kerja formulir terotorisasi, pembagian tugasnya jelas. Steel menyediakan browser. Playwright menavigasi dan berinteraksi dengan halaman. Solver CAPTCHA menangani tantangan yang didukung ketika muncul. Alur kerja Anda kemudian memeriksa apakah aplikasi menerima tindakan yang dimaksud.
Tutorial ini menggunakan CapSolver Core SDK untuk langkah CAPTCHA tersebut. SDK dapat memeriksa halaman Playwright dan mengekspos operasi pemecahan terpisah. Tidak perlu menambahkan LLM hanya untuk menghubungkan komponen-komponen ini.
Skenario yang berguna adalah job browser self-hosted yang memang membutuhkan operasi CAPTCHA. Untuk pengujian rutin pada perangkat lunak yang Anda miliki, pengaturan uji milik vendor CAPTCHA biasanya sudah cukup. Gunakan jalur solver ketika alur kerja terotorisasi Anda benar-benar membutuhkannya, bukan membuat setiap navigasi browser bergantung pada permintaan berbayar.
Steel Local tidak menyertakan fitur pemecahan CAPTCHA bawaan seperti produk cloud-nya. Matriks fitur lokal-versus-cloud Steel secara eksplisit membedakan kedua deployment.
Perbedaan tersebut memengaruhi implementasi. Tutorial cloud mungkin mengaktifkan pemecahan saat pembuatan sesi, sedangkan integrasi self-hosted harus menyediakan operasi yang hilang tersebut. Jangan berasumsi bahwa field konfigurasi cloud akan mengaktifkan fitur di server lokal.
Jalur yang digunakan di sini adalah:
websocketUrl milik sesi tersebut.Hindari meluncurkan browser lain yang tidak terkait pada langkah ketiga. Browser kedua bukan sesi yang dikembalikan Steel, sehingga mudah saja Anda memeriksa satu halaman sementara job utama Anda tertahan di halaman lain.
Mulailah dengan instance Steel Local yang berjalan khusus dan Python 3.12. Setup yang telah diverifikasi menggunakan Steel API 0.5.3 dari revisi repositori 8362bbd, Playwright 1.64.0, dan capsolver-core 0.1.1 di macOS.
Ikuti instruksi setup lokal dari repositori sesuai deployment Anda. Untuk server berbasis sumber yang digunakan di sini, API dijalankan dengan HOST=127.0.0.1, PORT=3300, dan CDP_REDIRECT_PORT=9323. Ini adalah pilihan port lingkungan uji, bukan default yang wajib. Pastikan API pengembangan Anda hanya dapat diakses dari klien yang dimaksud.
Pasang dependensi Python di lingkungan terisolasi:
python -m pip install "playwright==1.64.0" "capsolver-core==0.1.1" "httpx==0.28.1"
Steel yang memulai browser, sehingga klien ini tidak meluncurkan instance Chromium lain. Metode koneksi CDP Playwright CDP connection method menempel pada browser berbasis Chromium yang sudah ada dan mengekspos konteks default-nya.
Klien juga memerlukan akses ke alamat WebSocket yang dikembalikan. Jika Steel berjalan di container atau mesin lain, pastikan alamat tersebut dapat dijangkau dari Python; 127.0.0.1 mengacu pada mesin yang membuat koneksi.
Tidak diperlukan kredensial CapSolver untuk pemeriksaan deteksi di bawah ini. Pemecahan nyata memerlukan kunci API valid milik Anda dan sumber daya akun. Pemecahan berbayar, pengisian token kembali, dan penerimaan oleh aplikasi tidak dieksekusi dalam panduan ini. Simpan langkah validasi terpisah itu di checklist deployment Anda.
Script membuat sesi Steel nyata, menghubungkan ke browser-nya, dan membaca widget pengembangan melalui SDK resmi. Simpan sebagai steel_sdk_check.py dan jalankan dengan Python.
Contoh ini menggunakan default server lokal pada port 3300. Setel STEEL_URL jika server Anda menggunakan alamat lain. Gunakan instance khusus: pembuatan dan pelepasan sesi akan mengubah sesi browser aktif pada instance tersebut.
Halaman diberikan melalui route Playwright, jadi tidak diperlukan web server pada port 8765. Script widget Google tetap memerlukan akses jaringan. Site key publik didokumentasikan di panduan pengujian reCAPTCHA Google dan ditujukan untuk pengembangan, bukan produksi.
import asyncio
import json
import os
import httpx
from capsolver_core import create_capsolver
from playwright.async_api import async_playwright
STEEL_URL = os.environ.get("STEEL_URL", "http://127.0.0.1:3300")
TEST_URL = "http://127.0.0.1:8765/"
HTML = """<!doctype html><html><head><title>Steel CAPTCHA check</title></head>
<body><h1>Owned development page</h1>
<div class="g-recaptcha" data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"></div>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</body></html>"""
async def main():
async with httpx.AsyncClient(base_url=STEEL_URL, timeout=90) as api:
response = await api.post("/v1/sessions", json={"headless": True})
response.raise_for_status()
session = response.json()
try:
async with async_playwright() as playwright:
browser = await playwright.chromium.connect_over_cdp(session["websocketUrl"])
try:
context = browser.contexts[0]
page = await context.new_page()
await page.route(TEST_URL, lambda route: route.fulfill(
content_type="text/html", body=HTML))
await page.goto(TEST_URL)
await page.wait_for_function(
"() => !!window.___grecaptcha_cfg && "
"Object.keys(window.___grecaptcha_cfg.clients || {}).length > 0",
timeout=30000)
async with create_capsolver() as cap:
infos = await cap.get_captcha_info(page)
result = [{"type": info.type.value,
"url": info.website_url,
"site_key": info.website_key} for info in infos]
print(json.dumps({"session_id": session["id"],
"captcha_parameters": result}))
assert result and result[0]["type"] == "reCaptchaV2"
finally:
await browser.close()
finally:
released = await api.post(f"/v1/sessions/{session['id']}/release")
released.raise_for_status()
print(json.dumps({"released": released.json().get("success")}))
if __name__ == "__main__":
asyncio.run(main())
Pemeriksaan yang dijalankan mengembalikan satu descriptor reCaptchaV2 dengan URL halaman lokal dan site key uji publik. Respons pelepasan terakhir melaporkan true. Observasi tersebut memverifikasi sesi Steel nyata, koneksi CDP, akses halaman, dan jalur pembacaan parameter SDK.
Mereka tidak membuktikan bahwa CAPTCHA berbayar telah dipecahkan. Kunci pengembangan bukan tantangan produksi, dan script secara sengaja tidak meminta token solusi.
Kode mempertahankan halaman di konteks browser yang sudah ada milik Steel. Proses cleanup menutup koneksi klien dan meminta server melepaskan sesi bahkan jika deteksi gagal. Jika Anda mengadaptasinya ke layanan bersama, berikan satu komponen tanggung jawab atas umur sesi, alih-alih membiarkan job tak terkait melepaskan pekerjaan satu sama lain.
Tambahkan pemanggilan pemecahan setelah halaman aplikasi terotorisasi Anda memuat CAPTCHA yang didukung, sementara koneksi browser dan klien SDK masih terbuka. Ganti fixture pengembangan lokal dengan alur kerja aplikasi Anda sendiri; jangan gunakan kunci uji sebagai input produksi.
Buat klien SDK dengan opsi api_key seperti yang didokumentasikan, memuat kredensial dari konfigurasi rahasia yang disetujui. CapSolver menangani permintaan tantangan; Steel tetap memiliki sesi browser.
Baris berikut adalah pemanggilan mode browser resmi yang tidak diubah. Ini memerlukan kunci API yang dikonfigurasi, dan eksekusi berbayar melalui koneksi Steel ini tidak diuji dalam tutorial ini:
results = await cap.solve_on_page(page)
Pertahankan pemanggilan tersebut di dalam konteks klien yang masih hidup. Meletakkannya setelah bagian cleanup dalam contoh akan merujuk ke browser dan klien yang sudah ditutup.
Periksa setiap hasil yang dikembalikan sebelum melanjutkan. SDK melaporkan error, kemungkinan solution, dan apakah pengisian balik terjadi melalui filled. Hasil kosong atau solusi yang hilang bukan bukti bahwa aplikasi Anda melewati CAPTCHA.
Mode token yang didokumentasikan Core SDK mencakup reCAPTCHA v2/v3 dan Cloudflare Turnstile. Jangan berasumsi pemanggilan yang sama memecahkan semua jenis tantangan yang tercantum di seluruh API CapSolver yang lebih luas. Dokumentasi tugas reCAPTCHA v2 menjelaskan persyaratan spesifik untuk jalur yang didukung itu.
Alur kerja hanya lengkap ketika aplikasi mencapai keadaan yang dimaksud. Respons token, field yang terisi, dan pengiriman formulir yang berhasil adalah observasi yang berbeda.
Untuk aplikasi yang Anda kontrol, pilih sinyal keberhasilan yang konkret seperti pesan konfirmasi atau respons yang diharapkan. Tunggu sinyal itu setelah tindakan formulir normal. Jika tidak muncul, periksa respons aplikasi daripada mengirim permintaan pemecahan berulang tanpa memahami kegagalannya.
Pertahankan identitas halaman tetap stabil selama operasi. Jangan menavigasi pergi, menutup tab, atau melepaskan sesi ketika pemecahan sedang berlangsung. Jika aplikasi memuat ulang widget, periksa tantangan saat ini lagi alih-alih menggunakan ulang parameter dari status halaman sebelumnya.
Glosarium CAPTCHA menjelaskan konsep verifikasi, sementara panduan tentang token dan cookie CAPTCHA membantu membedakan berbagai output. Baik cookie browser maupun string token tidak boleh menggantikan pemeriksaan keberhasilan aplikasi Anda.
Mulailah troubleshooting dari operasi pertama yang gagal agar masalah koneksi tidak berubah menjadi permintaan solver yang tidak perlu.
| Gejala | Yang perlu diperiksa |
|---|---|
| Pembuatan sesi gagal | Pastikan API Steel berjalan dan periksa status HTTP serta log server. |
| Koneksi CDP gagal | Periksa apakah websocketUrl dapat dijangkau dari proses Python dan memang milik sesi saat ini. |
| Widget tidak pernah terinisialisasi | Periksa akses browser ke script pengembangan Google dan pastikan halaman yang diharapkan dimuat. |
| Deteksi tidak mengembalikan descriptor | Periksa halaman saat ini dan jenis CAPTCHA yang didukung sebelum mencoba pemecahan berbayar. |
| Solusi dikembalikan tetapi alur kerja macet | Periksa pengisian balik, tindakan aplikasi normal, dan respons aplikasi. |
| Job lain kehilangan sesi browser | Tinjau kepemilikan sesi dan pemanggilan release sebelum berbagi instance lokal. |
Jaga log diagnostik tetap kecil. Catat tahap dan error yang sudah disamarkan, bukan kunci API, token respons, atau seluruh storage browser. Uji satu halaman terlebih dahulu, dan tambahkan perilaku retry hanya setelah mengidentifikasi kegagalan sementara yang memang masuk akal diatasi dengan retry.
Integrasi Steel Local memerlukan penyerahan yang jelas dari halaman browser terkelola ke operasi CAPTCHA. Pemeriksaan koneksi yang berfungsi menetapkan penyerahan tersebut tanpa membuat permintaan berbayar. Sebelum menggunakannya di produksi, validasi pemecahan dengan kredensial Anda sendiri dan verifikasi hasil aplikasi di lingkungan terotorisasi.
Pertahankan sesi tetap terbuka untuk pekerjaan yang dimilikinya, lalu lepaskan ketika pekerjaan itu selesai. Ini memberi Anda batas yang berguna untuk troubleshooting dan peningkatan paket di masa depan.
Hubungkan CapSolver pada langkah CAPTCHA yang didukung di alur kerja Steel Anda. Mulailah dari jalur deteksi yang sudah diverifikasi, lalu validasi operasi berkredensial Anda sebelum meningkatkan beban kerja.
Try CapSolver. Gunakan kode bonus CAP26 untuk bonus 5% sesuai ketentuan kampanye.

T: Apakah Steel Browser self-hosted memecahkan CAPTCHA secara otomatis?
Tidak. Perbandingan resmi Steel tidak mencantumkan pemecahan CAPTCHA bawaan untuk Steel Local. Fitur pemecahan pada produk cloud adalah kapabilitas terpisah.
T: Apakah saya memerlukan akun Steel Cloud untuk contoh ini?
Tidak. Contoh terhubung ke instance lokal yang berjalan. Anda tetap bertanggung jawab untuk menjalankan dan mengoperasikan instance tersebut.
T: Mengapa terhubung melalui CDP alih-alih meluncurkan Playwright Chromium?
CDP menautkan Python ke browser yang dikelola Steel. Meluncurkan browser lain akan membuat sesi terpisah dari sesi yang ingin digunakan contoh ini.
T: Apakah pemeriksaan deteksi menghabiskan kredit CapSolver?
Pemeriksaan ini hanya membaca parameter widget dan tidak membuat permintaan penyelesaian berbayar. Panggilan penyelesaian terpisah memerlukan kredensial CapSolver yang valid.
T: Apakah alur penyelesaian berbayar lengkap sudah diuji di sini?
Belum. Run nyata hanya memverifikasi pembuatan sesi, koneksi CDP, deteksi SDK, dan pelepasan. Penyelesaian berbayar, pengisian kembali, dan penerimaan aplikasi masih memerlukan pengujian terpisah dengan kredensial.
T: Apakah ini merupakan kemitraan resmi dengan Steel atau integrasi native?
Bukan. Ini adalah contoh koneksi yang telah diuji menggunakan antarmuka browser publik Steel dan SDK resmi CapSolver. Ini tidak membentuk kemitraan atau jaminan kompatibilitas untuk rilis di masa mendatang.

Aloísio Vítor
Image Processing Expert
Interpreting the visual signals behind web workflows.
TENTANG PENULIS
Pelajari arsitektur pengambilan data web Rust yang dapat diskalakan dengan reqwest, scraper, pengambilan data asinkron, pengambilan data browser tanpa tampilan, rotasi proxy, dan penanganan CAPTCHA yang sesuai aturan.

Mengotomasi penyelesaian CAPTCHA dengan Nanobot dan CapSolver. Gunakan Playwright untuk menyelesaikan reCAPTCHA dan Cloudflare secara otomatis.
