Python'da reCAPTCHA v3 Nasıl Çözülür ve Bir Action Nasıl Ayarlanır

solve recaptcha v3 in python - How to Solve reCAPTCHA v3 in Python and Set an Action

reCAPTCHA v3 asla bir sorgu göstermez. Arka planda çalışır ve siteye bir token verir; site bunu daha sonra sunucu tarafında doğrular. Kodunuz açısından bu, tıklanacak veya bakılacak hiçbir şeyin olmadığı anlamına gelir; dolayısıyla işin tamamı, sitenin kabul edeceği bir token üretmektir. Python'da bu, aynı recaptcha v2 için kullanacağınız metot, bir sürüm bayrağı ile.

İnsanların kafasını karıştıran kısım action'dır.

Kurulum

# Python 3.10 or newer.
pip install capskip
from capskip import CapSkip

solver = CapSkip(
    host="127.0.0.1",
    port=8080,
    recaptchaTimeout=300,   # seconds, shared with Turnstile and GeeTest
)

CapSkip kendi makinenizde çalışır, dolayısıyla bunların herhangi biri işe yaramadan önce masaüstü uygulamasının açık olması gerekir.

Temel çağrı

result = solver.recaptcha(
    sitekey="6Lc...YOUR_SITEKEY",
    url="https://example.com/checkout",
    version="v3",
    action="submit",
)

print(result["code"])   # the v3 token

v2'den iki şey farklıdır. version="v3" gereklidir ve action sayfanın şuraya geçirdiği her neyse onunla eşleşmelidir: grecaptcha.execute. Onu atlarsanız varsayılan şudur: verify.

Eylem neden önemlidir

v3 aksiyonları, sitenin korunan her etkileşime iliştirdiği etiketlerdir; böylece bir giriş ve bir ödeme ayrı ayrı skorlanabilir. Sitenin kendi arka ucu genellikle, döndürülen token'daki aksiyonun o uç nokta için beklediği aksiyonla eşleştiğini kontrol eder.

Yanlış olanı gönderirseniz token teknik olarak geçerlidir ama farklı bir etkileşim için etiketlenmiş olarak gelir ve birçok backend bunu doğrudan reddeder. Tahmin etmek yerine gerçek değeri sayfadan okuyun:

import re
import requests

html = requests.get("https://example.com/checkout").text

# Sites usually call execute() with the action as a literal string.
match = re.search(r"execute\([^,]+,\s*\{\s*action:\s*['\"]([^'\"]+)", html)
action = match.group(1) if match else "verify"

result = solver.recaptcha(
    sitekey=sitekey, url=page_url, version="v3", action=action,
)

Yaygın değerler şunlardır: login, submit, homepage ve checkout, ancak bunlar siteyi kim oluşturduysa onun seçtiği rastgele dizelerdir.

Enterprise v3

Enterprise, ayrı bir ürün değil, dik (orthogonal) bir bayraktır, bu yüzden üstüne eklenir:

result = solver.recaptcha(
    sitekey=sitekey,
    url=page_url,
    version="v3",
    enterprise=1,
    action="submit",
)

Enterprise'ı standarttan, sayfanın yüklediği scriptle ayırt edebilirsiniz. Enterprise şunu çeker enterprise.js, standart şunu çeker: api.js. Yanlış tahmin, hatalı bir token döndürmek yerine çözümün başarısız olmasına neden olur; dolayısıyla kontrol etmek ucuzdur.

Token'ı gönderme

import requests

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

Bazı v3 entegrasyonları farklı bir alan adı kullanır veya token'ı JSON olarak gönderir, çünkü onları kısıtlayacak standart bir form widget'ı yoktur. Bir varsayımda bulunmadan önce sayfanın kendi JavaScript'inin ne yaptığını kontrol edin g-recaptcha-response.

Toplu çözüm

Python, şunun geçerli olduğu tek CapSkip SDK'sıdır: AsyncCapSkip bir takma ad değil, gerçek bir async istemcidir, dolayısıyla gerçekten işleri çakıştırır:

import asyncio
from capskip import AsyncCapSkip

async def main():
    solver = AsyncCapSkip()
    tokens = await asyncio.gather(*[
        solver.recaptcha(sitekey=sitekey, url=u, version="v3", action="submit")
        for u in urls
    ])
    return [t["code"] for t in tokens]

asyncio.run(main())

Hatalar

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

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

Sık sorulan sorular

action'ı atlarsam ne olur?

Varsayılan olarak şudur: verify. Bu, action'ı hiç kontrol etmeyen sitelerde çalışır ve kontrol eden sitelerde başarısız olur. Gerçek değeri sayfadan okumak birkaç satır olduğundan, varsayılana güvenmek yerine bunu yapmaya değer.

Göndermeden önce puanı kontrol edebilir miyim?

Hayır. Skor Google'da kalır ve yalnızca backend'leri token'ı doğruladığında site sahibine açıklanır. İstemci tarafından yalnızca bir token alırsınız, başka hiçbir şey almazsınız; bu yüzden göndermeden önce skoru inceleme veya skora göre filtreleme imkânı yoktur.

Bir v3 token'ı ne kadar süre geçerlidir?

Yaklaşık iki dakika ve tek kullanımlık, tıpkı v2 gibi. Bir havuz oluşturmak yerine, ona ihtiyaç duyan isteğin hemen öncesinde çözün.

Özet

Geçer version="v3", ayarlayın action sayfanın gerçekte kullandığı her neyse ona göre, şunu ekleyin: enterprise=1 sayfa yüklendiğinde enterprise.js, ve token'ı hızlıca gönderin, çünkü yaklaşık iki dakika içinde sona erer.

Diğer diller şurada ele alınmıştır: reCAPTCHA v3 çözücü sayfa, Enterprise ayrıntıları şurada: Enterprise çözücü sayfası ve daha geniş Python yüzeyi şurada: Python CAPTCHA çözücü sayfası. Gerçek bir v3 token'ının oluşturuluşunu şurada izleyebilirsiniz: v3 demosu, ve CapSkip'in kendisi bir sınırsız captcha çözücü yerel olarak çalışır.