CapSkip SDK ile Python'da reCAPTCHA v2 Nasıl Çözülür

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

reCAPTCHA v2'nin üç çeşidi vardır ve Python'da bunlar farklı anahtar kelime argümanlarına sahip tek bir fonksiyondur. Checkbox yalın çağrıdır, Invisible ve Enterprise birer bayraktır ve ikisi aynı anda ayarlanabilir. Python ayrıca gerçekten ayrı bir async istemcisi olan tek CapSkip SDK'sıdır; bu da aynı anda birden fazla çözüm yaptığınız anda önem kazanır.

Kurulum

# Python 3.10 or newer.
pip install capskip

CapSkip yerel olarak çözer, bu yüzden önce masaüstü uygulamasını başlatın, ardından istemciyi ayarlarındaki porta yönlendirin:

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
)

Üretimde bunları bunun yerine ortamdan okuyun:

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")),
)

Üç varyant

VaryantEklenecek anahtar kelime
Checkboxyok
Invisibleinvisible=1
Enterpriseenterprise=1
Invisible Enterpriseher ikisi
# 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)

Dönüş değeri düz bir dict'tir, bu yüzden result["code"] token'dır. Ayrıca şu da vardır: result["captchaId"] onu hangi dahili çözümün ürettiğini günlüğe kaydetmek istiyorsanız.

sitekey ve URL'yi doğru yapmak

sitekey şudur: data-sitekey widget kapsayıcısındaki öznitelik ya da şuna verilen ilk argüman: grecaptcha.render konteyner olmadığında. Her zaman şununla başlar: 6L ve herkese açıktır.

URL, bileşenin render edildiği sayfa olmalıdır. Form işleyicinizi veya giriş sonrası bir yönlendirmeyi iletmek, sorunsuz çözülüp ardından doğrulamada başarısız olan bir token'ın en yaygın nedenidir.

Token'ı gönderme

import requests

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

Token'lar yaklaşık iki dakika geçerlidir ve tek kullanımlıktır; bu yüzden akışta olabildiğince geç çözün. Site, token'ı bir form alanı yerine bir JavaScript callback'ine veriyorsa, çözüm aynıdır ancak gönderim farklıdır; bunu reCAPTCHA v2 callback çözücü sayfası kapsar.

Aynı anda birkaç tanesini çözme

Python'un diğer CapSkip SDK'larından ayrıldığı nokta burasıdır. AsyncCapSkip bir takma ad değil, gerçek bir async uygulamadır; bu nedenle çözümleri gerçekten çakıştırır:

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

Node.js ve .NET SDK'larında AsyncCapSkip yalnızca bir takma addır ve PHP'de tamamen taşınan kodun derlenmesi için oradadır. Buna geçmenin davranışı gerçekten değiştirdiği yer Python'dur.

Hatalar

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

Dördü de ortak bir temelden türer, dolayısıyla except CapSkipError hataları tek bir yerde ele almayı tercih ederseniz her şeyi yakalar.

Proxy kullanmak

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

Proxy'ler reCAPTCHA, Turnstile ve GeeTest için çalışır. Görsel baytlarından çözülen ve hedef siteye hiç ulaşmayan görsel CAPTCHA'lar için desteklenmezler.

Sık sorulan sorular

Sonuç için sorgulama yapmam gerekir mi?

Hayır. SDK dahili olarak sorgular ve tamamlanan token'ı döndürür; bu nedenle CAPCHA_NOT_READY kodunuza asla ulaşmaz. 250ms sonra kontrol etmeye başlar ve geri çekilir; bu da genellikle elle yazılmış bir döngüden daha iyidir.

AsyncCapSkip, tek bir çözüm için kullanmaya değer mi?

Pek değil. Birkaç çözüm çakıştığında veya zaten bir olay döngüsünün içindeyseniz ve engelleyici bir çağrı onu takılı bırakacaksa önem kazanır. Bir betikte tek bir çözüm için senkron istemci daha basittir.

Hangi Python sürümleri desteklenir?

3.10 ve daha yenisi. Paketin ağır bağımlılıkları yoktur; bu nedenle bir sürü ek bağımlılık getirmeden mevcut bir scraping veya otomasyon projesine dahil olur.

Özet

Tek fonksiyon, üç çeşit, şununla seçilir: invisible ve enterprise. Okuyun: result["code"], şu şekilde gönderin: g-recaptcha-response, ve şuna uzanın: AsyncCapSkip toplu çözüm yaptığınızda.

Daha geniş Python yüzeyi şuradadır: Python CAPTCHA çözücü sayfası, diğer diller şurada: reCAPTCHA v2 çözücü sayfa ve bir şey var canlı v2 demosu karşı test etmek için. CapSkip bir captcha çözücü kendi makinenizde çalışan.