Çözülmüş bir token gönderirken uygulama çerezlerini koruyun

solvethree tarafından3 dk okuma

Çözülmüş bir reCAPTCHA token'ı, uygulamanın oturum çerezlerinin veya CSRF değerinin yerini almaz. Formu aynı requests.Session üzerinden alın ve gönderin; böylece POST, GET sırasında alınan çerezleri korur.

Her iki uygulama isteğinde de çözücünün döndürdüğü tarayıcı başlıklarını ve aynı proxy'yi kullanın. Örnek, form açılmadan önce bu başlıkların kullanılabilir olması için önce çözüm üretir.

Bu sayfada

Formun GET ve POST isteklerini tek oturumda tutun

requests ve resmî solvethree Python SDK'sı kurulu olan Python 3.10+ kullanın. Hedef ana makine adı için çalışma alanınızda etkin bir profil bulunmalıdır; bir görevde ana makine adını göndermek profil oluşturmaz. Yapılandırılmamışsa site profili kurulumuna bakın.

  • TARGET_URL değerini uygulamanızın form URL'si olarak ayarlayın. Size ait bu demoda GET ve POST için aynı URL kullanılır.
  • SOLVETHREE_PROXY değerini, çözümde ve her iki uygulama isteğinde kullanılan tek proxy olarak ayarlayın.
  • SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarı olarak ayarlayın. Bu kodu sunucu tarafında çalıştırın.
requests.Session · uygulama çerezlerini ve bir CSRF değerini koruma
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree

class FormParser(HTMLParser):
    csrf = None
    def handle_starttag(self, tag, attributes):
        values = dict(attributes)
        if tag == "input" and values.get("name") == "csrf_token":
            self.csrf = values.get("value")

target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
    session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
    proxies = {"http": proxy, "https": proxy}
    page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
    page.raise_for_status()
    parser = FormParser(); parser.feed(page.text)
    if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
    response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
        data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
    print("Application HTTP status:", response.status_code)
    # Use the actual form's submit URL, fields and session rules. Inspect its result.

SDK'nın solve çağrısı görevi oluşturur ve görev hazır olana veya bir istisna oluşana kadar durumunu sorgular. Ardından örnek, solution.userAgent ve solution.secChUa değerlerini oturuma uygular. GET, oturumun çerez deposunu doldurur; POST bu depoyu yeniden kullanır ve solution.token değerini formdan ayrıştırılan CSRF değeriyle birlikte gönderir.

Demonun login eylemini, gönderim URL'sini ve form alanlarını uygulamanıza uyacak şekilde değiştirin. csrf_token, bu formun alan adıdır; solvethree gereksinimi değildir. Formunuz başka bir ad veya yapı kullanıyorsa HTML ayrıştırıcısını uyarlayın ve giriş bilgileri gibi diğer zorunlu alanları da ekleyin. Gönderim URL'si form URL'sinden farklı olsa da aynı oturumu kullanın.

Uygulama POST isteğini reddederse

Yazdırılan HTTP durumu bir başlangıç noktasıdır; girişin başarılı olduğunun kanıtı değildir. Başka bir çözüm için ödeme yapmadan önce uygulamanın yanıtını ve giden isteği inceleyin. Hazır bir görev, bir çözüm üretildiği anlamına gelir; gönderimi kabul edip etmeyeceğine yine uygulama karar verir.

CSRF girdi alanı bulunamıyor.

GET yanıtının durumunu ve gövdesini kontrol edin. Yönlendirmeleri izleme devre dışıdır, dolayısıyla bir yönlendirme yanıtı beklenen form değildir.

Şunu deneyin: Doğru formu aynı oturum üzerinden bilinçli olarak alın, ardından ayrıştırıcıyı formun gerçek CSRF alanına göre uyarlayın.

Uygulama, eksik oturum veya geçersiz CSRF değeri bildiriyor.

GET'in çerez alıp almadığını, POST'un ilgili çerezleri gönderip göndermediğini ve CSRF değerinin o form yanıtından gelip gelmediğini kontrol edin.

Şunu deneyin: Her iki isteği de aynı requests.Session içinde tutun. Formu bir istemciyle alıp başka bir istemciyle göndermeyin.

Uygulama CAPTCHA'yı reddediyor.

Giden token alanını, eylemi, proxy'yi, User-Agent ve sec-ch-ua değerlerini inceleyin. Görev kimliği veya eski bir token yerine solution.token gönderdiğinizi doğrulayın.

Şunu deneyin: Güncel token'ı, çözümde kullanılan proxy'yi ve döndürülen tarayıcı başlıklarını kullanın. Token'ın süresi dolmuşsa veya daha önce değerlendirilmişse gönderime yakın bir zamanda yenisini alın.

POST tamamlanıyor, ancak giriş gerçekleşmiyor.

Yanıt gövdesini, varsa yönlendirme hedefini, gerçek gönderim URL'sini ve zorunlu form alanlarını inceleyin.

Şunu deneyin: Demonun form verilerini uygulamanın beklediği yapıya uyarlayın. CAPTCHA token'ı, kimlik bilgilerini veya uygulamanın eksik olan diğer alanlarını sağlamaz.

İlk görevinizi çalıştırın.

$5 çalışma alanı kredisiyle başlayın.

Çalışma alanı oluşturun
Çözülmüş bir token gönderirken uygulama çerezlerini koruyun · solvethree