Решение капчи Cloudflare или клик по элементу под shadow-root (closed)

kul0n

Client
Регистрация
10.03.2016
Сообщения
98
Благодарностей
52
Баллы
18
Привет зеноводам!

В этой статье хочу расказать о способе решения капчи Cloudflare. Способ почти универсален ;-)
Думаю уже давно ни для кого не секрет, что данный тип капчи проходится обычным кликом по определенному полю капчи. После чего мы получаем зеленую галку и капча пройдена. Но на деле не все так просто.
Первая проблема с которой мы можем столкнутся, это постоянное обновление капчи после клика. В большинстве случаев эту проблему можно решить обновлением версии Зеннопостер и перегенерацией профилей. Иногда достаточно подмены юзерагента, включения изоляции и тд. На форуме эти вопросы подымались, поэтому на них останавливатся не будем.
Рассморим вторую проблему - клик по полю капчи.
Основная проблема тут - это тень shadow-root, да еще и закрытая (closed). А это значит, что добратся до нужного элемента никакими способами Зеннопостер у нас не получится. Да, можно сделать банально через клик по картинке, но это способ не всегда работает. Поэтому попробуем сделать более универсальное решение.

Для примера взят рандомный кран https://testnet.megaeth.com/ Переходим по ссылке, дальше вкладка faucet, ждем загрузки капчи, дальше ПКМ на капче и пункт "посмотреть код"

134232


Видим надпись shadow-root (closed), следовательно все что находится ниже нам не доступно. Но если внимательно изучить код, то можно заметить, что выше есть елементы (теги div) в которые обернуто окно капчи, но сами они находятся не под тенью! Этим мы и воспользуемся.

134234


Ищем выше shadow-root (closed) елемент в который обернута капча и если у него нет удобных атрибутов - перемещаемся выше в поисках нужного элемента со статичными атрибутами, после чего с помощью xpath уже создаем путь к элементу в который обернута капча.

134235


В данном случае это тег div id="cf-turnstile" но так как у него атрибуты не уникальные, то я составил путь от тега "р" который находится выше и имеет уникальный текст "Maximum 0.005 testnet..." Вставляем наш xpath путь в строку поиска и видим, что подсветился нужный нам элемент, а это значит, что xpath составлен верно.
Теперь, когда у нас есть путь к элементу, нужно получить координаты его левого верхнего угла, сделать смещение в сторону нужной области и кликнуть. Ниже приведен код который это реализует.

click CloudFlare:
if (int.Parse(project.Variables["cnt"].Value) < 7)
{
    project.SendInfoToLog("Значение cnt меньше 7, величиваем");
    project.Variables["cnt"].Value = (int.Parse(project.Variables["cnt"].Value) + 1).ToString();

}
else
{
    project.Variables["cnt"].Value = "0"; // Устанавливаем значение переменной в 0
    throw new Exception("НЕ разгадали капчу");
}


Random rnd = new Random();

// Указываем XPath для элемента
string xpath = "//p[contains(text(), 'Maximum')]/ancestor::div/following-sibling::div//div";

// Находим элемент
HtmlElement he = instance.ActiveTab.FindElementByXPath(xpath, 0);
if (he.IsVoid) throw new Exception("Элемент не найден по указанному XPath!");

// Получаем координаты элемента
string strX = he.GetAttribute("leftInbrowser");
string strY = he.GetAttribute("topInbrowser");

// Преобразуем координаты из строк в целые числа
if (!int.TryParse(strX, out int x) || !int.TryParse(strY, out int y))
{
    throw new Exception("Не удалось преобразовать координаты в числа.");
}

// Добавляем смещение по осям X и Y
int offsetX = 30;
int offsetY = 30;
int targetX = x + offsetX;
int targetY = y + offsetY;

// Перемещаем курсор к указанным координатам с полной эмуляцией
instance.ActiveTab.FullEmulationMouseMove(targetX,  targetY);

// Выполняем клик левой кнопкой мыши
instance.ActiveTab.FullEmulationMouseClick("left", "click");
Но перед тем как делать клик, логично проверить не пройдена ли капча автоматом, если нет - кликнуть и снова проверить есть ли галка.

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

134236


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

Для лучшего понимания видео дополнение:

На этом все, надеюсь информация будет полезной.

Шаблон с примером логики прикрепляю.

Всем удачных прохождений капчи)
 

Вложения

Последнее редактирование:

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)