Перейти к содержимому
СтатусПанель

Руководства

Имитация кликов для hCaptcha через Selenium

Эта страница переведена с китайской версии машинным переводом и может содержать ошибки. Приоритет имеет китайская версия.

В этом руководстве Selenium 4 открывает демонстрационную страницу hCaptcha и проходит задание с сеткой 3×3 в настоящем браузере: считывает вопрос и 9 изображений, передаёт их в распознавание изображений hCaptcha (HCaptchaClassification), чтобы определить, какие из них целевые, и затем имитирует клики.

В hCaptcha есть и другие типы заданий, например «кликнуть в указанном месте» или «перетащить»: они возвращают координаты, а не номера ячеек. Как их обрабатывать, описано в разделе распознавание изображений hCaptcha. Если писать код не хочется, воспользуйтесь расширением браузера: оно поддерживает все эти типы заданий.

pip install requests selenium
export YESCAPTCHA_CLIENT_KEY=your_client_key
  1. Кликните по чекбоксу. Чекбокс находится в iframe hCaptcha, в адресе которого есть frame=checkbox. Переключитесь в него и кликните по #checkbox.
  2. Переключитесь на iframe с заданием. Само задание находится в iframe, в адресе которого есть frame=challenge.
  3. Прочитайте вопрос. Текст в .prompt-text — это вопрос; передайте его в API без изменений (рекомендуется переключить язык интерфейса hCaptcha на упрощённый китайский или английский). Если рядом с вопросом есть маленькое пример изображения, добавьте его в anchors.
  4. Получите изображения. Фоновое изображение каждой ячейки .task-image .image — это одна картинка. Скачайте их по порядку, преобразуйте в Base64 и составьте список queries.
  5. Распознайте. Вызовите createTask с типом HCaptchaClassification. Элементы objects в ответе соответствуют ячейкам один к одному, true означает целевую ячейку.
  6. Кликните и отправьте. Кликните по целевым ячейкам и нажмите кнопку отправки. Может последовать несколько раундов подряд — повторяйте шаги с 3 по 6.
  7. Готово. После прохождения проверки в поле h-captcha-response на странице появится токен; отправьте его вместе с формой.
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()
  • Структура страницы hCaptcha часто меняется. Если селекторы в коде перестали работать, подстройте их под актуальную страницу.
  • За каждый раунд распознавания списываются баллы; если целевые ячейки не найдены, баллы не списываются. Если после кликов проверка не пройдена, в течение 1 часа можно сообщить о неверном результате и запросить возврат баллов после жалобы.
  • Если для нового вопроса возвращается ERROR_UNKNOWN_QUESTION, обновите страницу, чтобы получить другое задание, или обратитесь в поддержку.