Cara Memecahkan reCAPTCHA v2 di Python Dengan CapSkip SDK

solve recaptcha v2 in python - How to Solve reCAPTCHA v2 in Python With the CapSkip SDK

reCAPTCHA v2 memiliki tiga varian, dan di Python semuanya adalah satu fungsi dengan argumen kata kunci yang berbeda. Checkbox adalah panggilan polosnya, Invisible dan Enterprise adalah flag, dan keduanya dapat diatur sekaligus. Python juga satu-satunya SDK CapSkip dengan klien async yang benar-benar terpisah, dan itu penting begitu Anda memecahkan lebih dari satu sekaligus.

Penyiapan

# Python 3.10 or newer.
pip install capskip

CapSkip memecahkan secara lokal, jadi jalankan dulu aplikasi desktopnya, lalu arahkan client ke port yang tercantum di pengaturannya:

from capskip import CapSkip

solver = CapSkip(
    apiKey="capskip",        # any string when key validation is off
    host="127.0.0.1",
    port=8080,
    recaptchaTimeout=300,    # seconds
)

Di lingkungan produksi, baca nilai tersebut dari environment saja:

import os
from capskip import CapSkip

solver = CapSkip(
    apiKey=os.getenv("CAPSKIP_API_KEY", "capskip"),
    host=os.getenv("CAPSKIP_HOST", "127.0.0.1"),
    port=int(os.getenv("CAPSKIP_PORT", "8080")),
)

Tiga varian

VarianKata kunci untuk ditambahkan
Checkboxtidak ada
Invisibleinvisible=1
Enterpriseenterprise=1
Invisible Enterprisekedua
# Checkbox: the baseline call.
result = solver.recaptcha(
    sitekey="6Lc...YOUR_SITEKEY",
    url="https://example.com/login",
)

print(result["code"])   # g-recaptcha-response token

# Invisible.
result = solver.recaptcha(sitekey=sitekey, url=page_url, invisible=1)

# Enterprise, and both together.
result = solver.recaptcha(sitekey=sitekey, url=page_url, enterprise=1)
result = solver.recaptcha(sitekey=sitekey, url=page_url, enterprise=1, invisible=1)

Nilai kembaliannya adalah dict biasa, sehingga result["code"] adalah token-nya. Ada juga result["captchaId"] jika Anda ingin mencatat pemecahan internal mana yang menghasilkannya.

Mendapatkan sitekey dan URL yang benar

sitekey adalah data-sitekey atribut pada kontainer widget, atau argumen pertama untuk grecaptcha.render ketika tidak ada container. Selalu dimulai dengan 6L dan bersifat publik.

URL harus berupa halaman tempat widget dirender. Memberikan handler formulir Anda atau pengalihan setelah login adalah penyebab paling umum dari token yang dipecahkan dengan baik lalu gagal divalidasi.

Mengirimkan token

import requests

response = requests.post(
    "https://example.com/login",
    data={
        "g-recaptcha-response": result["code"],
        "username": "...",
        "password": "...",
    },
)

Token bertahan sekitar dua menit dan bersifat sekali pakai, jadi pecahkan selambat mungkin dalam alurnya. Jika situs menyerahkan token ke callback JavaScript alih-alih ke kolom formulir, pemecahannya identik tetapi cara pengirimannya berbeda, dan hal itu dibahas dalam pemecah callback reCAPTCHA v2 dibahas halaman ini.

Memecahkan beberapa sekaligus

Di sinilah Python berbeda dari SDK CapSkip lainnya. AsyncCapSkip adalah implementasi async yang sesungguhnya, bukan alias, sehingga ia benar-benar menjalankan pemecahan secara tumpang tindih:

import asyncio
from capskip import AsyncCapSkip

async def main():
    solver = AsyncCapSkip()
    r1, r2 = await asyncio.gather(
        solver.recaptcha(sitekey=key_a, url="https://a.example.com"),
        solver.recaptcha(sitekey=key_b, url="https://b.example.com"),
    )
    print(r1["code"], r2["code"])

asyncio.run(main())

Di SDK Node.js dan .NET AsyncCapSkip hanyalah sebuah alias, dan di PHP ia ada semata-mata agar kode yang dipindahkan tetap bisa dikompilasi. Python adalah satu-satunya bahasa di mana beralih ke sana benar-benar mengubah perilaku.

Kesalahan

from capskip import (
    CapSkip, ValidationException, NetworkException,
    ApiException, TimeoutException,
)

try:
    result = solver.recaptcha(sitekey=sitekey, url=page_url)
except ValidationException:
    pass   # missing or malformed arguments
except NetworkException:
    pass   # CapSkip is not running
except ApiException:
    pass   # bad sitekey or pageurl
except TimeoutException:
    pass   # exceeded recaptchaTimeout

Keempatnya diturunkan dari basis yang sama, sehingga except CapSkipError menangkap semuanya jika Anda lebih suka menangani kegagalan di satu tempat.

Menggunakan proxy

result = solver.recaptcha(
    sitekey=sitekey,
    url=page_url,
    proxy={"type": "HTTPS", "uri": "user:[email protected]:3128"},
)

Proxy bekerja untuk reCAPTCHA, Turnstile dan GeeTest. Proxy tidak didukung untuk CAPTCHA gambar, yang dipecahkan dari byte gambarnya dan tidak pernah menyentuh situs target.

Pertanyaan yang sering diajukan

Apakah saya perlu melakukan polling untuk mendapatkan hasilnya?

Tidak. SDK melakukan polling secara internal dan mengembalikan token yang sudah jadi, sehingga CAPCHA_NOT_READY tidak pernah sampai ke kode Anda. Pengecekan dimulai setelah 250ms lalu melambat, yang biasanya lebih baik daripada loop buatan tangan.

Apakah AsyncCapSkip layak digunakan untuk satu pemecahan saja?

Tidak juga. Hal itu baru penting ketika beberapa pemecahan tumpang tindih, atau ketika Anda sudah berada di dalam event loop dan panggilan yang memblokir akan menghambatnya. Untuk satu pemecahan dalam sebuah skrip, klien sinkron lebih sederhana.

Versi Python mana saja yang didukung?

3.10 dan yang lebih baru. Paket ini tidak punya dependensi berat, jadi bisa langsung masuk ke proyek scraping atau otomatisasi yang sudah ada tanpa menarik banyak paket tambahan.

Ringkasan

Satu fungsi, tiga varian, dipilih dengan invisible dan enterprise. Baca result["code"], kirimkan sebagai g-recaptcha-response, dan gunakan AsyncCapSkip saat Anda memecahkan dalam jumlah besar.

Cakupan Python yang lebih luas ada di halaman pemecah CAPTCHA Python halaman, bahasa lain di pemecah reCAPTCHA v2 halaman, dan ada demo v2 langsung untuk diuji. CapSkip adalah pemecah captcha yang berjalan di komputer Anda sendiri.