Решение капчи для
Selenium
Проходите проверку прямо в ходе запуска, а не проваливайте задание. Рабочий пример на Python и три фактора, от которых зависит, будет ли принят ваш токен.
import time
import requests
CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}
def solve(task: dict) -> dict:
"""Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
r = requests.post(
"https://api.captchano.com/v1/solve",
params={"wait": 60},
json=task,
headers=HEADERS,
timeout=75,
)
data = r.json()
# A solve can outlast the 60 s wait: poll the task until it finishes.
while data.get("status") in ("queued", "solving"):
time.sleep(5)
data = requests.get(
f"https://api.captchano.com/v1/task/{data['id']}",
headers=HEADERS,
timeout=30,
).json()
if data.get("status") != "ready":
raise RuntimeError(data.get("error") or data)
return data["solution"]
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/login")
sitekey = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": driver.current_url})
driver.execute_script(
"document.getElementById('g-recaptcha-response').value = arguments[0]",
solution["token"],
)
driver.find_element(By.CSS_SELECTOR, "form").submit()От чего зависит, будет ли принят токен
- Передавайте свой прокси. Токен должен быть получен с того же исходящего IP, с которого он отправляется. Для систем с оценкой сессии это обязательное условие, а не оптимизация.
- Совпадение user agent. Turnstile и ряд антибот-систем привязывают токен к user agent. Мы возвращаем использованный user agent, чтобы вы могли воспроизвести его в точности.
- Запрашивайте как можно позже. Токены истекают примерно через 120 секунд. Запрашивайте токен, когда будете готовы к отправке.
Блокирующий вызов или опрос
В примере используется ?wait=60, поэтому вызов возвращает готовое решение, и шаг в Selenium остаётся линейным. Если не хотите держать соединение, уберите параметр, сохраните полученный id и опрашивайте GET /v1/task/{id} каждые пять секунд. Оплаченный токен можно получить в течение десяти минут, так что обрыв соединения не стоит вам решения.
Стоимость
$0.00598 за каждое успешное решение reCAPTCHA v2; неудачные решения никогда не оплачиваются. Цены на все типы проверок — на странице цен, полный формат запроса — в справочнике API.
Как решение встраивается в Selenium
Selenium управляет настоящим браузером, поэтому проверка отображается так же, как её увидел бы пользователь. Прочитайте sitekey из DOM, запросите токен и запишите его обратно через execute_script перед нажатием кнопки отправки.
- 01Загрузите страницу
Откройте целевую страницу с теми же прокси и user agent, с которых будете отправлять форму.
- 02Прочитайте sitekey
find_element по [data-sitekey] и прочитайте атрибут, а также data-callback, если он есть.
- 03Решите
Отправьте POST с type, sitekey и driver.current_url на /v1/solve?wait=60 с теми же прокси и user agent.
- 04Подставьте токен и отправьте
execute_script, чтобы заполнить поле ответа и вызвать callback, затем нажмите кнопку отправки.
Как передать токен на страницу
driver.execute_script заполняет скрытое поле g-recaptcha-response или cf-turnstile-response и, если страница его использует, вызывает callback виджета.
Где интеграции обычно ломаются
Многие страницы активируют кнопку отправки из callback виджета. Если только заполнить поле, кнопка останется неактивной.
Textarea для ответа создаётся при отрисовке виджета. Дождитесь iframe виджета, прежде чем подставлять токен.
Прокси в Selenium задаётся при запуске драйвера. Передайте ту же строку прокси в запрос на решение, чтобы токен и отправка шли с одного IP.
Частые вопросы о капче в Selenium
Может ли Selenium сам решить reCAPTCHA?
Нет. Selenium управляет браузером, но не может ответить на задание с картинками, а автоматизированным браузерам его показывают чаще. Вы запрашиваете токен у API решения капчи и подставляете его, как в примере на этой странице.
Работает ли это с undetected-chromedriver или Selenium Grid?
Да. Интеграция только читает DOM и выполняет JavaScript, поэтому работает с любой сессией WebDriver, локальной или удалённой, если вы передаёте в запрос на решение те же прокси и user agent.
Куда помещать токен для Turnstile?
Turnstile использует скрытое поле input с именем cf-turnstile-response внутри формы. Задайте его значение и вызовите callback, указанный в data-callback, если страница его объявляет.
Что делать с капчей, которая появляется лишь иногда?
Проверяйте наличие виджета после каждой навигации и вызывайте API, только если он есть. Оплата взимается за каждое успешное решение, так что проверка ничего не стоит.
Полезные руководства
Готовы начать?
Начните с бесплатного 3-дневного пробного периода, а по мере роста трафика платите за каждое успешное решение. Для пробного периода карта не нужна.