İçeriğe geç
DurumPanel

Kılavuzlar

reCAPTCHA için token gönderme

Bu sayfa Çince sürümden makine çevirisiyle hazırlanmıştır ve hatalar içerebilir. Geçerli olan Çince sürüm sürümüdür.

YesCaptcha’nın döndürdüğü gRecaptchaResponse, CAPTCHA’yı tamamladıktan sonra Google’ın sayfaya verdiği sonuçla aynı değerdir. Bunu aldıktan sonra, tıpkı bir tarayıcı gibi hedef siteye göndermeniz gerekir (Google’a veya YesCaptcha’ya değil); site token’ı Google ile doğrular ve geçişe izin verir. İki yol vardır: isteği doğrudan kendiniz göndermek veya gerçek bir tarayıcıda token’ı sayfaya yazıp göndermek.

Normal akış:

  1. Sayfa reCAPTCHA’yı yükler ve kullanıcı doğrulamayı tamamlar;
  2. Google sayfaya bir token verir; sayfa bunu g-recaptcha-response metin kutusuna yazar (veya callback fonksiyonuna iletir);
  3. Kullanıcı formu gönderir, token form ile birlikte sitenin sunucusuna gider;
  4. Sitenin sunucusu token’ı Google ile doğrular, geçerliyse geçişe izin verir.

YesCaptcha ile 1. ve 2. adımları biz yaparız: websiteURL ve websiteKey ile bir görev oluşturur, token’ı alır ve 3. adımdan devam edersiniz.

  1. Tarayıcıda bir kez normal şekilde işlem yapın: F12 ile Network panelini açın, CAPTCHA’yı tamamlayıp formu gönderin ve formu gönderen isteği bulun.
  2. İsteğin Payload (veya Form Data) bölümünde token’ı taşıyan alanı bulun; genellikle g-recaptcha-response adını taşır ve token 03A ile başlar. Bazı siteler adı değiştirir, örneğin grecaptcharesponse, captcha.
  3. Programınızdan aynı isteği gönderin ve bu alanın değerini YesCaptcha’nın döndürdüğü token ile değiştirin. Diğer alanlar, Cookie’ler ve istek başlıkları da tarayıcıdakiyle aynı olmalıdır; siteler çoğunlukla bunları da kontrol eder.

Google demo sayfası için eksiksiz örnek: önce çözüm alınır, ardından token g-recaptcha-response alanıyla demo sayfasına geri gönderilir:

recaptcha_requests.py
"""Solve reCAPTCHA v2 on Google's demo page and submit the token with plain HTTP (no browser).
Run: pip install requests
export YESCAPTCHA_CLIENT_KEY=your_client_key
python recaptcha_requests.py
Each run creates one NoCaptchaTaskProxyless task (charged per the price list).
"""
import os
import time
import requests
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
API = "https://api.yescaptcha.com"
WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"
WEBSITE_KEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
def call(method, payload):
data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json()
if data.get("errorId"):
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data
def get_token():
task = {"type": "NoCaptchaTaskProxyless", "websiteURL": WEBSITE_URL, "websiteKey": WEBSITE_KEY}
task_id = call("createTask", {"task": task})["taskId"]
for _ in range(36): # poll every 5 seconds, for up to about 3 minutes
time.sleep(5)
result = call("getTaskResult", {"taskId": task_id})
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
raise TimeoutError(task_id)
token = get_token()
print("token:", token[:40], "...")
# Submit the token the same way the browser does: the demo form posts the field
# "g-recaptcha-response" back to the page. Check your own site's request in DevTools > Network.
page = requests.post(WEBSITE_URL, data={"g-recaptcha-response": token}, timeout=30)
print("passed" if "Verification Success" in page.text else "not passed", page.status_code)

Selenium, Playwright gibi araçlarla gerçek bir tarayıcıyı yönetirken:

  1. Sayfadan data-sitekey değerini okuyun, bununla görev oluşturup token’ı alın.
  2. Token’ı sayfadaki g-recaptcha-response metin kutusuna yazın.
  3. Sayfada bir callback fonksiyonu tanımlıysa (data-callback="..."), token’ı vererek çağırın; bazı sitelerde gönder düğmesi ancak callback çağrıldıktan sonra tıklanabilir hale gelir.
  4. Formu gönderin.
// Step 2: write the token (run in the page)
document.getElementById('g-recaptcha-response').value = 'TOKEN';
// Step 3: call the callback if there is one, e.g. data-callback="onSuccess"
onSuccess('TOKEN');

Sayfada birden fazla reCAPTCHA varsa metin kutusunun id’si g-recaptcha-response-1 gibi olabilir. Bu metin kutusunu bulamazsanız önce doğrulamayı elle bir kez tamamlayın, Elements panelinde 03A araması yapın ve sonucun nereye yazıldığına bakın. Callback fonksiyonunun nasıl bulunacağı için bkz. reCAPTCHA parametrelerini bulma.

Eksiksiz örnek (Selenium 4):

recaptcha_selenium.py
"""Solve reCAPTCHA v2 on Google's demo page in a real browser with Selenium 4:
get a token from YesCaptcha, put it into the page, then submit the form.
Run: pip install requests selenium
export YESCAPTCHA_CLIENT_KEY=your_client_key
python recaptcha_selenium.py
Each run creates one NoCaptchaTaskProxyless task (charged per the price list).
"""
import os
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
API = "https://api.yescaptcha.com"
WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"
def call(method, payload):
data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json()
if data.get("errorId"):
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data
def get_token(website_url, website_key):
task = {"type": "NoCaptchaTaskProxyless", "websiteURL": website_url, "websiteKey": website_key}
task_id = call("createTask", {"task": task})["taskId"]
for _ in range(36):
time.sleep(5)
result = call("getTaskResult", {"taskId": task_id})
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
raise TimeoutError(task_id)
driver = webdriver.Chrome() # Selenium 4 downloads a matching chromedriver automatically
try:
driver.get(WEBSITE_URL)
site_key = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
token = get_token(WEBSITE_URL, site_key)
# Put the token where reCAPTCHA keeps it ...
driver.execute_script(
"document.getElementById('g-recaptcha-response').value = arguments[0];", token
)
# ... and, if the page uses a callback (data-callback="..."), call it:
callback = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-callback")
if callback:
driver.execute_script(f"window[{callback!r}](arguments[0]);", token)
driver.find_element(By.ID, "recaptcha-demo-submit").click()
time.sleep(2)
print("passed" if "Verification Success" in driver.page_source else "not passed")
finally:
driver.quit()

v3’te onay kutusu yoktur; sayfa token’a ihtiyaç duyduğunda grecaptcha.execute(site anahtarı, {action: '...'}) çağırır ve token’ı kendi isteğine koyar (alan adını site belirler; yaygın olanlar g-recaptcha-response, token, recaptchaToken). Yöntem 1 ile aynı şekilde ilerleyin: Network panelinde token taşıyan isteği bulup aynısını gönderin; görev oluştururken pageAction sayfadaki action ile aynı olmalıdır.

  • Token’ın süresi dolmuştur: aldıktan sonra hemen gönderin, 60 saniyeyi geçirmeyin.
  • Sitenin kontrol ettiği alanı göndermemişsinizdir veya başka alanları ya da Cookie’leri atlamışsınızdır: tarayıcıdaki istekle alan alan karşılaştırın.
  • Site IP, User-Agent gibi bilgileri de kontrol ediyordur: kendi proxy’nizi kullanan bir tür (örneğin NoCaptchaTask) seçin ve gönderimi aynı proxy üzerinden yapın.
  • v3 skoru yetersizdir: pageAction değerini doğrulayın veya sabit yüksek skorlu bir tür kullanın, bkz. reCAPTCHA v3.
  • Sitenin risk kontrolü başka davranış sinyallerine de bakar. Token yöntemiyle geçiş oranı düşükse görsel tanıma ile gerçek tarayıcıda tıklama yapabilir veya tarayıcı eklentisini kullanabilirsiniz.