Scarnox · Blog

Cara memecahkan PopularCaptcha di Python (contoh yang berfungsi, 2026)

Jika skrip Python Anda terbentur PopularCaptcha, Anda tidak butuh farm browser atau model sendiri. Anda hanya butuh sitekey halaman, satu POST request, dan token yang dikembalikan.

Panduan ini membawa Anda dari nol hingga mendapatkan token yang berfungsi dalam sekitar lima menit: dapatkan kunci API, temukan sitekey, minta token, kirim ke form, dan tangani kasus gagal yang muncul ketika skrip berjalan tanpa pengawasan. Solve yang gagal gratis, jadi retry hanya memakan waktu Anda.

Scarnox memecahkan PopularCaptcha saat ini, proxyless atau dengan proxy Anda sendiri. Jenis captcha lain seperti reCAPTCHA, Cloudflare Turnstile, dan AWS WAF segera hadir, jadi setiap contoh di sini menggunakan PopularCaptcha. Ikhtisar jenis captcha menjelaskan perbedaan jenis lainnya.

1. Dapatkan kunci API

Buat akun dan mulai dengan kredit uji coba gratis, tanpa kartu. Kunci API Anda ada di dashboard. Jangan simpan di kode sumber, dan baca dari environment variable:

export SCARNOX_KEY="scarnox_YOURAPIKEY"

2. Temukan sitekey

Buka halaman yang menampilkan captcha, buka DevTools, dan cari data-sitekey di panel Elements. Sitekey PopularCaptcha berbentuk UUID:

<div class="h-captcha" data-sitekey="10000000-ffff-ffff-ffff-000000000001"></div>

Tidak ada data-sitekey di HTML? Widget kemungkinan dirender oleh JavaScript. Periksa tab Network untuk request konfigurasi widget; parameter query sitekey-nya adalah yang Anda butuhkan. Cara lain menemukannya membahas URL iframe dan widget tak terlihat.

Kirim URL halaman yang menampilkan widget sebagai site_url. Host paling penting, tetapi URL halaman lengkap adalah pilihan yang aman.

3. Minta token

import os
import requests

API_URL = "https://api.scarnox.com/api/tasks/create"
API_KEY = os.environ["SCARNOX_KEY"]

def solve_captcha(sitekey: str, page_url: str) -> str:
    r = requests.post(
        API_URL,
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={
            "captcha_type": "PopularCaptchaTaskProxyless",
            "site_key": sitekey,
            "site_url": page_url,
        },
        timeout=185,  # panggilan menunggu sampai token siap
    )
    data = r.json()
    if data.get("errorId") != 0:
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data["solution"]["token"]

if __name__ == "__main__":
    token = solve_captcha("10000000-ffff-ffff-ffff-000000000001", "https://example.com/signup")
    print(token[:40], "...")

Itulah seluruh integrasinya. Tidak ada loop polling dan tidak ada panggilan "ambil hasil" kedua. Request kembali ketika token sudah siap, jadi satu-satunya pengaturan yang penting adalah timeout yang cukup panjang untuk solve yang lambat. Gunakan sekitar 185 detik.

Respons yang berhasil memiliki errorId bernilai 0, dengan token berada di solution.token. errorId lain berarti solve gagal, dan respons membawa errorCode dan errorDescription yang menjelaskan alasannya.

4. Kirim token

Token dikirim ke tempat situs mengharapkan respons captcha. Untuk PopularCaptcha, itu hampir selalu field form bernama h-captcha-response. Banyak situs juga menerima g-recaptcha-response, jadi kirim keduanya:

import requests

def sign_up(session: requests.Session, form_url: str, email: str, sitekey: str) -> requests.Response:
    token = solve_captcha(sitekey, form_url)
    return session.post(form_url, data={
        "email": email,
        "h-captcha-response": token,
        "g-recaptcha-response": token,
    }, timeout=30)

Dua detail di sini penting. Situs sungguhan biasanya juga memeriksa cookie sesi dari pemuatan halaman, jadi muat form dengan requests.Session yang sama sebelum Anda melakukan POST. Dan kirim POST ke URL action form, yang tidak selalu sama dengan URL halaman.

Lakukan solve tepat sebelum pengiriman. Token kedaluwarsa dalam sekitar dua menit, jadi jangan mengambilnya di awal pekerjaan panjang lalu menyimpannya. Jika situs menolak token, buka form di DevTools dan pastikan nama field tersembunyinya.

5. Tangani kegagalan

Solve yang gagal gratis, jadi retry hanya memakan waktu, tidak ada hal lain. Namun beberapa error tidak akan pernah berhasil di-retry, jadi jangan retry secara membabi buta. Periksa errorId setiap kali, catat errorCode dan errorDescription, dan retry hanya untuk kegagalan sementara.

Error jaringan perlu penanganan tersendiri, karena requests memunculkan exception sebelum ada respons:

import requests

try:
    token = solve_captcha(sitekey, page_url)
except requests.RequestException as exc:
    print("masalah jaringan, coba lagi nanti:", exc)
except RuntimeError as exc:
    print("solve ditolak:", exc)

Panduan penanganan error memiliki kebijakan retry lengkap dengan backoff dan jitter.

Kesalahan umum

Coba gratis

Buat akun dan mulai dengan kredit uji coba gratis, tanpa kartu. Jalankan contoh di atas terhadap form milik Anda sendiri sebelum menyambungkannya ke pekerjaan yang lebih besar. Untuk biaya solve dalam volume besar, lihat harga terkini.

Mencatat setiap solve

Catat satu baris per solve: sitekey, host halaman, errorId, errorCode jika gagal, dan berapa lama panggilan berlangsung. Jangan sertakan kunci API atau password proxy. Baris-baris ini memberi tahu Anda apakah run yang lambat disebabkan oleh halaman, proxy, atau solver. Itu juga hal pertama yang akan Anda butuhkan jika Anda membuka permintaan dukungan.

Solve dalam loop

Jika skrip Anda memecahkan banyak captcha berturut-turut, jaga loopnya tetap sederhana. Solve, kirim, periksa hasilnya, baru lanjut. Jangan memecahkan lebih dulu lalu mengantrekan token, karena setiap token kedaluwarsa dalam sekitar dua menit. Jeda singkat di antara solve pada situs yang sama menjaga laju request Anda mendekati apa yang dihasilkan manusia.

Langkah selanjutnya