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.
Préparation
Section intitulée « Préparation »pip install requests seleniumexport YESCAPTCHA_CLIENT_KEY=your_client_key- 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. - Passez à l’iframe de la question. La question se trouve dans l’iframe dont l’URL contient
frame=challenge. - Lisez la question. Le texte de
.prompt-textest 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 dansanchors. - Récupérez les images. Le fond de
.task-image .imagede chaque case est une petite image ; téléchargez-les dans l’ordre, convertissez-les en Base64 et construisez la listequeries. - Reconnaissance. Appelez
createTaskavec le typeHCaptchaClassification. Lesobjectsrenvoyés correspondent un à un aux cases ;trueindique une cible. - 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.
- Terminé. Une fois la vérification réussie, le champ
h-captcha-responsede la page contient le token ; envoyez-le avec le formulaire.
Code complet
Section intitulée « Code complet »"""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.pyEach 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 base64import osimport reimport time
import requestsfrom 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://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()Remarques
Section intitulée « Remarques »- 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.