Cloudflare поиск координат через стили и клик по ним

fasawer

Новичок
Регистрация
19.11.2025
Сообщения
18
Реакции
21
Баллы
3
коротко о главном
Мы не используем поиск картинки
мы используем стили элемента которые лежат в не фрейма
код просто не нужно указывать что искать
вставили выполнили он сам все найдет и тыкнет
если у кого не работает то возможно нужно подогнать
но я работаю с разными сайтами где есть Cloudflare и 10 из 10

код написан на скорую руку возможно нужны доработки под каждого индивидуально
но даренному коню в зубы не смотрят



C#:
Развернуть Свернуть Копировать
project.SendInfoToLog("=== ПОИСК КООРДИНАТ TURNSTILE И НАВЕДЕНИЕ МЫШИ ===");

// Поиск Turnstile виджета по динамическому ID
project.SendInfoToLog("Поиск Turnstile виджета...");
HtmlElement turnstileWidget = instance.ActiveTab.FindElementByXPath("//div[contains(@id, 'cf-turnstile-')]", 0);

if (!turnstileWidget.IsVoid)
{
    string widgetId = turnstileWidget.GetAttribute("id");
    string widgetLeft = turnstileWidget.GetAttribute("leftInbrowser");
    string widgetTop = turnstileWidget.GetAttribute("topInbrowser");
    
    project.SendInfoToLog($"✓ TURNSTILE WIDGET НАЙДЕН: ID='{widgetId}'");
    project.SendInfoToLog($"- Координаты виджета: X='{widgetLeft}', Y='{widgetTop}'");
    
    if (int.TryParse(widgetLeft, out int widgetX) && int.TryParse(widgetTop, out int widgetY))
    {
        // Координаты для клика по центру виджета
        int clickX = widgetX + 50;
        int clickY = widgetY + 25;
        
        project.SendInfoToLog($"✓ ВЕРНЫЕ КООРДИНАТЫ ДЛЯ КЛИКА: X={widgetX}, Y={widgetY}");
        project.SendInfoToLog($"- Используйте: instance.ActiveTab.FullEmulationMouseMove({clickX}, {clickY})");
        
        // НАВЕДЕНИЕ МЫШКИ
        project.SendInfoToLog("Наведение мышки...");
        instance.ActiveTab.FullEmulationMouseMove(clickX, clickY);
        project.SendInfoToLog("✓ Мышь наведена");
        
        // Задержка перед кликом
        System.Threading.Thread.Sleep(1000);
        
        // КЛИК
        project.SendInfoToLog("Клик левой кнопкой мыши...");
        instance.ActiveTab.FullEmulationMouseClick("left", "click");
        project.SendInfoToLog("✓ Клик выполнен");
        
        // ОЖИДАНИЕ РЕЗУЛЬТАТА
        project.SendInfoToLog("Ожидание решения Turnstile...");
        System.Threading.Thread.Sleep(5000);
        
        // ПРОВЕРКА ТОКЕНА
        project.SendInfoToLog("Проверка токена...");
        HtmlElement tokenField = instance.ActiveTab.FindElementByName("cf-turnstile-response");
        
        if (!tokenField.IsVoid)
        {
            string tokenValue = tokenField.GetAttribute("value");
            if (!string.IsNullOrEmpty(tokenValue))
            {
                project.SendInfoToLog($"✓ УСПЕХ: Токен получен!");
                project.SendInfoToLog($"Токен: {tokenValue.Substring(0, Math.Min(30, tokenValue.Length))}...");
            }
            else
            {
                project.SendInfoToLog("Токен еще не получен");
            }
        }
        else
        {
            project.SendInfoToLog("Поле для токена не найдено");
        }
    }
    else
    {
        project.SendInfoToLog("✗ Ошибка преобразования координат");
    }
}
else
{
    project.SendInfoToLog("✗ Turnstile виджет не найден");
}

project.SendInfoToLog("=== ОПЕРАЦИЯ ЗАВЕРШЕНА ===");
 
  • Оценить
Реакции: Dmitriy_Zenno
второй код предназначен дл\ таких вариантов

таких сайтов не очень много так же возможно подгонять под свой
ну или возможно кто то сделает его еще лучше главное направление
возможно и это кому то поможет
137610


C#:
Развернуть Свернуть Копировать
project.SendInfoToLog("=== ПОИСК С ПРОВЕРКОЙ ПОЛЯ ===");

HtmlElement targetContainer = null;
string foundContainerId = "";

// Получаем все элементы с ID
project.SendInfoToLog("Поиск всех элементов с ID...");
HtmlElementCollection allElements = instance.ActiveTab.FindElementsByTags("*");

// Список для хранения элементов с ID
var elementsWithId = new List<HtmlElement>();

// Собираем все элементы с ID
for (int i = 0; i < allElements.Count; i++)
{
    HtmlElement element = allElements.GetByNumber(i);
    string elementId = element.GetAttribute("id");
    
    if (!string.IsNullOrEmpty(elementId))
    {
        elementsWithId.Add(element);
    }
}

project.SendInfoToLog($"Найдено элементов с ID: {elementsWithId.Count}");

// Проверяем каждый элемент с ID на наличие поля cf-turnstile-response
foreach (HtmlElement element in elementsWithId)
{
    string elementId = element.GetAttribute("id");
    string elementTag = element.TagName;
    
    project.SendInfoToLog($"Проверка элемента: ID='{elementId}', Tag='{elementTag}'");
    
    // Ищем внутри элемента поле с name='cf-turnstile-response'
    HtmlElement tokenField = element.FindChildByName("cf-turnstile-response");
    
    if (!tokenField.IsVoid)
    {
        targetContainer = element;
        foundContainerId = elementId;
        project.SendInfoToLog($"✓ НАЙДЕН КОНТЕЙНЕР С ПОЛЕМ ТОКЕНА: ID='{elementId}'");
        break;
    }
}

// Если нашли контейнер - работаем с ним
if (targetContainer != null && !targetContainer.IsVoid)
{
    project.SendInfoToLog($"✓ РАБОТАЕМ С КОНТЕЙНЕРОМ: ID='{foundContainerId}'");
    
    // Получаем координаты контейнера
    string leftInBrowser = targetContainer.GetAttribute("leftInbrowser");
    string topInBrowser = targetContainer.GetAttribute("topInbrowser");
    
    project.SendInfoToLog($"- Координаты контейнера: X='{leftInBrowser}', Y='{topInBrowser}'");
    
    // Получаем размеры контейнера
    string width = targetContainer.GetAttribute("offsetWidth");
    string height = targetContainer.GetAttribute("offsetHeight");
    project.SendInfoToLog($"- Размеры контейнера: Width='{width}', Height='{height}'");
    
    if (int.TryParse(leftInBrowser, out int containerX) && int.TryParse(topInBrowser, out int containerY))
    {
        // Рассчитываем координаты для клика
        int clickX, clickY;
        
        // Если есть размеры - кликаем по центру
        if (int.TryParse(width, out int w) && int.TryParse(height, out int h) && w > 0 && h > 0)
        {
            clickX = containerX + (w / 2);
            clickY = containerY + (h / 2);
            project.SendInfoToLog($"- Клик по центру: X={clickX}, Y={clickY} (ширина={w}, высота={h})");
        }
        else
        {
            // Стандартное смещение
            clickX = containerX + 25;
            clickY = containerY + 25;
            project.SendInfoToLog($"- Клик со смещением: X={clickX}, Y={clickY}");
        }
        
        // Проверяем что координаты не (0,0)
        if (containerX == 0 && containerY == 0)
        {
            project.SendInfoToLog("⚠ ВНИМАНИЕ: Координаты контейнера (0,0) - контейнер может быть скрыт");
            project.SendInfoToLog("Ищем родительский видимый элемент...");
            
            // Ищем родительский элемент с координатами
            HtmlElement parent = targetContainer.ParentElement;
            int level = 0;
            
            while (!parent.IsVoid && level < 5) // Проверяем до 5 уровней родителей
            {
                string parentLeft = parent.GetAttribute("leftInbrowser");
                string parentTop = parent.GetAttribute("topInbrowser");
                
                if (int.TryParse(parentLeft, out int parentX) && int.TryParse(parentTop, out int parentY) &&
                    (parentX != 0 || parentY != 0))
                {
                    project.SendInfoToLog($"Найден родитель с координатами: X={parentX}, Y={parentY}");
                    clickX = parentX + 50;
                    clickY = parentY + 25;
                    project.SendInfoToLog($"- Новые координаты для клика: X={clickX}, Y={clickY}");
                    break;
                }
                
                parent = parent.ParentElement;
                level++;
            }
        }
        
        // НАВЕДЕНИЕ И КЛИК
        project.SendInfoToLog("Наведение мышки...");
        instance.ActiveTab.FullEmulationMouseMove(clickX, clickY);
        project.SendInfoToLog("✓ Мышь наведена");
        
        System.Threading.Thread.Sleep(1000);
        
        project.SendInfoToLog("Клик левой кнопкой мыши...");
        instance.ActiveTab.FullEmulationMouseClick("left", "click");
        project.SendInfoToLog("✓ Клик выполнен");
        
        project.SendInfoToLog("Ожидание решения Turnstile...");
        System.Threading.Thread.Sleep(5000);
        
        // ПРОВЕРКА РЕЗУЛЬТАТА
        CheckTurnstileToken();
    }
    else
    {
        project.SendInfoToLog("✗ Ошибка преобразования координат");
    }
}
else
{
    project.SendInfoToLog("✗ Контейнер с полем cf-turnstile-response не найден");
    
    // ВЫВОД ОТЛАДОЧНОЙ ИНФОРМАЦИИ
    project.SendInfoToLog("=== ОТЛАДОЧНАЯ ИНФОРМАЦИЯ ===");
    
    // Выводим первые 20 элементов с ID
    project.SendInfoToLog("Первые 20 элементов с ID:");
    for (int i = 0; i < Math.Min(elementsWithId.Count, 20); i++)
    {
        HtmlElement element = elementsWithId[i];
        string elementId = element.GetAttribute("id");
        string elementTag = element.TagName;
        string elementClass = element.GetAttribute("class");
        
        project.SendInfoToLog($"Elem[{i}]: ID='{elementId}', Tag='{elementTag}', Class='{elementClass}'");
    }
    
    // Проверяем есть ли поле cf-turnstile-response вообще на странице
    project.SendInfoToLog("Поиск поля cf-turnstile-response на странице...");
    HtmlElement tokenFieldGlobal = instance.ActiveTab.FindElementByName("cf-turnstile-response");
    project.SendInfoToLog($"Поле cf-turnstile-response: IsVoid={tokenFieldGlobal.IsVoid}");
    
    if (!tokenFieldGlobal.IsVoid)
    {
        string tokenId = tokenFieldGlobal.GetAttribute("id");
        string tokenParentId = tokenFieldGlobal.ParentElement?.GetAttribute("id") ?? "нет ID";
        project.SendInfoToLog($"Поле найдено: ID='{tokenId}', Родитель ID='{tokenParentId}'");
    }
}

// ФУНКЦИЯ ПРОВЕРКИ ТОКЕНА
void CheckTurnstileToken()
{
    project.SendInfoToLog("Проверка токена...");
    
    HtmlElement tokenField = instance.ActiveTab.FindElementByName("cf-turnstile-response");
    if (!tokenField.IsVoid)
    {
        string tokenValue = tokenField.GetAttribute("value");
        if (!string.IsNullOrEmpty(tokenValue))
        {
            project.SendInfoToLog($"✓ УСПЕХ: Токен получен!");
            project.SendInfoToLog($"Токен: {tokenValue.Substring(0, Math.Min(30, tokenValue.Length))}...");
        }
        else
        {
            project.SendInfoToLog("Токен еще не получен");
            
            // Дополнительное ожидание
            for (int i = 1; i <= 3; i++)
            {
                System.Threading.Thread.Sleep(2000);
                tokenValue = tokenField.GetAttribute("value");
                
                if (!string.IsNullOrEmpty(tokenValue))
                {
                    project.SendInfoToLog($"✓ Токен получен после дополнительного ожидания!");
                    project.SendInfoToLog($"Токен: {tokenValue.Substring(0, Math.Min(30, tokenValue.Length))}...");
                    return;
                }
            }
            project.SendInfoToLog("Токен не получен после 10 секунд ожидания");
        }
    }
    else
    {
        project.SendInfoToLog("Поле токена не найдено");
    }
}

project.SendInfoToLog("=== ОПЕРАЦИЯ ЗАВЕРШЕНА ===");
 
  • Оценить
Реакции: kul0n и Dmitriy_Zenno
для тех кому надо и то и другое в одном коде
сначала выполняем первы вариант если его не найдено то пробуем второй вариант


C#:
Развернуть Свернуть Копировать
project.SendInfoToLog("=== ЕДИНЫЙ ПОИСК TURNSTILE ===");

bool turnstileFound = false;

// МЕТОД 1: Поиск Turnstile виджета по динамическому ID
project.SendInfoToLog("=== МЕТОД 1: ПОИСК ПО ДИНАМИЧЕСКОМУ ID ===");
HtmlElement turnstileWidget = instance.ActiveTab.FindElementByXPath("//div[contains(@id, 'cf-turnstile-')]", 0);

if (!turnstileWidget.IsVoid)
{
    string widgetId = turnstileWidget.GetAttribute("id");
    string widgetLeft = turnstileWidget.GetAttribute("leftInbrowser");
    string widgetTop = turnstileWidget.GetAttribute("topInbrowser");
    
    project.SendInfoToLog($"✓ TURNSTILE WIDGET НАЙДЕН: ID='{widgetId}'");
    project.SendInfoToLog($"- Координаты виджета: X='{widgetLeft}', Y='{widgetTop}'");
    
    if (int.TryParse(widgetLeft, out int widgetX) && int.TryParse(widgetTop, out int widgetY))
    {
        // Координаты для клика по центру виджета
        int clickX = widgetX + 30;
        int clickY = widgetY + 25;
        
        project.SendInfoToLog($"✓ ВЕРНЫЕ КООРДИНАТЫ ДЛЯ КЛИКА: X={widgetX}, Y={widgetY}");
        project.SendInfoToLog($"- Используйте: instance.ActiveTab.FullEmulationMouseMove({clickX}, {clickY})");
        
        // НАВЕДЕНИЕ МЫШКИ
        project.SendInfoToLog("Наведение мышки...");
        instance.ActiveTab.FullEmulationMouseMove(clickX, clickY);
        project.SendInfoToLog("✓ Мышь наведена");
        
        // Задержка перед кликом
        System.Threading.Thread.Sleep(1000);
        
        // КЛИК
        project.SendInfoToLog("Клик левой кнопкой мыши...");
        instance.ActiveTab.FullEmulationMouseClick("left", "click");
        project.SendInfoToLog("✓ Клик выполнен");
        
        // ОЖИДАНИЕ РЕЗУЛЬТАТА
        project.SendInfoToLog("Ожидание решения Turnstile...");
        System.Threading.Thread.Sleep(5000);
        
        // ПРОВЕРКА ТОКЕНА
        CheckTurnstileToken();
        
        turnstileFound = true;
    }
    else
    {
        project.SendInfoToLog("✗ Ошибка преобразования координат");
    }
}
else
{
    project.SendInfoToLog("✗ Turnstile виджет не найден по динамическому ID");
}

// ЕСЛИ ПЕРВЫЙ МЕТОД НЕ СРАБОТАЛ - ЗАПУСКАЕМ ВТОРОЙ МЕТОД
if (!turnstileFound)
{
    project.SendInfoToLog("=== МЕТОД 2: ПОИСК С ПРОВЕРКОЙ ПОЛЯ ===");
    
    HtmlElement targetContainer = null;
    string foundContainerId = "";
    
    // Получаем все элементы с ID
    project.SendInfoToLog("Поиск всех элементов с ID...");
    HtmlElementCollection allElements = instance.ActiveTab.FindElementsByTags("*");
    
    // Список для хранения элементов с ID
    var elementsWithId = new List<HtmlElement>();
    
    // Собираем все элементы с ID
    for (int i = 0; i < allElements.Count; i++)
    {
        HtmlElement element = allElements.GetByNumber(i);
        string elementId = element.GetAttribute("id");
        
        if (!string.IsNullOrEmpty(elementId))
        {
            elementsWithId.Add(element);
        }
    }
    
    project.SendInfoToLog($"Найдено элементов с ID: {elementsWithId.Count}");
    
    // Проверяем каждый элемент с ID на наличие поля cf-turnstile-response
    foreach (HtmlElement element in elementsWithId)
    {
        string elementId = element.GetAttribute("id");
        string elementTag = element.TagName;
        
        project.SendInfoToLog($"Проверка элемента: ID='{elementId}', Tag='{elementTag}'");
        
        // Ищем внутри элемента поле с name='cf-turnstile-response'
        HtmlElement tokenField = element.FindChildByName("cf-turnstile-response");
        
        if (!tokenField.IsVoid)
        {
            targetContainer = element;
            foundContainerId = elementId;
            project.SendInfoToLog($"✓ НАЙДЕН КОНТЕЙНЕР С ПОЛЕМ ТОКЕНА: ID='{elementId}'");
            break;
        }
    }
    
    // Если нашли контейнер - работаем с ним
    if (targetContainer != null && !targetContainer.IsVoid)
    {
        project.SendInfoToLog($"✓ РАБОТАЕМ С КОНТЕЙНЕРОМ: ID='{foundContainerId}'");
        
        // Получаем координаты контейнера
        string leftInBrowser = targetContainer.GetAttribute("leftInbrowser");
        string topInBrowser = targetContainer.GetAttribute("topInbrowser");
        
        project.SendInfoToLog($"- Координаты контейнера: X='{leftInBrowser}', Y='{topInBrowser}'");
        
        // Получаем размеры контейнера
        string width = targetContainer.GetAttribute("offsetWidth");
        string height = targetContainer.GetAttribute("offsetHeight");
        project.SendInfoToLog($"- Размеры контейнера: Width='{width}', Height='{height}'");
        
        if (int.TryParse(leftInBrowser, out int containerX) && int.TryParse(topInBrowser, out int containerY))
        {
            // Рассчитываем координаты для клика
            int clickX, clickY;
            
            // Если есть размеры - кликаем по центру
            if (int.TryParse(width, out int w) && int.TryParse(height, out int h) && w > 0 && h > 0)
            {
                clickX = containerX + (w / 2);
                clickY = containerY + (h / 2);
                project.SendInfoToLog($"- Клик по центру: X={clickX}, Y={clickY} (ширина={w}, высота={h})");
            }
            else
            {
                // Стандартное смещение
                clickX = containerX + 25;
                clickY = containerY + 25;
                project.SendInfoToLog($"- Клик со смещением: X={clickX}, Y={clickY}");
            }
            
            // Проверяем что координаты не (0,0)
            if (containerX == 0 && containerY == 0)
            {
                project.SendInfoToLog("⚠ ВНИМАНИЕ: Координаты контейнера (0,0) - контейнер может быть скрыт");
                project.SendInfoToLog("Ищем родительский видимый элемент...");
                
                // Ищем родительский элемент с координатами
                HtmlElement parent = targetContainer.ParentElement;
                int level = 0;
                
                while (!parent.IsVoid && level < 5) // Проверяем до 5 уровней родителей
                {
                    string parentLeft = parent.GetAttribute("leftInbrowser");
                    string parentTop = parent.GetAttribute("topInbrowser");
                    
                    if (int.TryParse(parentLeft, out int parentX) && int.TryParse(parentTop, out int parentY) &&
                        (parentX != 0 || parentY != 0))
                    {
                        project.SendInfoToLog($"Найден родитель с координатами: X={parentX}, Y={parentY}");
                        clickX = parentX + 50;
                        clickY = parentY + 25;
                        project.SendInfoToLog($"- Новые координаты для клика: X={clickX}, Y={clickY}");
                        break;
                    }
                    
                    parent = parent.ParentElement;
                    level++;
                }
            }
            
            // НАВЕДЕНИЕ И КЛИК
            project.SendInfoToLog("Наведение мышки...");
            instance.ActiveTab.FullEmulationMouseMove(clickX, clickY);
            project.SendInfoToLog("✓ Мышь наведена");
            
            System.Threading.Thread.Sleep(1000);
            
            project.SendInfoToLog("Клик левой кнопкой мыши...");
            instance.ActiveTab.FullEmulationMouseClick("left", "click");
            project.SendInfoToLog("✓ Клик выполнен");
            
            project.SendInfoToLog("Ожидание решения Turnstile...");
            System.Threading.Thread.Sleep(5000);
            
            // ПРОВЕРКА РЕЗУЛЬТАТА
            CheckTurnstileToken();
            
            turnstileFound = true;
        }
        else
        {
            project.SendInfoToLog("✗ Ошибка преобразования координат");
        }
    }
    else
    {
        project.SendInfoToLog("✗ Контейнер с полем cf-turnstile-response не найден");
        
        // ВЫВОД ОТЛАДОЧНОЙ ИНФОРМАЦИИ
        project.SendInfoToLog("=== ОТЛАДОЧНАЯ ИНФОРМАЦИЯ ===");
        
        // Выводим первые 20 элементов с ID
        project.SendInfoToLog("Первые 20 элементов с ID:");
        for (int i = 0; i < Math.Min(elementsWithId.Count, 20); i++)
        {
            HtmlElement element = elementsWithId[i];
            string elementId = element.GetAttribute("id");
            string elementTag = element.TagName;
            string elementClass = element.GetAttribute("class");
            
            project.SendInfoToLog($"Elem[{i}]: ID='{elementId}', Tag='{elementTag}', Class='{elementClass}'");
        }
        
        // Проверяем есть ли поле cf-turnstile-response вообще на странице
        project.SendInfoToLog("Поиск поля cf-turnstile-response на странице...");
        HtmlElement tokenFieldGlobal = instance.ActiveTab.FindElementByName("cf-turnstile-response");
        project.SendInfoToLog($"Поле cf-turnstile-response: IsVoid={tokenFieldGlobal.IsVoid}");
        
        if (!tokenFieldGlobal.IsVoid)
        {
            string tokenId = tokenFieldGlobal.GetAttribute("id");
            string tokenParentId = tokenFieldGlobal.ParentElement?.GetAttribute("id") ?? "нет ID";
            project.SendInfoToLog($"Поле найдено: ID='{tokenId}', Родитель ID='{tokenParentId}'");
        }
    }
}

// ФУНКЦИЯ ПРОВЕРКИ ТОКЕНА
void CheckTurnstileToken()
{
    project.SendInfoToLog("Проверка токена...");
    
    HtmlElement tokenField = instance.ActiveTab.FindElementByName("cf-turnstile-response");
    if (!tokenField.IsVoid)
    {
        string tokenValue = tokenField.GetAttribute("value");
        if (!string.IsNullOrEmpty(tokenValue))
        {
            project.SendInfoToLog($"✓ УСПЕХ: Токен получен!");
            project.SendInfoToLog($"Токен: {tokenValue.Substring(0, Math.Min(30, tokenValue.Length))}...");
        }
        else
        {
            project.SendInfoToLog("Токен еще не получен");
            
            // Дополнительное ожидание
            for (int i = 1; i <= 3; i++)
            {
                System.Threading.Thread.Sleep(2000);
                tokenValue = tokenField.GetAttribute("value");
                
                if (!string.IsNullOrEmpty(tokenValue))
                {
                    project.SendInfoToLog($"✓ Токен получен после дополнительного ожидания!");
                    project.SendInfoToLog($"Токен: {tokenValue.Substring(0, Math.Min(30, tokenValue.Length))}...");
                    return;
                }
            }
            project.SendInfoToLog("Токен не получен после 10 секунд ожидания");
        }
    }
    else
    {
        project.SendInfoToLog("Поле токена не найдено");
    }
}

if (turnstileFound)
{
    project.SendInfoToLog("✓ Turnstile успешно обработан");
}
else
{
    project.SendInfoToLog("✗ Turnstile не найден ни одним методом");
}

project.SendInfoToLog("=== ОПЕРАЦИЯ ЗАВЕРШЕНА ===");
 
  • Оценить
Реакции: Dmitriy_Zenno
Не находит((( Кликает в левый угл экрана((((
 
Это выгладит как повтор темы @kul0n и принципа работы клика по каптче как в прошлом конкурсе.
Там такая же суть, фокус на около прилегающий элемент по xpath и потом клик по смещению
C#:
Развернуть Свернуть Копировать
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");
 
Это выгладит как повтор темы @kul0n и принципа работы клика по каптче как в прошлом конкурсе.
Там такая же суть, фокус на около прилегающий элемент по xpath и потом клик по смещению
C#:
Развернуть Свернуть Копировать
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");
а конкретно поиск элемента каптчи и берет координаты со стилей
вот его около у меня никак не работает 30% попаданий с учетом динамических значений элементов сайтов
я работаю стысями разных сайтов где есть клауд
 
Дописал для себя финальную версию которая у меня работает с динамическими значениями
И на разных сайтах код работает как с просто каптчей так и с челенджем
в большинстве случаев код должен работать возможны какие то уникальные случае ( но тесты показали что код хорошо сам находит родителя и определяет координаты )


C#:
Развернуть Свернуть Копировать
project.SendInfoToLog("=== ПОИСК КООРДИНАТ TURNSTILE И НАВЕДЕНИЕ МЫШИ ===");

// ПЕРВЫЙ ВАРИАНТ: Поиск из рабочего кода
project.SendInfoToLog("ПЕРВЫЙ ВАРИАНТ: Поиск Turnstile виджета по cf-turnstile-...");
HtmlElement turnstileWidget = instance.ActiveTab.FindElementByXPath("//div[contains(@id, 'cf-turnstile-')]", 0);

if (turnstileWidget.IsVoid)
{
    // Альтернативный поиск - если не нашли по cf-turnstile-
    project.SendInfoToLog("Первый поиск не дал результатов, пробуем альтернативный...");
    turnstileWidget = instance.ActiveTab.FindElementByXPath("//*[contains(@id, 'cf-chl-widget-') and not(contains(@id, '_response'))]", 0);
}

if (turnstileWidget.IsVoid)
{
    // Поиск по классу Turnstile
    project.SendInfoToLog("Поиск по классу Turnstile...");
    turnstileWidget = instance.ActiveTab.FindElementByXPath("//*[contains(@class, 'Turnstile')]", 0);
}

// ВТОРОЙ ВАРИАНТ: Если первый не сработал, используем поиск через родителя (1-2 уровня)
if (turnstileWidget.IsVoid)
{
    project.SendInfoToLog("ВТОРОЙ ВАРИАНТ: Поиск через родительский элемент (1-2 уровня)...");
    
    // Поиск элемента по динамическому ID
    project.SendInfoToLog("Поиск элемента с cf-chl-widget-...");
    HtmlElement targetElement = instance.ActiveTab.FindElementByXPath("//*[starts-with(@id, 'cf-chl-widget-') and contains(@id, '_response')]", 0);

    if (!targetElement.IsVoid)
    {
        string elementId = targetElement.GetAttribute("id");
        project.SendInfoToLog($"✓ ЭЛЕМЕНТ НАЙДЕН: ID='{elementId}'");
        
        // Ищем родительский элемент с ID (максимум 2 уровня вверх)
        project.SendInfoToLog("Поиск родительского элемента...");
        
        // Сначала ищем на 1 уровне (прямой родитель)
        turnstileWidget = instance.ActiveTab.FindElementByXPath($"//*[@id='{elementId}']/parent::*", 0);
        
        if (turnstileWidget.IsVoid)
        {
            // Затем на 2 уровне (родитель родителя)
            turnstileWidget = instance.ActiveTab.FindElementByXPath($"//*[@id='{elementId}']/parent::*/parent::*", 0);
        }
        
        if (!turnstileWidget.IsVoid)
        {
            string parentId = turnstileWidget.GetAttribute("id");
            string parentTag = turnstileWidget.TagName;
            project.SendInfoToLog($"✓ РОДИТЕЛЬСКИЙ ЭЛЕМЕНТ НАЙДЕН: <{parentTag}> ID='{parentId}'");
        }
        else
        {
            project.SendInfoToLog("✗ Родительский элемент не найден на 1-2 уровнях");
        }
    }
    else
    {
        project.SendInfoToLog("✗ Элемент cf-chl-widget- не найден");
    }
}

// ОБЩАЯ ЧАСТЬ: Работа с найденным элементом
if (!turnstileWidget.IsVoid)
{
    string widgetId = turnstileWidget.GetAttribute("id");
    string widgetClass = turnstileWidget.GetAttribute("class");
    string widgetLeft = turnstileWidget.GetAttribute("leftInbrowser");
    string widgetTop = turnstileWidget.GetAttribute("topInbrowser");
    
    project.SendInfoToLog($"✓ TURNSTILE WIDGET НАЙДЕН: ID='{widgetId}'");
    project.SendInfoToLog($"- Class: '{widgetClass}'");
    project.SendInfoToLog($"- Координаты виджета: X='{widgetLeft}', Y='{widgetTop}'");
    
    if (int.TryParse(widgetLeft, out int widgetX) && int.TryParse(widgetTop, out int widgetY))
    {
        // Координаты для клика по центру виджета
        int clickX = widgetX + 30;
        int clickY = widgetY + 25;
        
        project.SendInfoToLog($"✓ ВЕРНЫЕ КООРДИНАТЫ ДЛЯ КЛИКА: X={clickX}, Y={clickY}");
        
        // НАВЕДЕНИЕ МЫШКИ
        project.SendInfoToLog("Наведение мышки...");
        instance.ActiveTab.FullEmulationMouseMove(clickX, clickY);
        project.SendInfoToLog("✓ Мышь наведена");
        
        // Задержка перед кликом
        System.Threading.Thread.Sleep(1000);
        
        // КЛИК
        project.SendInfoToLog("Клик левой кнопкой мыши...");
        instance.ActiveTab.FullEmulationMouseClick("left", "click");
        project.SendInfoToLog("✓ Клик выполнен");
        
        // ОЖИДАНИЕ РЕЗУЛЬТАТА
        project.SendInfoToLog("Ожидание решения Turnstile...");
        System.Threading.Thread.Sleep(5000);
        
        // ПРОВЕРКА ТОКЕНА
        project.SendInfoToLog("Проверка токена...");
        HtmlElement tokenField = instance.ActiveTab.FindElementByName("cf-turnstile-response");
        
        if (!tokenField.IsVoid)
        {
            string tokenValue = tokenField.GetAttribute("value");
            if (!string.IsNullOrEmpty(tokenValue))
            {
                project.SendInfoToLog($"✓ УСПЕХ: Токен получен!");
                project.SendInfoToLog($"Токен: {tokenValue.Substring(0, Math.Min(30, tokenValue.Length))}...");
            }
            else
            {
                project.SendInfoToLog("Токен еще не получен");
            }
        }
        else
        {
            project.SendInfoToLog("Поле для токена не найдено");
        }
    }
    else
    {
        project.SendInfoToLog("✗ Ошибка преобразования координат");
    }
}
else
{
    project.SendInfoToLog("✗ Turnstile виджет не найден ни одним из методов");
}

project.SendInfoToLog("=== ОПЕРАЦИЯ ЗАВЕРШЕНA ===");
 
Дописал для себя финальную версию которая у меня работает с динамическими значениями
И на разных сайтах код работает как с просто каптчей так и с челенджем
в большинстве случаев код должен работать возможны какие то уникальные случае ( но тесты показали что код хорошо сам находит родителя и определяет координаты )
Спасибо кликает и если она стоит просто на доступ к сайту то всё ок.
А вот в форме есть решение пробить её?
Кто нить подскажет, спасибо заранее!
141436
 
  • Оценить
Реакции: Gfoblin
У всех перестал данный код сабмитить капчу?
Давно не юзал, после обновления ЗП до 7.9 скрипт кликает, но сабмит не происходит. Возможно обновление тут и не при чем, а сам клауд
 
У всех перестал данный код сабмитить капчу?
Давно не юзал, после обновления ЗП до 7.9 скрипт кликает, но сабмит не происходит. Возможно обновление тут и не при чем, а сам клауд
Здравствуйте,

Попробуйте в аргументах запуска прописать такой флаг: --disable-features=WebGPUService
 
  • Оценить
Реакции: Nord
Сейчас на форуме все говорят что любые проблемы решает AI.
Может уже и каптчу Cloudflare порешал AI и теперь уже токены можно генерировать без браузера?
Было бы не плохо...
Или порешать генерацию таких токенов через AI непосильная задача в текущее время?
 
Сейчас на форуме все говорят что любые проблемы решает AI.
Может уже и каптчу Cloudflare порешал AI и теперь уже токены можно генерировать без браузера?
Было бы не плохо...
Или порешать генерацию таких токенов через AI непосильная задача в текущее время?
Если ты про токены каптчи то ещё ИИ не было их можно было на гет запросах делать
 
Если ты про токены каптчи то ещё ИИ не было их можно было на гет запросах делать
Да, о токенах каптчи Cloudflare.
Не встречал, чтобы кто-то решал её без браузера.
Точнее не так, без браузера решают через сервисы, где на стороне сервисов браузер.
А прикольно было бы, чтобы токен генерировался без браузера.
 

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