Anleitungen
reCAPTCHA-v2-Bilderkennung: Klicks simulieren mit Selenium
Diese Seite wurde maschinell aus der chinesischen Version übersetzt und kann Fehler enthalten. Maßgeblich ist die chinesische Version.
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 (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. Sie klickt automatisch über dieselbe API.
Vorbereitung
Abschnitt betitelt „Vorbereitung“pip install requests selenium pillowexport YESCAPTCHA_CLIENT_KEY=your_client_keyChrome muss installiert sein. Selenium 4 lädt den passenden chromedriver automatisch herunter.
- Kontrollkästchen anklicken. Es befindet sich im iframe mit
title="reCAPTCHA". Wechseln Sie zuerst in dieses iframe und klicken Sie#recaptcha-anchoran. - In das iframe der Aufgabe wechseln. Die Aufgabe liegt in einem anderen iframe (title enthält “challenge”).
- Frage auslesen. Der fett gesetzte Text in
.rc-imageselect-desc-wrapper strongist 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. Für den Abgleich ist die englische Browseroberfläche am bequemsten. - Bild abrufen. Die Bilder in den Feldern sind in Wirklichkeit Ausschnitte eines einzigen großen Bildes. Laden Sie das
srcvontd.rc-imageselect-tile imgherunter. Skalieren Sie 9 Felder (3x3) auf 300×300 und 16 Felder (4x4) auf 450×450 und wandeln Sie das Bild in Base64 um. - Erkennen. Rufen Sie
createTaskmit dem TypReCaptchaV2Classificationauf und übergeben Sieimageundquestion. Mit"confidence": 0.5liefert 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. - Klicken.
objectsenthält die Feldnummern, beginnend bei 0, von links nach rechts und von oben nach unten. Klicken Sie die entsprechendentd-Elemente nacheinander an. - Prüfen. Klicken Sie
#recaptcha-verify-buttonan. Erscheint eine neue Runde, gehen Sie zurück zu Schritt 3. Schließt sich das Aufgabenfenster, ist die Prüfung bestanden. - Formular absenden. Kehren Sie zur Hauptseite zurück und klicken Sie auf die Schaltfläche zum Absenden.
Vollständiger Code
Abschnitt betitelt „Vollständiger Code“"""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.pyEach recognized image is charged (see the price list). reCAPTCHA's page structure can change;adjust the selectors below if a step stops working."""import base64import ioimport osimport time
import requestsfrom PIL import Imagefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom 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
Abschnitt betitelt „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). Aufgaben, deren Verifizierung nach dem Klicken fehlgeschlagen ist, können Sie innerhalb von 1 Stunde melden, 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.