Çözülmüş bir token gönderirken uygulama çerezlerini koruyun
Çö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_URLdeğ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_PROXYdeğerini, çözümde ve her iki uygulama isteğinde kullanılan tek proxy olarak ayarlayın.SOLVETHREE_API_KEYdeğerini çalışma alanınızın API anahtarı olarak ayarlayın. Bu kodu sunucu tarafında çalıştırın.
# 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.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.