# hCaptcha-Bilderkennung per Klick-Simulation (Selenium)

> Mit Python, Selenium 4 und HCaptchaClassification hCaptcha-Aufgaben mit 3×3-Raster im Browser automatisch lösen: Kontrollkästchen anklicken, Frage und 9 Bilder auslesen, die Erkennungs-API aufrufen, klicken und absenden – mit vollständigem Beispielcode.

Source: https://docs.yescaptcha.com/de/guides/hcaptcha-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/hcaptcha-click-selenium/

Diese Anleitung öffnet die Demoseite von hCaptcha mit Selenium 4 und löst die Aufgabe mit dem 3×3-Raster in einem echten Browser: Sie liest die Frage und die 9 Bilder aus, lässt per [hCaptcha-Bilderkennung](https://docs.yescaptcha.com/de/tasks/hcaptcha-classification.md) (`HCaptchaClassification`) bestimmen, welche Felder Treffer sind, und klickt diese an.

hCaptcha kennt außerdem Aufgaben wie „Klicken Sie auf eine bestimmte Stelle“ oder „Ziehen“. Sie liefern Koordinaten statt Rasterfelder; die Vorgehensweise steht unter [hCaptcha-Bilderkennung](https://docs.yescaptcha.com/de/tasks/hcaptcha-classification.md). Wenn Sie keinen Code schreiben möchten, nutzen Sie direkt die [Browser-Erweiterung](https://docs.yescaptcha.com/de/extension.md); sie unterstützt alle diese Aufgabentypen.

## Vorbereitung

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

## Ablauf

1.  **Kontrollkästchen anklicken.** Es befindet sich im hCaptcha-iframe, dessen Adresse `frame=checkbox` enthält. Wechseln Sie in das iframe und klicken Sie `#checkbox` an.
2.  **Zum iframe der Aufgabe wechseln.** Die Aufgabe liegt in dem iframe, dessen Adresse `frame=challenge` enthält.
3.  **Frage auslesen.** Der Text von `.prompt-text` ist die Frage; übergeben Sie ihn unverändert an die API (es empfiehlt sich, die Oberfläche von hCaptcha auf Englisch oder vereinfachtes Chinesisch umzustellen). Wenn neben der Frage ein kleines Beispielbild angezeigt wird, übergeben Sie es ebenfalls in `anchors`.
4.  **Bilder abrufen.** Das Hintergrundbild von `.task-image .image` jedes Feldes ist ein Einzelbild. Laden Sie die Bilder der Reihe nach herunter, wandeln Sie sie in Base64 um und bilden Sie daraus die Liste `queries`.
5.  **Erkennen.** Rufen Sie `createTask` mit dem Typ `HCaptchaClassification` auf. Die zurückgegebenen `objects` entsprechen den Feldern eins zu eins; `true` bedeutet Treffer.
6.  **Klicken und absenden.** Klicken Sie die Treffer-Felder an und dann auf die Schaltfläche zum Absenden. Es können mehrere Runden nacheinander folgen; wiederholen Sie dann die Schritte 3 bis 6.
7.  **Fertig.** Nach bestandener Prüfung steht das Token im Feld `h-captcha-response` auf der Seite; senden Sie es zusammen mit dem Formular ab.

## Vollständiger Code

hcaptcha_click_selenium.py

```python
"""Click through an hCaptcha 3x3 image challenge with Selenium 4 and HCaptchaClassification.

Flow: open the page -> click the checkbox -> read the question and the 9 images ->
ask YesCaptcha which images match -> click them -> submit. Repeat while new rounds appear.

Run:  pip install requests selenium
      export YESCAPTCHA_CLIENT_KEY=your_client_key
      python hcaptcha_click_selenium.py
Each recognized round is charged (see the price list; rounds with no target found are free).
hCaptcha changes its page structure often; adjust the selectors below if a step stops working.
Click and drag questions return coordinates instead; see the HCaptchaClassification page.
"""
import base64
import os
import re
import time

import requests
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://accounts.hcaptcha.com/demo"

def classify(question, images_b64):
    task = {"type": "HCaptchaClassification", "question": question, "queries": images_b64}
    data = requests.post(
        "https://api.yescaptcha.com/createTask",
        json={"clientKey": CLIENT_KEY, "task": task},
        timeout=60,
    ).json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data["solution"]  # synchronous

def background_image_b64(element):
    """The tiles are <div>s with a CSS background image; download it and Base64-encode it."""
    style = element.get_attribute("style") or ""
    match = re.search(r'url\("?(.*?)"?\)', style)
    if not match:
        return None
    return base64.b64encode(requests.get(match.group(1), timeout=30).content).decode()

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 15)
try:
    driver.get(PAGE_URL)

    # 1. Click the checkbox (inside the first hCaptcha iframe)
    wait.until(EC.frame_to_be_available_and_switch_to_it(
        (By.CSS_SELECTOR, 'iframe[src*="hcaptcha"][src*="frame=checkbox"]')))
    wait.until(EC.element_to_be_clickable((By.ID, "checkbox"))).click()
    driver.switch_to.default_content()

    # 2. Solve rounds in the challenge iframe
    wait.until(EC.frame_to_be_available_and_switch_to_it(
        (By.CSS_SELECTOR, 'iframe[src*="hcaptcha"][src*="frame=challenge"]')))
    for _ in range(5):
        question = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".prompt-text"))).text.strip()
        tiles = driver.find_elements(By.CSS_SELECTOR, ".task-image")
        images = [background_image_b64(t.find_element(By.CSS_SELECTOR, ".image")) for t in tiles]
        if not tiles or None in images:
            print("not a 3x3 image challenge; see the docs for click/drag questions")
            break
        solution = classify(question, images)
        for tile, hit in zip(tiles, solution.get("objects", [])):
            if hit:
                tile.click()
                time.sleep(0.3)
        driver.find_element(By.CSS_SELECTOR, ".button-submit").click()
        time.sleep(3)
        if not driver.find_elements(By.CSS_SELECTOR, ".task-image"):
            break

    driver.switch_to.default_content()
    token = driver.find_element(By.NAME, "h-captcha-response").get_attribute("value")
    print("token received" if token else "not passed")
finally:
    driver.quit()
```

## Hinweise

-   Die Seitenstruktur von hCaptcha ändert sich häufig. Wenn die Selektoren im Code nicht mehr funktionieren, passen Sie sie an die tatsächliche Seite an.
-   Jede Erkennungsrunde verursacht einen Punkteabzug; wird kein Treffer erkannt, werden keine Punkte abgezogen. Wurde die Prüfung nach dem Klicken abgelehnt, können Sie dies innerhalb von 1 Stunde [melden](https://docs.yescaptcha.com/de/api/report.md) und eine Erstattung nach Meldung beantragen.
-   Wenn bei einer neuen Frage `ERROR_UNKNOWN_QUESTION` zurückgegeben wird, laden Sie die Seite neu, um eine andere Aufgabe zu erhalten, oder wenden Sie sich an den Support.
