Aller au contenu
ÉtatTableau de bord

Guides

Clic sur hCaptcha par reconnaissance d'images avec Selenium

Cette page a été traduite automatiquement à partir de la version chinoise et peut contenir des erreurs. La version chinoise fait foi.

Ce tutoriel ouvre la page de démonstration de hCaptcha avec Selenium 4 et résout la grille d’images 3×3 dans un vrai navigateur : il lit la question et les 9 images, demande à la reconnaissance d’images hCaptcha (HCaptchaClassification) lesquelles sont des cibles, puis simule les clics.

hCaptcha propose aussi des questions du type « cliquer à un endroit précis » ou « glisser », qui renvoient des coordonnées plutôt que des cases ; consultez la reconnaissance d’images hCaptcha pour les traiter. Si vous ne voulez pas écrire de code, utilisez directement l’extension de navigateur, qui prend en charge tous ces types de questions.

pip install requests selenium
export YESCAPTCHA_CLIENT_KEY=your_client_key
  1. Cliquez sur la case. La case se trouve dans l’iframe hCaptcha dont l’URL contient frame=checkbox ; passez dans cette iframe et cliquez sur #checkbox.
  2. Passez à l’iframe de la question. La question se trouve dans l’iframe dont l’URL contient frame=challenge.
  3. Lisez la question. Le texte de .prompt-text est la question ; transmettez-la telle quelle à l’API (il est recommandé de régler la langue de l’interface hCaptcha sur le chinois simplifié ou l’anglais). Si une petite image d’exemple s’affiche à côté de la question, ajoutez-la aussi dans anchors.
  4. Récupérez les images. Le fond de .task-image .image de chaque case est une petite image ; téléchargez-les dans l’ordre, convertissez-les en Base64 et construisez la liste queries.
  5. Reconnaissance. Appelez createTask avec le type HCaptchaClassification. Les objects renvoyés correspondent un à un aux cases ; true indique une cible.
  6. Cliquez et validez. Cliquez sur les cases cibles, puis sur le bouton de validation. Plusieurs tours peuvent se suivre ; répétez alors les étapes 3 à 6.
  7. Terminé. Une fois la vérification réussie, le champ h-captcha-response de la page contient le token ; envoyez-le avec le formulaire.
hcaptcha_click_selenium.py
"""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()
  • La structure des pages hCaptcha change souvent ; si les sélecteurs du code ne fonctionnent plus, adaptez-les à la page réelle.
  • Chaque tour de reconnaissance entraîne un débit de points ; un tour sans cible reconnue n’est pas débité. Si la vérification échoue après les clics, vous pouvez la signaler dans un délai d’1 heure pour demander un remboursement après signalement.
  • Si une nouvelle question renvoie ERROR_UNKNOWN_QUESTION, actualisez la page pour obtenir une autre question, ou contactez le support.