Решение капчи на сервисах Яндекс

Petr

Administrator
Staff member
64c1b5626d72a4241d9e8992.png

Что произошло?​


Яндекс недавно обновили капчу, которую они используют на своих сервисах. Вместо привычных картинок с текстом теперь пользователю предлагается кликать на символы в определенном порядке. Кажется, идея была позаимствована у GeeTest, где уже много лет используется такой вид заданий.

ВАЖНО: Яндекс по неведомой причине никогда не использует на своих сервисах решение Yandex Smart Captcha, которое очень легко решать с помощью соответствующего метода нашего API.

Как работает капча на сервисах Яндекс и как ее решать?​


Первым делом пользователь видит чекбокс "Я не робот"​

64c1b8ab6d72a4241d9e89f1.png


За этим чекбоксом прячется всего лишь форма с набором параметров, которая отправляется по клику на чекбокс. Вы можете отправить эту форму любым удобным для вас способом, например выполнив JavaScript:

JavaScript:
{document.querySelector('form').submit()

После отправки формы загружается капча​

Иногда Яндекс все еще показывает старую текстовую капчу, проверить, что это она можно, например, поиском элемента input с классом Textinput-Control

JavaScript:
{document.querySelector('input.Textinput-Control')}
Если элемент есть на странице - все как и раньше, достаточно отправить изображение на решение методом для обычной капчи и ввести текст из ответа в найденный элемент input.

Если элемента на странице нет, значит мы имеем дело с новой капчей, где вместо ввода текста с картинки пользователю предлагается изображение с набором символов и инструкция, в каком порядке нужно на них кликнуть.

64c1b91ac17c62227181d8c3.png


На данный момент мы предлагаем для решения этой капчи использовать метод coordinates, что потребует от вас использовать эмуляцию браузера.

Как решать капчу с помощью API?​

1. Получаем изображение самой капчи​

Находим элемент с классом AdvancedCaptcha-ImageWrappe и берем у его первого дочернего элемента атрибут src - это и будет URL нужного нам изображения.
Например так:

JavaScript:
document.querySelector('.AdvancedCaptcha-ImageWrapper').firstChild.src
Получаем изображение сохраняем его, либо конвертируем в base64, назовем его CAPTCHA_IMAGE.

2. Получаем картинку-задание​

Находим элемент с классом AdvancedCaptcha-SilhouetteTask и берем у второго его дочернего элемента аттрибут src - это и будет URL нужного нам изображения.
document.querySelector('.AdvancedCaptcha-SilhouetteTask').children[1].src

Получаем изображение сохраняем его, либо корвертируем в base64, назовем его TASK_IMAGE.

3. Отправляем капчу на решение​

Используем метод coordinates.

ВАЖНО:
CAPTCHA_IMAGE при отправке запроса, рекомендуемый размер должен быть 320x180 пикселей.
TASK_IMAGE при отправке запроса, рекомендуемый размер должен быть 300x35 пикселей.

Формируем тело запроса, используя полученные ранее изображения и отправляем его в эндпоинт https://{{hostname}}/in.php

JavaScript:
{
  "method": "base64",
  "coordinatescaptcha": 1,
  "key": "YOUR_APIKEY",
  "body": "CAPTCHA_IMAGE",
  "imginstructions": "TASK_IMAGE",
  "textinstructions": "Кликните в таком порядке | Click in the following order",
  "json":1
}

Из полученного ответа берем ID капчи и, используя его, запрашиваем ответ GET-запросом вида:
https://{{hostname}}/res.php?key=YOUR_APIKEY&action=get&id=CAPTCHA_ID&json=1

Результат содержит набор координат, по которым необходимо кликнуть, пример:

JavaScript:
{
    "status": 1,
    "request": [
        {
            "x": "187",
            "y": "60"
        },
        {
            "x": "98",
            "y": "121"
        },
        {
            "x": "267",
            "y": "115"
        },
        {
            "x": "173",
            "y": "146"
        },
        {
            "x": "23",
            "y": "69"
        }
    ]
}

4. Кликаем по координатам​

Не забываем, что точка 0,0 - это левый верхний угол изображения CAPTCHA_IMAGE

5. Кликаем на кнопку "Отправить"​

Готово.

Что делать, если ответ не был принят?​

Вы можете отправить жалобу reportbad и капча уйдет на проверку модератором. Так как достоверно проверить координаты невозможно, мы сверяем только количество точек, по которым нужно кликнуть. Если количество кликов совпадет, мы признаем ответ работника верным.

Стоимость решения​

1000 решений стоят 1.2 USD или 70 Rub

Полезные ссылки​

- Метод Coordinates
- Часто задаваемые вопросы
- Прайс-лист
 
Last edited:

imdeveloper

New member
Здравствуйте! Получения TASK_IMAGE больше не работает, потому что на странице используется canvas вместо картинки. пример:

HTML:
<div class="AdvancedCaptcha-CanvasContainer">
<canvas width="480" height="80"></canvas>
</div>
 

Petr

Administrator
Staff member
В данном случае необходимо изменить подход извлечения этого параметра, какие шаги:
  • Найти элемент <canvas>.
  • Получить контекст рисования для этого элемента.
  • Преобразовать содержимое canvas в данные URL в формате base64.
 

Sdravstvuite

New member
Здравствуйте!
Пытаясь получить base64 канваса сталкиваюсь с такой ошибкой:
{"status":18,"value":"Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data."}
 

Petr

Administrator
Staff member
Здравствуйте!
Пытаясь получить base64 канваса сталкиваюсь с такой ошибкой:
{"status":18,"value":"Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data."}

Ошибка легко гуглится

JavaScript:
this.img.setAttribute('crossorigin', 'anonymous')
 
Last edited:

dead steam

New member
Здравствуйте! Подскажите пожалуйста как правильно вытащить url из этого canvas
 

gracegray

New member
Отличный гайд! Спасибо, очень помогло разобраться с новой капчей Яндекса.

Кстати, небольшой совет по поводу кликов по координатам: лучше добавить небольшую рандомизацию к координатам и задержку между кликами, чтобы имитировать действия реального пользователя. Это может помочь избежать проблем с детектированием ботов.