# reCAPTCHA-v2-Bilderkennung: Klicks simulieren mit Selenium

> Mit Python, Selenium 4 und ReCaptchaV2Classification reCAPTCHA-v2-Bildaufgaben im Browser automatisch anklicken: Captcha auslösen, Frage und Bild auslesen, Erkennungs-API aufrufen, Felder anklicken, absenden; vollständiger Beispielcode.

Source: https://docs.yescaptcha.com/de/guides/recaptcha-click-selenium/ · Last verified: 2026-10-15

> This page was machine-translated from the Chinese version. If anything differs, the Chinese version prevails: https://docs.yescaptcha.com/zh/guides/recaptcha-click-selenium/

Diese Anleitung öffnet mit Selenium 4 die reCAPTCHA-Demoseite von Google und löst die Bildaufgabe in einem echten Browser: Sie liest Frage und Bild aus, lässt von der [reCAPTCHA-v2-Bilderkennung](https://docs.yescaptcha.com/de/tasks/recaptcha-classification.md) (`ReCaptchaV2Classification`) bestimmen, welche Felder anzuklicken sind, und klickt diese an. Anders als beim Abruf eines Tokens wird die Prüfung im Browser selbst abgeschlossen. Das eignet sich für Websites, auf denen Tokens selten akzeptiert werden.

Wenn Sie keinen Code schreiben möchten, nutzen Sie direkt die [Browser-Erweiterung](https://docs.yescaptcha.com/de/extension.md). Sie klickt automatisch über dieselbe API.

## Vorbereitung

```bash
pip install requests selenium pillow
export YESCAPTCHA_CLIENT_KEY=your_client_key
```

Chrome muss installiert sein. Selenium 4 lädt den passenden chromedriver automatisch herunter.

## Ablauf

1.  **Kontrollkästchen anklicken.** Es befindet sich im iframe mit `title="reCAPTCHA"`. Wechseln Sie zuerst in dieses iframe und klicken Sie `#recaptcha-anchor` an.
2.  **In das iframe der Aufgabe wechseln.** Die Aufgabe liegt in einem anderen iframe (title enthält “challenge”).
3.  **Frage auslesen.** Der fett gesetzte Text in `.rc-imageselect-desc-wrapper strong` ist das gesuchte Ziel, zum Beispiel “traffic lights”. Die API erwartet die Fragen-ID. Wandeln Sie den Namen mithilfe der Zuordnungstabelle in eine ID um (`/m/015qff`), siehe [Fragen-IDs](https://docs.yescaptcha.com/de/tasks/recaptcha-classification.md). Für den Abgleich ist die englische Browseroberfläche am bequemsten.
4.  **Bild abrufen.** Die Bilder in den Feldern sind in Wirklichkeit Ausschnitte eines einzigen großen Bildes. Laden Sie das `src` von `td.rc-imageselect-tile img` herunter. Skalieren Sie 9 Felder (3x3) auf 300×300 und 16 Felder (4x4) auf 450×450 und wandeln Sie das Bild in Base64 um.
5.  **Erkennen.** Rufen Sie `createTask` mit dem Typ `ReCaptchaV2Classification` auf und übergeben Sie `image` und `question`. Mit `"confidence": 0.5` liefert die API bei 3x3-Bildern alle passenden Felder auf einmal zurück, sodass Sie die nach dem Klick neu eingeblendeten kleinen Bilder nicht mehr verarbeiten müssen.
6.  **Klicken.** `objects` enthält die Feldnummern, beginnend bei 0, von links nach rechts und von oben nach unten. Klicken Sie die entsprechenden `td`\-Elemente nacheinander an.
7.  **Prüfen.** Klicken Sie `#recaptcha-verify-button` an. Erscheint eine neue Runde, gehen Sie zurück zu Schritt 3. Schließt sich das Aufgabenfenster, ist die Prüfung bestanden.
8.  **Formular absenden.** Kehren Sie zur Hauptseite zurück und klicken Sie auf die Schaltfläche zum Absenden.

## Vollständiger Code

recaptcha_click_selenium.py

```python
"""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()
```

## Hinweise

-   Die Seitenstruktur von reCAPTCHA ändert sich von Zeit zu Zeit. Wenn die Selektoren im Code nicht mehr funktionieren, passen Sie sie an die tatsächliche Seite an.
-   Jede Erkennung eines Bildes verursacht einen Punkteabzug (Preise siehe [reCAPTCHA-v2-Bilderkennung](https://docs.yescaptcha.com/de/tasks/recaptcha-classification.md)). Aufgaben, deren Verifizierung nach dem Klicken fehlgeschlagen ist, können Sie innerhalb von 1 Stunde [melden](https://docs.yescaptcha.com/de/api/report.md), um eine Erstattung nach Meldung zu beantragen.
-   Wenn eine Frage nicht in der Zuordnungstabelle enthalten ist, klicken Sie auf die Schaltfläche zum Neuladen, um eine andere Aufgabe zu erhalten, oder bitten Sie den Support, sie zu ergänzen.
