Python'da GeeTest v3 Nasıl Çözülür ve Geri Gönderilir

solve geetest in python - How to Solve GeeTest v3 in Python and Post It Back

Çoğu CAPTCHA kodu, bir token girer bir token çıkar varsayar. GeeTest bunu bozar. Bir çözüm şunu döndürür: üç birlikte gönderilmesi gereken değerler ve beslediğiniz doğrulama (challenge), onu getirdikten yaklaşık altmış saniye sonra sona erer. Bunların ikisi de insanları şaşırtır ve hiçbiri yardımcı bir mesajla başarısız olmaz.

Farklı davranan iki girdi

DeğerÖmür boyu
gtSite için statiktir. Serbestçe önbelleğe alın
challengeTek kullanımlık, yaklaşık 60 saniyede ölür

İkisi de sitenin’ kendi GeeTest init endpoint'inden gelir. gt fiilen bir site tanımlayıcısıdır. challenge deneme başınadır ve onu yeniden kullanılabilir olarak ele almak, bir GeeTest entegrasyonunun test aşamasında çalışıp yük altında dağılmasının açık ara en yaygın nedenidir.

Kurulum

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

solver = CapSkip(
    host="127.0.0.1",
    port=8080,
    recaptchaTimeout=300,   # GeeTest uses this, not defaultTimeout
)

Bu timeout ayrımını gözden kaçırmak kolaydır. defaultTimeout yalnızca görüntü CAPTCHA'larını yönetir; etkileşimli olan her şey şunu kullanır: recaptchaTimeout.

Çözme

result = solver.geetest(
    gt="81388ea1fc187e0c335c0a8907ff2625",
    challenge="7cf6a8b1a2c34d5e6f7089abcdef0123",
    url="https://example.com/login",
)

print(result["challenge"])
print(result["validate"])
print(result["seccode"])

Bu üç anahtar cevaptır. result["code"] da doldurulur, ancak GeeTest için gönderebileceğiniz bir şey yerine ham JSON dizesini tutar; dolayısıyla alışkanlıktan ona uzanmak kafa karıştırıcı bir başarısızlık üretir.

Şunu kullanın: challenge gönderdiğiniz değil, geri gelen. Bunlar her zaman aynı değer değildir.

Tüm akış, tek bir yerde

Getirme ve çözme birbirine bitişik olmalıdır. Aralarındaki herhangi bir yavaşlık sürenin dolması riskini doğurur:

import time
import requests
from capskip import CapSkip

solver = CapSkip()
LOGIN = "https://example.com/login"

# 1. Fresh pair, cache-busted. Cached init responses hand back dead challenges.
init = requests.get(
    "https://example.com/geetest/init",
    params={"t": int(time.time() * 1000)},
).json()

# 2. Solve immediately. Do not queue this.
result = solver.geetest(gt=init["gt"], challenge=init["challenge"], url=LOGIN)

# 3. Post all three together, alongside the real form fields.
response = requests.post(LOGIN, data={
    "geetest_challenge": result["challenge"],
    "geetest_validate": result["validate"],
    "geetest_seccode": result["seccode"],
    "username": "...",
    "password": "...",
})

Önbellek kırma zaman damgası göründüğünden daha önemlidir. GeeTest init uç noktaları genellikle bir CDN veya proxy tarafından önbelleğe alınır ve önbelleğe alınmış bir yanıt size zaten kullanılmış bir challenge verir.

O üç alan adı, olağan GeeTest v3 kuralıdır, ancak bir site bunları yeniden adlandırabilir. Varsaymadan önce gerçek formu kontrol edin.

Aynı anda birkaç tanesini yapma

Buradaki tuzak, hatalı toplu işlemedir. Bir yığın doğrulamayı alıp sonra hepsini çözmek, sonrakilerin sıraları gelmeden geçerliliğini yitirmesini garanti eder. Aynı görev içinde alıp çözün:

import asyncio
from capskip import AsyncCapSkip

async def solve_one(solver, url):
    init = await fetch_pair(url)          # your own fetch, awaited
    return await solver.geetest(
        gt=init["gt"], challenge=init["challenge"], url=url,
    )

async def main():
    solver = AsyncCapSkip()
    return await asyncio.gather(*[solve_one(solver, u) for u in urls])

asyncio.run(main())

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 bu gerçekten çözümleri paralel çalıştırır.

Başarısız olduğunda

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

try:
    result = solver.geetest(gt=gt, challenge=challenge, url=page_url)
except ValidationException:
    pass   # missing gt or challenge
except NetworkException:
    pass   # CapSkip is not running
except ApiException:
    pass   # usually a challenge that expired before the solve finished
except TimeoutException:
    pass   # exceeded recaptchaTimeout

Pratikte çoğu GeeTest hatası şu şekilde gelir: ApiException ve doğrulamanın öldüğü anlamına gelir. Çözüm, aynı çiftle yeniden denemek değil, daha sonra almaktır; çünkü tükenmiş bir doğrulama asla yeniden geçerli olmaz.

Sık sorulan sorular

result[“code”] neden kullanılabilir değil?

Çünkü yanıt bir yerine üç değerdir. code eksiksizlik için ham JSON'u korurken, SDK yararlı kısımları şuraya genişletir: challenge, validate ve seccode. O üçünü gönderin.

challenge'ı çalıştırmalar arasında önbelleğe alabilir miyim?

Hayır. Tek kullanımlıktır ve yaklaşık bir dakikada sona erer. gt önbelleğe alınması güvenlidir; doğrulama ise asla değildir.

Bu, GeeTest v4'ü kapsıyor mu?

The geetest yöntemi v3'ü hedefler, şunun etrafında kurulan kaydırma bulmacası: gt ve challenge çift. v4 parametre modelini değiştirdi, bu yüzden geçerli olanı kontrol edin API dokümantasyonu aynı çağrının geçerli olduğunu varsaymadan önce.

Özet

Getir gt ve challenge cache-busted bir istekle çözmeden hemen önce, şunu çağırın geetest, ardından gönderin challenge, validate ve seccode birlikte. Girdinizi değil, dönen doğrulamayı kullanın ve doğrulama almayı asla çözümden önce toplu olarak yapmayın.

Diğer diller şuradadır: GeeTest çözücü sayfası, daha geniş Python yüzeyi şurada: Python CAPTCHA çözücü sayfası ve bizim üzerimizde canlı bir bulmaca var GeeTest v3 demosu. CapSkip şunları işler: captcha atlatma yerel olarak, böylece çözüm hacmi ücretsizdir.