Если вы в теме автоматизации и следите за трендами, то вероятно обратили внимание, что с определенного момента стали возникать сложности с распознаванием hCaptcha. Ну как сложности - несколько крупных сервисов распознавания капчи, типа 2captcha удалили из своей документации упоминание о распознавании, да и наличие тематичных твитов в твиттере по этому поводу (и официальных ответов от сервиса) подтверждает мое предположение, что что-то произошло… Давайте разбираться, что случилось, почему 2captcha больше не решает hcaptcha и каким боком в распознавании hcaptcha - solvecaptcha?


Судя по тому. что вопросики не только к 2капче, но и к Капсолверу - есть ощущение, что кто-то кому то позвонил (может написал) и попросил не делать так больше (читай - не распознавайте нашу капчу). С чем связано сие можно только гадать, но мое малостраничное прошлое наталкивает на одну версию - претензия. В любом случае решения как обойти hcaptcha на указанных выше сайтах нет, но потребность то в распознавании никуда не делась, правда?

Остались ли варианты как обойти hcaptcha в отсутствие крупных игроков?
На самом деле проблема с распознаванием hcaptcha существовала и тогда, когда указанные сервисы предоставляли решение этой капчи. Сама капча довольно проблематична, у нее несколько вариантов сложности, каждая из которых имеет свои дополнительные параметры, и способы проверки, которые усложняют процесс распознавания.
Соответственно, простые автоматические сервисы распознавания hcaptcha имеют не самый высокий процент обхода (его еще называют пробив - но это скорее про сервисы, которые были популярны на заре 20-х годов).
Что такое hcaptcha которую все так хотят обойти
Совсем коротко для тех, кто совсем не в теме о чем вообще идет речь! Hcaptcha это такой аналог reCaptcha который, если не всматриваться в детали и что находится под капотом, не сильно то от нее и отличается. Используют примерно те же самые способы обхода, примерно те же задачи и способы идентификации, отличие в серверах, которые аутентифицируют токен при решении, ну и сложность заданий у hCaptcha выше (по крайней мере ее самая сложная версия точно). Так что hcaptcha это такая усложненная версия reCaptcha или reCaptcha на максималках.
Практическая реализация распознавания hcaptcha
Не буду утомлять вас долгими рассуждениями, что и как я искал, какие сервисы перепробовал - перейдем сразу к сути, решение найдено (как говориться, найдено и найдено, че бубнить как)… Вернее возрождено. Я взял старый способ, который когда-то использовал для распознавания hcaptcha немного его докрутил и вот какой скрипт у меня получился.
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Конфигурация API и целевой URL
API_KEY = "Your API-Key"
PAGEURL = "URL"
def solve_hcaptcha(sitekey):
# Шаг 1: Отправляем запрос для получения captcha_id с динамическим sitekey
in_url = "https://api.solvecaptcha.com/in.php"
payload = {
'key': API_KEY,
'method': 'hcaptcha',
'sitekey': sitekey,
'pageurl': PAGEURL,
'json': 1
}
response = requests.post(in_url, data=payload)
result = response.json()
if result.get("status") != 1:
print("Ошибка при отправке запроса:", result.get("request"))
return None
captcha_id = result.get("request")
print("Получен captcha_id:", captcha_id)
# Шаг 2: Опрос решения капчи
res_url = "https://api.solvecaptcha.com/res.php"
while True:
params = {
'key': API_KEY,
'action': 'get',
'id': captcha_id,
'json': 1
}
res = requests.get(res_url, params=params)
data = res.json()
if data.get("status") == 1:
print("Капча успешно решена!")
return data # Ответ содержит токен и useragent
elif data.get("request") == "CAPCHA_NOT_READY":
print("Капча ещё не готова, ждем 5 секунд...")
time.sleep(5)
else:
print("Ошибка получения решения:", data.get("request"))
return None
def set_captcha_token(driver, token):
# Поиск или создание скрытых полей для hCaptcha и reCaptcha
try:
driver.find_element(By.NAME, "h-captcha-response")
except Exception:
driver.execute_script("""
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'h-captcha-response';
document.body.appendChild(input);
""")
try:
driver.find_element(By.NAME, "g-recaptcha-response")
except Exception:
driver.execute_script("""
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'g-recaptcha-response';
document.body.appendChild(input);
""")
# Установка токена в поля
driver.execute_script(f"""
document.getElementsByName('h-captcha-response')[0].value = '{token}';
document.getElementsByName('g-recaptcha-response')[0].value = '{token}';
""")
def show_visual_feedback(driver):
# Создаем баннер, который будет виден на странице и покажет, что капча решена
driver.execute_script("""
var banner = document.createElement('div');
banner.innerText = 'Captcha Solved!';
banner.style.position = 'fixed';
banner.style.top = '0';
banner.style.left = '0';
banner.style.width = '100%';
banner.style.backgroundColor = 'green';
banner.style.color = 'white';
banner.style.fontSize = '24px';
banner.style.fontWeight = 'bold';
banner.style.textAlign = 'center';
banner.style.zIndex = '9999';
banner.style.padding = '10px';
document.body.appendChild(banner);
""")
def main():
# Инициализация Selenium WebDriver (Chrome)
driver = webdriver.Chrome()
driver.get(PAGEURL)
# Ждем, пока на странице появится элемент с data-sitekey
try:
sitekey_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, '[data-sitekey]'))
)
# Динамически извлекаем sitekey
sitekey = sitekey_element.get_attribute("data-sitekey")
print("Извлечённый sitekey:", sitekey)
except Exception as e:
print("Не удалось найти элемент с data-sitekey:", e)
driver.quit()
return
# Решаем hCaptcha с использованием динамически извлечённого sitekey
solution = solve_hcaptcha(sitekey)
if solution:
token = solution.get("request")
user_agent = solution.get("useragent")
print("Полученный токен:", token)
print("User-Agent:", user_agent)
# Вставляем токен в скрытые поля
set_captcha_token(driver, token)
print("Токен успешно вставлен в поля формы.")
# Показываем визуальное подтверждение решения капчи
show_visual_feedback(driver)
# Если требуется, можно автоматически отправить форму:
# driver.find_element(By.ID, "submit-button").click()
# Оставляем браузер открытым для демонстрации (10 секунд)
time.sleep(10)
driver.quit()
else:
print("Не удалось решить капчу.")
driver.quit()
if __name__ == "__main__":
main()
Что делает скрипт:
Пошаговое описание работы скрипта
Инициализация и загрузка страницы
Скрипт использует Selenium WebDriver (в данном случае для браузера Chrome) для открытия целевой страницы. В моем примере (видео ниже) это три разных URL: Демо страницы с hcaptcha трех уровней сложности (easy, moderate, difficult).Извлечение sitekey
На странице с hCaptcha всегда присутствует специальный атрибут data-sitekey, который является уникальным идентификатором для капчи на данной странице. Скрипт ожидает появления элемента с этим атрибутом и динамически извлекает его значение. Теоретически, это позволяет ему работать с любыми страницами, где используется hCaptcha. Соответсвенно, если скрипт по какой-то причине не захватывает этот параметр, нужно разбираться со страницей, но в большинстве случаев должно сработать.Отправка запроса к API для решения капчи
После получения sitekey скрипт отправляет POST-запрос к API-сервису (в моем случае это - https://api.solvecaptcha.com/in.php). В запросе передаются следующие параметры:API-ключ – для аутентификации.
Метод – указывается тип капчи, в данном случае "hcaptcha".
sitekey – динамически извлеченное значение.
pageurl – полный URL страницы, на которой расположена капча.
json – параметр для получения ответа в формате JSON.
В ответ API возвращает уникальный идентификатор капчи (captcha_id), который используется для последующих запросов и уточнения, решена ли капча.
Запрос решения капчи
После получения идентификатора, скрипт регулярно отправляет GET-запросы к API, чтобы узнать, готово ли решение. Если капча ещё не решена, API отвечает сообщением "CAPCHA_NOT_READY", и скрипт делает паузу (5 секунд) перед следующим запросом. Как только капча решена, API возвращает токен решения и дополнительное поле useragent.Подстановка токена в скрытые поля формы
Получив токен, скрипт проверяет наличие на странице скрытых полей h-captcha-response и g-recaptcha-response. Если они отсутствуют, скрипт автоматически создаёт их с помощью JavaScript. Далее токен подставляется в эти поля, что позволяет сайту принять решение капчи как валидное.
Доработка
Для наглядности я добавил в скрипт такой код:
def show_visual_feedback(driver):
# Создаем баннер, который будет виден на странице и покажет, что капча решена
driver.execute_script("""
var banner = document.createElement('div');
banner.innerText = 'Captcha Solved!';
banner.style.position = 'fixed';
banner.style.top = '0';
banner.style.left = '0';
banner.style.width = '100%';
banner.style.backgroundColor = 'green';
banner.style.color = 'white';
banner.style.fontSize = '24px';
banner.style.fontWeight = 'bold';
banner.style.textAlign = 'center';
banner.style.zIndex = '9999';
banner.style.padding = '10px';
document.body.appendChild(banner);
""")
Он добавляет на страницу фиксированный баннер, который выводит сообщение «Captcha Solved!». Его можно заккоментировать в коде или просто удалить - на работоспособность самого решателя это не повлияет.
И заккоментируйте (удалите) эту строку, чтобы не вызывался браузер:
show_visual_feedback(driver)
Что еще
При необходимости скрипт может автоматически инициировать отправку формы (например, эмулировать клик по кнопке отправки), если это предусмотрено логикой сайта. Нужно раскомментировать эту строчку.
# driver.find_element(By.ID, "submit-button").click()
А дальше? А дальше сами - скрипт работает, готовое решение я нашел, в целом можно прекращать ныть по поводу того, что hcaptcha перестала решаться. Кстати, я еще делал скрипт на node.js но там что-то пошло не так и я просто забил и сосредоточился на Python. Если прям сильно кому надо, могу поковыряться и сделать скрипт под node.