İçeriğe geç
DurumPanel

Kılavuzlar

reCAPTCHA v2 görsel tanıma ile tıklama simülasyonu (Selenium)

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.

Bu eğitim, Selenium 4 ile Google’ın reCAPTCHA demo sayfasını açar ve görsel soruyu gerçek bir tarayıcıda çözer: soruyu ve görseli okur, hangi karelere tıklanacağını belirlemesi için reCAPTCHA v2 görsel tanıma (ReCaptchaV2Classification) görev türüne gönderir, ardından tıklamaları simüle eder. Token alma yöntemiyle karşılaştırıldığında doğrulama tarayıcının içinde gerçekten tamamlanır; token geçme oranı düşük olan siteler için uygundur.

Kod yazmak istemiyorsanız aynı arayüzü kullanarak otomatik tıklama yapan tarayıcı eklentisini doğrudan kullanabilirsiniz.

pip install requests selenium pillow
export YESCAPTCHA_CLIENT_KEY=your_client_key

Chrome’un kurulu olması gerekir. Selenium 4, uyumlu chromedriver’ı otomatik indirir.

  1. Onay kutusuna tıklayın. Onay kutusu title="reCAPTCHA" olan iframe’in içindedir; önce bu iframe’e geçin, ardından #recaptcha-anchor öğesine tıklayın.
  2. Soru iframe’ine geçin. Soru, başka bir iframe’in (title değeri “challenge” içeren) içindedir.
  3. Soruyu okuyun. .rc-imageselect-desc-wrapper strong içindeki kalın yazı aranacak hedeftir, örneğin “traffic lights”. Arayüz soru ID’sini ister; karşılık tablosunu kullanarak adı ID’ye çevirin (/m/015qff), bkz. Soru ID’leri. Karşılaştırma için tarayıcı arayüzünü İngilizce kullanmak en kolay yoldur.
  4. Görseli alın. Kareler aslında tek bir büyük görselin parçalarıdır; td.rc-imageselect-tile img öğesinin src değerini indirin. 9 kareli (3x3) görseli 300×300, 16 kareli (4x4) görseli 450×450 boyutuna ölçekleyin ve Base64’e çevirin.
  5. Tanıyın. createTask çağırın; tür ReCaptchaV2Classification, alanlar image ve question. "confidence": 0.5 eklerseniz 3x3 görselde eşleşen tüm kareler tek seferde döner; tıklamadan sonra yenilenen küçük görselleri işlemeniz gerekmez.
  6. Tıklayın. Dönen objects, kare sıra numaralarıdır; 0’dan başlar, soldan sağa ve yukarıdan aşağıya doğru sayılır. İlgili td öğelerine sırayla tıklayın.
  7. Doğrulayın. #recaptcha-verify-button düğmesine tıklayın. Yeni bir soru turu çıkarsa 3. adıma dönün; soru penceresi kapanırsa doğrulama geçilmiştir.
  8. Formu gönderin. Ana sayfaya dönüp gönder düğmesine tıklayın.
recaptcha_click_selenium.py
"""Click through a reCAPTCHA v2 image challenge with Selenium 4 and ReCaptchaV2Classification.
Flow: open the page -> click the checkbox -> read the target name and the grid image ->
ask YesCaptcha which tiles to click -> click them -> press Verify. Repeat if a new challenge appears.
Run: pip install requests selenium pillow
export YESCAPTCHA_CLIENT_KEY=your_client_key
python recaptcha_click_selenium.py
Each recognized image is charged (see the price list). reCAPTCHA's page structure can change;
adjust the selectors below if a step stops working.
"""
import base64
import io
import os
import time
import requests
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
PAGE_URL = "https://www.google.com/recaptcha/api2/demo"
# Target names shown in the challenge (English UI) -> question IDs.
# Full list: https://docs.yescaptcha.com/en/tasks/recaptcha-classification/
QUESTION_IDS = {
"taxis": "/m/0pg52", "bus": "/m/01bjv", "buses": "/m/01bjv", "motorcycles": "/m/04_sv",
"tractors": "/m/013xlm", "chimneys": "/m/01jk_4", "crosswalks": "/m/014xcs",
"traffic lights": "/m/015qff", "bicycles": "/m/0199g", "parking meters": "/m/015qbp",
"cars": "/m/0k4j", "bridges": "/m/015kr", "boats": "/m/019jd", "palm trees": "/m/0cdl1",
"mountains or hills": "/m/09d_r", "fire hydrants": "/m/01pns0", "a fire hydrant": "/m/01pns0",
"stairs": "/m/01lynh",
}
def classify(image_b64, question):
task = {"type": "ReCaptchaV2Classification", "image": image_b64, "question": question, "confidence": 0.5}
data = requests.post(
"https://api.yescaptcha.com/createTask",
json={"clientKey": CLIENT_KEY, "task": task},
timeout=30,
).json()
if data.get("errorId"):
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data["solution"] # synchronous: the solution comes back right away
def grid_image_b64(url, size):
"""Download the challenge image and scale it to the standard size (300 for 3x3, 450 for 4x4)."""
img = Image.open(io.BytesIO(requests.get(url, timeout=30).content)).convert("RGB")
img = img.resize((size, size))
buf = io.BytesIO()
img.save(buf, format="JPEG")
return base64.b64encode(buf.getvalue()).decode()
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 15)
try:
driver.get(PAGE_URL)
# 1. Click the checkbox (inside the "reCAPTCHA" iframe)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, 'iframe[title="reCAPTCHA"]')))
wait.until(EC.element_to_be_clickable((By.ID, "recaptcha-anchor"))).click()
driver.switch_to.default_content()
# 2. Switch to the challenge iframe and solve rounds until it closes
wait.until(EC.frame_to_be_available_and_switch_to_it(
(By.XPATH, '//iframe[contains(@title, "challenge")]')))
for _ in range(5):
target = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, ".rc-imageselect-desc-wrapper strong"))).text.strip().lower()
question = QUESTION_IDS.get(target)
if not question:
print("unsupported target, reloading:", target)
driver.find_element(By.ID, "recaptcha-reload-button").click()
time.sleep(2)
continue
tiles = driver.find_elements(By.CSS_SELECTOR, "td.rc-imageselect-tile")
size = 450 if len(tiles) == 16 else 300
url = driver.find_element(By.CSS_SELECTOR, "td.rc-imageselect-tile img").get_attribute("src")
solution = classify(grid_image_b64(url, size), question)
for index in solution.get("objects", []):
tiles[index].click()
time.sleep(0.3)
time.sleep(1)
driver.find_element(By.ID, "recaptcha-verify-button").click()
time.sleep(3)
driver.switch_to.default_content()
frame = driver.find_element(By.XPATH, '//iframe[contains(@title, "challenge")]')
if not frame.is_displayed(): # challenge closed: passed
break
driver.switch_to.frame(frame)
driver.switch_to.default_content()
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()
  • reCAPTCHA’nın sayfa yapısı güncellenir; koddaki seçiciler çalışmaz hale gelirse gerçek sayfaya göre ayarlayın.
  • Tanınan her görsel için puan düşülür (fiyat için bkz. reCAPTCHA v2 görsel tanıma). Tıklamadan sonra doğrulaması başarısız olan görevleri 1 saat içinde bildirerek puan iadesi talep edebilirsiniz.
  • Karşılık tablosunda olmayan bir soruyla karşılaşırsanız yenile düğmesiyle başka bir soru getirebilir veya desteğe başvurarak ekletebilirsiniz.