Recaptha 2 после аудио разгадки новая капча!

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Начал работу. Понял, что нужно менять этот кусок кода.
Код:
// открытие аудиозадания
Action OpenAudioTask= () => {
    project.SendInfoToLog("Открываем форму с аудио заданием", needShowMessages);
    if (isNewView)
    {
        //проверяем тип задания формы
        var task = tab.FindElementByAttribute("div", "class", "rc-imageselect-desc-wrapper", "regexp", 0);
        if (!task.IsVoid) TryOpenAudioForm(); // найдено графическое задание, значит открываем аудио
    }
    else
    {
        var elem = tab.FindElementByAttribute("input:submit", "class", @"fbc-button-audio fbc-button", "regexp", 0);
        if (!elem.IsVoid) elem.Click();
        tab.WaitDownloading();
        var errorElem = tab.FindElementByAttribute("div", "class", "fbc-message", "regexp", 0);
        if (!errorElem.IsVoid)
        {
            var attr = errorElem.GetAttribute("innertext");
            if (attr.Contains("Please enable JavaScript and/or update your browser to get an audio challenge"))
            {
                throw new Exception("Не получилось открыть вкладку с аудиозаданием, попробуйте изменить userAgent");
            }
        }
    }
};
Вот идентификатор текстовой капчи.
Код:
tab.FindElementByAttribute("div", "class", "rc-text-desc-wrapper", "regexp", 0);
 
  • Спасибо
Реакции: redman и feniks_06

feniks_06

Пользователь
Регистрация
10.04.2016
Сообщения
39
Благодарностей
2
Баллы
8
Очень жду Вашего решения :-)
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Тестируйте.

:ci:
Код:
// Основные параметры

// время ожидания
var waitTime = 350;
var waitTime2 = 2600;
// количество попыток распознать
var tryRecognize = 6;
// количество попыток загрузить элемент
var tryLoadElement = 30;
// показывать сообщения о прогрессе распознавания
var needShowMessages = false;
// проверять корректность распознанного ответа
var needToCheck = true;

// Вспомогательные переменные

// вкладка
var tab = instance.ActiveTab;
// поздравляем, вы не робот
var success = false;
// аудио файл
var file = string.Empty;
// файл был удален
var fileDeleted = true;
// ответ на аудио каптчу
var answer = string.Empty;
// новый вид рекаптчи 2
var isNewView = true;
// рекаптча 1
var isRecaptcha1 = false;
// время вышло
var timeout = false;
// ошибка загрузки файла
var fileLoadingError = false;
// cписок урлов скаченных файлов
var usedURLs = new List<string>();

// поиск кнопки открытия формы с аудио заданием
Action TryOpenAudioForm = () => {
    for (int k = 0; k < tryLoadElement; k++)
    {
        var audioButton = tab.FindElementByAttribute("div", "id", "recaptcha-audio-button", "regexp", 0);
        // если нашли
        if (!audioButton.IsVoid)
        {
            // клик по кнопке
            audioButton.Click();
            break;
        }
        System.Threading.Thread.Sleep(waitTime); // подождём немного
        if (k == (tryLoadElement - 1)) timeout = true;
    }
    System.Threading.Thread.Sleep(waitTime); // подождём немного
};

// открытие аудиозадания
Action OpenAudioTask= () => {
    project.SendInfoToLog("Открываем форму с аудио заданием", needShowMessages);
    if (isNewView)
    {
        //проверяем тип задания формы
        var task = tab.FindElementByAttribute("div", "class", "rc-imageselect-desc-wrapper", "regexp", 0);
        if (!task.IsVoid) TryOpenAudioForm(); // найдено графическое задание, значит открываем аудио
    }
    else
    {
        var elem = tab.FindElementByAttribute("input:submit", "class", @"fbc-button-audio fbc-button", "regexp", 0);
        if (!elem.IsVoid) elem.Click();

        tab.WaitDownloading();
        var errorElem = tab.FindElementByAttribute("div", "class", "fbc-message", "regexp", 0);
        if (!errorElem.IsVoid)
        {
            var attr = errorElem.GetAttribute("innertext");
            if (attr.Contains("Please enable JavaScript and/or update your browser to get an audio challenge"))
            {
                throw new Exception("Не получилось открыть вкладку с аудиозаданием, попробуйте изменить userAgent");
            }
        }
    }
};

// Определение версии рекапчи
Action NotRobotClick= () => {
    for (int k = 0; k < tryLoadElement; k++)
    {
        // поиск кнопки "Я не робот"
        var notRobot = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
        // если нашли
        if (!notRobot.IsVoid)
        {
            // клик по кнопке
            notRobot.Click();
            // подождём немного
            System.Threading.Thread.Sleep(waitTime);

            // если ввод каптчи не требуется
            var check = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
            if (!check.IsVoid)
            {
                if (check.OuterHtml.Contains("style=\"\""))
                {
                    success = true;
                    break;
                }
            }

            // Ждем пока загрузится форма
            for (int j = 0; j < tryLoadElement; j++)
            {
                var loadedForm = tab.FindElementByAttribute("div", "class", "primary-controls", "regexp", 0);
                if (!loadedForm.IsVoid) break;
                else System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
                if (j == (tryLoadElement - 1)) timeout = true;
            }
            break;
        }
        else
        {
            // проверяем наличие аудио кнопки рекаптчи 1
            HtmlElement r1 = tab.FindElementById("recaptcha_switch_audio");
            if (!r1.IsVoid)
            {
                r1.Click();
                isRecaptcha1 = true;
                break;
            }

            // проверяем вид рекаптчи2
            var elem = tab.FindElementByAttribute("input:submit", "class", @"fbc-button-audio fbc-button", "regexp", 0);
            if (!elem.IsVoid)
            {
                isNewView = false;
                break;
            }
            System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }
};

// скачиваем mp3-файл
Action GetAudioFile= () => {

    var href = String.Empty;

    // получаем аудио задание
    for (int k = 0; k < tryLoadElement; k++)
    {
        if (isRecaptcha1)
        {
            var audioChallenge = tab.FindElementByAttribute("a", "id", "recaptcha_audio_download", "text", 0);
            // если нашли, получаем ссылку на аудио файл
            if (!audioChallenge.IsVoid)
            {
                href = audioChallenge.GetAttribute("href");
                break;
            }
            else System.Threading.Thread.Sleep(waitTime);
        }
        else
        {
            if (isNewView)
            {
                var audioChallenge = tab.FindElementByAttribute("a", "class", "rc-audiochallenge-download-link", "regexp", 0);
                // если нашли, получаем ссылку на аудио файл
                if (!audioChallenge.IsVoid)
                {
                    href = audioChallenge.GetAttribute("href");
                    break;
                }
                else; // подождём загрузки элемента
                var noaudio = tab.FindElementByAttribute("div", "id", "recaptcha-reload-button", "regexp", 0);
                noaudio.Click();
                System.Threading.Thread.Sleep(waitTime);
                project.SendInfoToLog("Обходим текстовую капчу", needShowMessages);
            }
            else
            {
                var audioChallenge = tab.FindElementByAttribute("audio", "class", "fbc-audio-controls", "regexp", 0);
                // если нашли, получаем ссылку на аудио файл
                if (!audioChallenge.IsVoid)
                {
                    href = audioChallenge.FindChildByAttribute("source", "src", ".mp3", "text", 0).GetAttribute("src");
                    href = "https://www.google.com" + href;
                    break;
                }
                else System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
            }
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    foreach (var usedUrl in usedURLs)
    {
        if (usedUrl.Contains(href))
            throw new Exception("Отсутствует новый аудио файл");
    }
    usedURLs.Add(href);

    project.SendInfoToLog("Скачиваем аудио файл", needShowMessages);
    try
    {
        var proxy = instance.GetProxy();
        var respType = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File;
        var timeoutRequest = 30000;
        var cookies = instance.GetCookie("google.com", true);
        var userAgent = project.Profile.UserAgent;
        var maxRedirectCount = 1;
        var downloadPath = project.Directory + "\\audiofiles";
        file = ZennoPoster.HttpGet(href, proxy, "UTF8", respType, timeoutRequest, cookies, userAgent, false, maxRedirectCount, null, downloadPath);
        fileDeleted = false;
    }
    catch (Exception ex)
    {
        throw new Exception("Не удалось скачать аудио файл");
    }
};

Action Recognize= () => {
    project.SendInfoToLog("Распознаем", needShowMessages);
    try
    {
        if (!File.Exists(file))
        {
            fileLoadingError = true;
            fileDeleted = true;
            return;
        }
        var bytes = File.ReadAllBytes(file);
        if (bytes.Length < 1024)
        {
            fileLoadingError = true;
            return;
        }
        string str = Convert.ToBase64String(bytes);
        var rc = ZennoPoster.CaptchaRecognition("CapMonster2.dll", str, "CapMonsterModule=ZennoLab.AudioReCaptcha&ParallelMode=true");
        answer = rc.Split(new [] {"-|-"}, StringSplitOptions.RemoveEmptyEntries)[0];
                if (answer.Contains("133193320491090004119440")) throw new Exception("Your IP was banned!");
    }
    finally
    {
        if (File.Exists(file))
       {
            File.Delete(file);
            fileDeleted = true;
        }
    }
};

Action InputAnswer= () => {
    if (!String.IsNullOrEmpty(answer) && answer != "sorry")
    {
        project.SendInfoToLog("Вводим ответ", needShowMessages);
        HtmlElement audioAnswerInput = null;
        // ищем поле для ввода ответа
        if (isRecaptcha1)
        {
            audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "recaptcha_response_field", "text", 0);
        }
        else
        {
            if (isNewView) audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "audio-response", "regexp", 0);
            else audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "response", "text", 0);
        }

        // если нашли
        if (!audioAnswerInput.IsVoid)
        {
            // вводим ответ
            audioAnswerInput.SetValue(answer, "None", false);
        }

        // подождём немного
        System.Threading.Thread.Sleep(waitTime);
    }
    else throw new Exception("Ответ не получен");
};

// Подтверждаем
Action SubmitAnswer= () => {
    // ищем кнопку "Подтвердить"
    HtmlElement apply = null;
    if (isNewView) apply = tab.FindElementById("recaptcha-verify-button");
    else apply = tab.FindElementByAttribute("div", "class", "fbc-button-verify", "regexp", 0).FindChildByAttribute("input:submit", "fulltag", "input:submit", "text", 0);

    if (!apply.IsVoid) apply.Click();

    // подождём немного
    System.Threading.Thread.Sleep(waitTime2);
};

// Проверяем правильность для старого вида рекапчи 2
Action CheckOldView= () => {
    // Проверяем, была ли ошибка в распознавании
    project.SendInfoToLog("Проверяем правильность", needShowMessages);
    HtmlElement he = tab.FindElementByAttribute("div", "class", "fbc-error", "regexp", 0);
    if (!he.IsVoid)
    {
        return;
    }

    string txt = string.Empty;
    // ищем текст, который надо вставить
    for (int k = 0; k < tryLoadElement; k++)
    {
        HtmlElement heGetText = tab.FindElementByAttribute("textarea", "dir", "ltr", "regexp", 0);
        if (!heGetText.IsVoid)
        {
            txt = heGetText.GetAttribute("value");
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    // ищем куда вставлять текст
    for (int k = 0; k < tryLoadElement; k++)
    {
        HtmlElement hePutText = tab.FindElementByAttribute("textarea", "id", "g-recaptcha-response", "regexp", 0);
        if (!hePutText.IsVoid)
        {
            hePutText.SetValue(txt, "None", false);
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    // нажимаем "Подтвердить"
    for (int k = 0; k < tryLoadElement; k++)
    {
        var submit = tab.FindElementByAttribute("input:submit", "fulltag", "input:submit", "regexp", 0);
        if (!submit.IsVoid)
        {
            submit.Click();
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime2); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }
    success = true;
};

// проверим правильность ответа рекапчи 2
Action Check= () => {
    project.SendInfoToLog("Проверяем правильность", needShowMessages);
    for (int k = 0; k < tryLoadElement; k++)
    {
        var checkAnswer = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
        if (!checkAnswer.IsVoid)
        {
            if (checkAnswer.OuterHtml.Contains("style=\"\""))
                success = true;
            else
                success = false;
            return;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
        System.Threading.Thread.Sleep(waitTime2);
    }
};

// Кликаем по кнопке я не робот, если она есть
NotRobotClick();
if (success) return "ok";

// Пытаемся распознать рекапчу
for (int i = 0; i < tryRecognize; i++)
{
    int z = i;
    z++;
    project.SendInfoToLog(Convert.ToString(z)+" попытка", needShowMessages);
    if (!isRecaptcha1) OpenAudioTask();
    if (timeout) break;
    GetAudioFile();
    if (timeout) break;
    Recognize();
    if (fileLoadingError)
    {
        fileLoadingError = false;
        continue;
    }
    if (timeout) break;
    InputAnswer();
    if (timeout) break;
    if (!fileDeleted)
    {
        if (File.Exists(file))
        {
            File.Delete(file);
            fileDeleted = true;
        }
    }

    if (isRecaptcha1) return "ok";
    SubmitAnswer();

    if (!needToCheck) return "ok";

    if (timeout) break;
    if (!isNewView) CheckOldView();
    else Check();
    if (success) return "ok";
}

if (timeout) throw new Exception("Вышло время ожидания загрузки элемента");
else throw new Exception("Не распознано. Закончились попытки распознать, прежде чем ответ был засчитан");
Измененения в строчках.

4, 5, 7, 9, 11, 173-176, 290, 349, 372, 383-385
 
Последнее редактирование:

feniks_06

Пользователь
Регистрация
10.04.2016
Сообщения
39
Благодарностей
2
Баллы
8
Mikhail B. - СУПЕР! работает! Большое спасибо.
 
  • Спасибо
Реакции: Mikhail B.

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
Тестируйте.

:ci:
Код:
// Основные параметры

// время ожидания
var waitTime = 350;
var waitTime2 = 2600;
// количество попыток распознать
var tryRecognize = 6;
// количество попыток загрузить элемент
var tryLoadElement = 30;
// показывать сообщения о прогрессе распознавания
var needShowMessages = false;
// проверять корректность распознанного ответа
var needToCheck = true;

// Вспомогательные переменные

// вкладка
var tab = instance.ActiveTab;
// поздравляем, вы не робот
var success = false;
// аудио файл
var file = string.Empty;
// файл был удален
var fileDeleted = true;
// ответ на аудио каптчу
var answer = string.Empty;
// новый вид рекаптчи 2
var isNewView = true;
// рекаптча 1
var isRecaptcha1 = false;
// время вышло
var timeout = false;
// ошибка загрузки файла
var fileLoadingError = false;
// cписок урлов скаченных файлов
var usedURLs = new List<string>();

// поиск кнопки открытия формы с аудио заданием
Action TryOpenAudioForm = () => {
    for (int k = 0; k < tryLoadElement; k++)
    {
        var audioButton = tab.FindElementByAttribute("div", "id", "recaptcha-audio-button", "regexp", 0);
        // если нашли
        if (!audioButton.IsVoid)
        {
            // клик по кнопке
            audioButton.Click();
            break;
        }
        System.Threading.Thread.Sleep(waitTime); // подождём немного
        if (k == (tryLoadElement - 1)) timeout = true;
    }
    System.Threading.Thread.Sleep(waitTime); // подождём немного
};

// открытие аудиозадания
Action OpenAudioTask= () => {
    project.SendInfoToLog("Открываем форму с аудио заданием", needShowMessages);
    if (isNewView)
    {
        //проверяем тип задания формы
        var task = tab.FindElementByAttribute("div", "class", "rc-imageselect-desc-wrapper", "regexp", 0);
        if (!task.IsVoid) TryOpenAudioForm(); // найдено графическое задание, значит открываем аудио
    }
    else
    {
        var elem = tab.FindElementByAttribute("input:submit", "class", @"fbc-button-audio fbc-button", "regexp", 0);
        if (!elem.IsVoid) elem.Click();

        tab.WaitDownloading();
        var errorElem = tab.FindElementByAttribute("div", "class", "fbc-message", "regexp", 0);
        if (!errorElem.IsVoid)
        {
            var attr = errorElem.GetAttribute("innertext");
            if (attr.Contains("Please enable JavaScript and/or update your browser to get an audio challenge"))
            {
                throw new Exception("Не получилось открыть вкладку с аудиозаданием, попробуйте изменить userAgent");
            }
        }
    }
};

// Определение версии рекапчи
Action NotRobotClick= () => {
    for (int k = 0; k < tryLoadElement; k++)
    {
        // поиск кнопки "Я не робот"
        var notRobot = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
        // если нашли
        if (!notRobot.IsVoid)
        {
            // клик по кнопке
            notRobot.Click();
            // подождём немного
            System.Threading.Thread.Sleep(waitTime);

            // если ввод каптчи не требуется
            var check = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
            if (!check.IsVoid)
            {
                if (check.OuterHtml.Contains("style=\"\""))
                {
                    success = true;
                    break;
                }
            }

            // Ждем пока загрузится форма
            for (int j = 0; j < tryLoadElement; j++)
            {
                var loadedForm = tab.FindElementByAttribute("div", "class", "primary-controls", "regexp", 0);
                if (!loadedForm.IsVoid) break;
                else System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
                if (j == (tryLoadElement - 1)) timeout = true;
            }
            break;
        }
        else
        {
            // проверяем наличие аудио кнопки рекаптчи 1
            HtmlElement r1 = tab.FindElementById("recaptcha_switch_audio");
            if (!r1.IsVoid)
            {
                r1.Click();
                isRecaptcha1 = true;
                break;
            }

            // проверяем вид рекаптчи2
            var elem = tab.FindElementByAttribute("input:submit", "class", @"fbc-button-audio fbc-button", "regexp", 0);
            if (!elem.IsVoid)
            {
                isNewView = false;
                break;
            }
            System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }
};

// скачиваем mp3-файл
Action GetAudioFile= () => {

    var href = String.Empty;

    // получаем аудио задание
    for (int k = 0; k < tryLoadElement; k++)
    {
        if (isRecaptcha1)
        {
            var audioChallenge = tab.FindElementByAttribute("a", "id", "recaptcha_audio_download", "text", 0);
            // если нашли, получаем ссылку на аудио файл
            if (!audioChallenge.IsVoid)
            {
                href = audioChallenge.GetAttribute("href");
                break;
            }
            else System.Threading.Thread.Sleep(waitTime);
        }
        else
        {
            if (isNewView)
            {
                var audioChallenge = tab.FindElementByAttribute("a", "class", "rc-audiochallenge-download-link", "regexp", 0);
                // если нашли, получаем ссылку на аудио файл
                if (!audioChallenge.IsVoid)
                {
                    href = audioChallenge.GetAttribute("href");
                    break;
                }
                else; // подождём загрузки элемента
                var noaudio = tab.FindElementByAttribute("div", "id", "recaptcha-reload-button", "regexp", 0);
                noaudio.Click();
                System.Threading.Thread.Sleep(waitTime);
                project.SendInfoToLog("Обходим текстовую капчу", needShowMessages);
            }
            else
            {
                var audioChallenge = tab.FindElementByAttribute("audio", "class", "fbc-audio-controls", "regexp", 0);
                // если нашли, получаем ссылку на аудио файл
                if (!audioChallenge.IsVoid)
                {
                    href = audioChallenge.FindChildByAttribute("source", "src", ".mp3", "text", 0).GetAttribute("src");
                    href = "https://www.google.com" + href;
                    break;
                }
                else System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
            }
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    foreach (var usedUrl in usedURLs)
    {
        if (usedUrl.Contains(href))
            throw new Exception("Отсутствует новый аудио файл");
    }
    usedURLs.Add(href);

    project.SendInfoToLog("Скачиваем аудио файл", needShowMessages);
    try
    {
        var proxy = instance.GetProxy();
        var respType = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File;
        var timeoutRequest = 30000;
        var cookies = instance.GetCookie("google.com", true);
        var userAgent = project.Profile.UserAgent;
        var maxRedirectCount = 1;
        var downloadPath = project.Directory + "\\audiofiles";
        file = ZennoPoster.HttpGet(href, proxy, "UTF8", respType, timeoutRequest, cookies, userAgent, false, maxRedirectCount, null, downloadPath);
        fileDeleted = false;
    }
    catch (Exception ex)
    {
        throw new Exception("Не удалось скачать аудио файл");
    }
};

Action Recognize= () => {
    project.SendInfoToLog("Распознаем", needShowMessages);
    try
    {
        if (!File.Exists(file))
        {
            fileLoadingError = true;
            fileDeleted = true;
            return;
        }
        var bytes = File.ReadAllBytes(file);
        if (bytes.Length < 1024)
        {
            fileLoadingError = true;
            return;
        }
        string str = Convert.ToBase64String(bytes);
        var rc = ZennoPoster.CaptchaRecognition("CapMonster2.dll", str, "CapMonsterModule=ZennoLab.AudioReCaptcha&ParallelMode=true");
        answer = rc.Split(new [] {"-|-"}, StringSplitOptions.RemoveEmptyEntries)[0];
                if (answer.Contains("133193320491090004119440")) throw new Exception("Your IP was banned!");
    }
    finally
    {
        if (File.Exists(file))
       {
            File.Delete(file);
            fileDeleted = true;
        }
    }
};

Action InputAnswer= () => {
    if (!String.IsNullOrEmpty(answer) && answer != "sorry")
    {
        project.SendInfoToLog("Вводим ответ", needShowMessages);
        HtmlElement audioAnswerInput = null;
        // ищем поле для ввода ответа
        if (isRecaptcha1)
        {
            audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "recaptcha_response_field", "text", 0);
        }
        else
        {
            if (isNewView) audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "audio-response", "regexp", 0);
            else audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "response", "text", 0);
        }

        // если нашли
        if (!audioAnswerInput.IsVoid)
        {
            // вводим ответ
            audioAnswerInput.SetValue(answer, "None", false);
        }

        // подождём немного
        System.Threading.Thread.Sleep(waitTime);
    }
    else throw new Exception("Ответ не получен");
};

// Подтверждаем
Action SubmitAnswer= () => {
    // ищем кнопку "Подтвердить"
    HtmlElement apply = null;
    if (isNewView) apply = tab.FindElementById("recaptcha-verify-button");
    else apply = tab.FindElementByAttribute("div", "class", "fbc-button-verify", "regexp", 0).FindChildByAttribute("input:submit", "fulltag", "input:submit", "text", 0);

    if (!apply.IsVoid) apply.Click();

    // подождём немного
    System.Threading.Thread.Sleep(waitTime2);
};

// Проверяем правильность для старого вида рекапчи 2
Action CheckOldView= () => {
    // Проверяем, была ли ошибка в распознавании
    project.SendInfoToLog("Проверяем правильность", needShowMessages);
    HtmlElement he = tab.FindElementByAttribute("div", "class", "fbc-error", "regexp", 0);
    if (!he.IsVoid)
    {
        return;
    }

    string txt = string.Empty;
    // ищем текст, который надо вставить
    for (int k = 0; k < tryLoadElement; k++)
    {
        HtmlElement heGetText = tab.FindElementByAttribute("textarea", "dir", "ltr", "regexp", 0);
        if (!heGetText.IsVoid)
        {
            txt = heGetText.GetAttribute("value");
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    // ищем куда вставлять текст
    for (int k = 0; k < tryLoadElement; k++)
    {
        HtmlElement hePutText = tab.FindElementByAttribute("textarea", "id", "g-recaptcha-response", "regexp", 0);
        if (!hePutText.IsVoid)
        {
            hePutText.SetValue(txt, "None", false);
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    // нажимаем "Подтвердить"
    for (int k = 0; k < tryLoadElement; k++)
    {
        var submit = tab.FindElementByAttribute("input:submit", "fulltag", "input:submit", "regexp", 0);
        if (!submit.IsVoid)
        {
            submit.Click();
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime2); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }
    success = true;
};

// проверим правильность ответа рекапчи 2
Action Check= () => {
    project.SendInfoToLog("Проверяем правильность", needShowMessages);
    for (int k = 0; k < tryLoadElement; k++)
    {
        var checkAnswer = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
        if (!checkAnswer.IsVoid)
        {
            if (checkAnswer.OuterHtml.Contains("style=\"\""))
                success = true;
            else
                success = false;
            return;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
        System.Threading.Thread.Sleep(waitTime2);
    }
};

// Кликаем по кнопке я не робот, если она есть
NotRobotClick();
if (success) return "ok";

// Пытаемся распознать рекапчу
for (int i = 0; i < tryRecognize; i++)
{
    int z = i;
    z++;
    project.SendInfoToLog(Convert.ToString(z)+" попытка", needShowMessages);
    if (!isRecaptcha1) OpenAudioTask();
    if (timeout) break;
    GetAudioFile();
    if (timeout) break;
    Recognize();
    if (fileLoadingError)
    {
        fileLoadingError = false;
        continue;
    }
    if (timeout) break;
    InputAnswer();
    if (timeout) break;
    if (!fileDeleted)
    {
        if (File.Exists(file))
        {
            File.Delete(file);
            fileDeleted = true;
        }
    }

    if (isRecaptcha1) return "ok";
    SubmitAnswer();

    if (!needToCheck) return "ok";

    if (timeout) break;
    if (!isNewView) CheckOldView();
    else Check();
    if (success) return "ok";
}

if (timeout) throw new Exception("Вышло время ожидания загрузки элемента");
else throw new Exception("Не распознано. Закончились попытки распознать, прежде чем ответ был засчитан");
Измененения в строчках.

4, 5, 7, 9, 11, 173-176, 290, 349, 372, 383-385
2 подряд идущие новые не берёт?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113

Andi88

Client
Регистрация
17.10.2015
Сообщения
228
Благодарностей
26
Баллы
28
если новая капча, он обновляет а потом опять новая, он выдаст ошибку нет аудио?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
если новая капча, он обновляет а потом опять новая, он выдаст ошибку нет аудио?
нет, он будет обновлять пока не появиться аудио (как правило с 1-2 раза появляеться) или гугл сума не сойдет :D Кол-во попыток 9 строка (не стоит ее менят если все работает, я и так убавил ее вдвое)
 
  • Спасибо
Реакции: Andi88

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 657
Благодарностей
656
Баллы
113
А на пост запросе как перезагрузить?) Придется тоже допиливать.
P.S. Допилил, 1-2 раза перезагрузить и выдает аудио,как надо.
 
Последнее редактирование:

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
Тестируйте.

:ci:
Код:
// Основные параметры

// время ожидания
var waitTime = 350;
var waitTime2 = 2600;
// количество попыток распознать
var tryRecognize = 6;
// количество попыток загрузить элемент
var tryLoadElement = 30;
// показывать сообщения о прогрессе распознавания
var needShowMessages = false;
// проверять корректность распознанного ответа
var needToCheck = true;

// Вспомогательные переменные

// вкладка
var tab = instance.ActiveTab;
// поздравляем, вы не робот
var success = false;
// аудио файл
var file = string.Empty;
// файл был удален
var fileDeleted = true;
// ответ на аудио каптчу
var answer = string.Empty;
// новый вид рекаптчи 2
var isNewView = true;
// рекаптча 1
var isRecaptcha1 = false;
// время вышло
var timeout = false;
// ошибка загрузки файла
var fileLoadingError = false;
// cписок урлов скаченных файлов
var usedURLs = new List<string>();

// поиск кнопки открытия формы с аудио заданием
Action TryOpenAudioForm = () => {
    for (int k = 0; k < tryLoadElement; k++)
    {
        var audioButton = tab.FindElementByAttribute("div", "id", "recaptcha-audio-button", "regexp", 0);
        // если нашли
        if (!audioButton.IsVoid)
        {
            // клик по кнопке
            audioButton.Click();
            break;
        }
        System.Threading.Thread.Sleep(waitTime); // подождём немного
        if (k == (tryLoadElement - 1)) timeout = true;
    }
    System.Threading.Thread.Sleep(waitTime); // подождём немного
};

// открытие аудиозадания
Action OpenAudioTask= () => {
    project.SendInfoToLog("Открываем форму с аудио заданием", needShowMessages);
    if (isNewView)
    {
        //проверяем тип задания формы
        var task = tab.FindElementByAttribute("div", "class", "rc-imageselect-desc-wrapper", "regexp", 0);
        if (!task.IsVoid) TryOpenAudioForm(); // найдено графическое задание, значит открываем аудио
    }
    else
    {
        var elem = tab.FindElementByAttribute("input:submit", "class", @"fbc-button-audio fbc-button", "regexp", 0);
        if (!elem.IsVoid) elem.Click();

        tab.WaitDownloading();
        var errorElem = tab.FindElementByAttribute("div", "class", "fbc-message", "regexp", 0);
        if (!errorElem.IsVoid)
        {
            var attr = errorElem.GetAttribute("innertext");
            if (attr.Contains("Please enable JavaScript and/or update your browser to get an audio challenge"))
            {
                throw new Exception("Не получилось открыть вкладку с аудиозаданием, попробуйте изменить userAgent");
            }
        }
    }
};

// Определение версии рекапчи
Action NotRobotClick= () => {
    for (int k = 0; k < tryLoadElement; k++)
    {
        // поиск кнопки "Я не робот"
        var notRobot = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
        // если нашли
        if (!notRobot.IsVoid)
        {
            // клик по кнопке
            notRobot.Click();
            // подождём немного
            System.Threading.Thread.Sleep(waitTime);

            // если ввод каптчи не требуется
            var check = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
            if (!check.IsVoid)
            {
                if (check.OuterHtml.Contains("style=\"\""))
                {
                    success = true;
                    break;
                }
            }

            // Ждем пока загрузится форма
            for (int j = 0; j < tryLoadElement; j++)
            {
                var loadedForm = tab.FindElementByAttribute("div", "class", "primary-controls", "regexp", 0);
                if (!loadedForm.IsVoid) break;
                else System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
                if (j == (tryLoadElement - 1)) timeout = true;
            }
            break;
        }
        else
        {
            // проверяем наличие аудио кнопки рекаптчи 1
            HtmlElement r1 = tab.FindElementById("recaptcha_switch_audio");
            if (!r1.IsVoid)
            {
                r1.Click();
                isRecaptcha1 = true;
                break;
            }

            // проверяем вид рекаптчи2
            var elem = tab.FindElementByAttribute("input:submit", "class", @"fbc-button-audio fbc-button", "regexp", 0);
            if (!elem.IsVoid)
            {
                isNewView = false;
                break;
            }
            System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }
};

// скачиваем mp3-файл
Action GetAudioFile= () => {

    var href = String.Empty;

    // получаем аудио задание
    for (int k = 0; k < tryLoadElement; k++)
    {
        if (isRecaptcha1)
        {
            var audioChallenge = tab.FindElementByAttribute("a", "id", "recaptcha_audio_download", "text", 0);
            // если нашли, получаем ссылку на аудио файл
            if (!audioChallenge.IsVoid)
            {
                href = audioChallenge.GetAttribute("href");
                break;
            }
            else System.Threading.Thread.Sleep(waitTime);
        }
        else
        {
            if (isNewView)
            {
                var audioChallenge = tab.FindElementByAttribute("a", "class", "rc-audiochallenge-download-link", "regexp", 0);
                // если нашли, получаем ссылку на аудио файл
                if (!audioChallenge.IsVoid)
                {
                    href = audioChallenge.GetAttribute("href");
                    break;
                }
                else; // подождём загрузки элемента
                var noaudio = tab.FindElementByAttribute("div", "id", "recaptcha-reload-button", "regexp", 0);
                noaudio.Click();
                System.Threading.Thread.Sleep(waitTime);
                project.SendInfoToLog("Обходим текстовую капчу", needShowMessages);
            }
            else
            {
                var audioChallenge = tab.FindElementByAttribute("audio", "class", "fbc-audio-controls", "regexp", 0);
                // если нашли, получаем ссылку на аудио файл
                if (!audioChallenge.IsVoid)
                {
                    href = audioChallenge.FindChildByAttribute("source", "src", ".mp3", "text", 0).GetAttribute("src");
                    href = "https://www.google.com" + href;
                    break;
                }
                else System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
            }
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    foreach (var usedUrl in usedURLs)
    {
        if (usedUrl.Contains(href))
            throw new Exception("Отсутствует новый аудио файл");
    }
    usedURLs.Add(href);

    project.SendInfoToLog("Скачиваем аудио файл", needShowMessages);
    try
    {
        var proxy = instance.GetProxy();
        var respType = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File;
        var timeoutRequest = 30000;
        var cookies = instance.GetCookie("google.com", true);
        var userAgent = project.Profile.UserAgent;
        var maxRedirectCount = 1;
        var downloadPath = project.Directory + "\\audiofiles";
        file = ZennoPoster.HttpGet(href, proxy, "UTF8", respType, timeoutRequest, cookies, userAgent, false, maxRedirectCount, null, downloadPath);
        fileDeleted = false;
    }
    catch (Exception ex)
    {
        throw new Exception("Не удалось скачать аудио файл");
    }
};

Action Recognize= () => {
    project.SendInfoToLog("Распознаем", needShowMessages);
    try
    {
        if (!File.Exists(file))
        {
            fileLoadingError = true;
            fileDeleted = true;
            return;
        }
        var bytes = File.ReadAllBytes(file);
        if (bytes.Length < 1024)
        {
            fileLoadingError = true;
            return;
        }
        string str = Convert.ToBase64String(bytes);
        var rc = ZennoPoster.CaptchaRecognition("CapMonster2.dll", str, "CapMonsterModule=ZennoLab.AudioReCaptcha&ParallelMode=true");
        answer = rc.Split(new [] {"-|-"}, StringSplitOptions.RemoveEmptyEntries)[0];
                if (answer.Contains("133193320491090004119440")) throw new Exception("Your IP was banned!");
    }
    finally
    {
        if (File.Exists(file))
       {
            File.Delete(file);
            fileDeleted = true;
        }
    }
};

Action InputAnswer= () => {
    if (!String.IsNullOrEmpty(answer) && answer != "sorry")
    {
        project.SendInfoToLog("Вводим ответ", needShowMessages);
        HtmlElement audioAnswerInput = null;
        // ищем поле для ввода ответа
        if (isRecaptcha1)
        {
            audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "recaptcha_response_field", "text", 0);
        }
        else
        {
            if (isNewView) audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "audio-response", "regexp", 0);
            else audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "response", "text", 0);
        }

        // если нашли
        if (!audioAnswerInput.IsVoid)
        {
            // вводим ответ
            audioAnswerInput.SetValue(answer, "None", false);
        }

        // подождём немного
        System.Threading.Thread.Sleep(waitTime);
    }
    else throw new Exception("Ответ не получен");
};

// Подтверждаем
Action SubmitAnswer= () => {
    // ищем кнопку "Подтвердить"
    HtmlElement apply = null;
    if (isNewView) apply = tab.FindElementById("recaptcha-verify-button");
    else apply = tab.FindElementByAttribute("div", "class", "fbc-button-verify", "regexp", 0).FindChildByAttribute("input:submit", "fulltag", "input:submit", "text", 0);

    if (!apply.IsVoid) apply.Click();

    // подождём немного
    System.Threading.Thread.Sleep(waitTime2);
};

// Проверяем правильность для старого вида рекапчи 2
Action CheckOldView= () => {
    // Проверяем, была ли ошибка в распознавании
    project.SendInfoToLog("Проверяем правильность", needShowMessages);
    HtmlElement he = tab.FindElementByAttribute("div", "class", "fbc-error", "regexp", 0);
    if (!he.IsVoid)
    {
        return;
    }

    string txt = string.Empty;
    // ищем текст, который надо вставить
    for (int k = 0; k < tryLoadElement; k++)
    {
        HtmlElement heGetText = tab.FindElementByAttribute("textarea", "dir", "ltr", "regexp", 0);
        if (!heGetText.IsVoid)
        {
            txt = heGetText.GetAttribute("value");
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    // ищем куда вставлять текст
    for (int k = 0; k < tryLoadElement; k++)
    {
        HtmlElement hePutText = tab.FindElementByAttribute("textarea", "id", "g-recaptcha-response", "regexp", 0);
        if (!hePutText.IsVoid)
        {
            hePutText.SetValue(txt, "None", false);
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }

    // нажимаем "Подтвердить"
    for (int k = 0; k < tryLoadElement; k++)
    {
        var submit = tab.FindElementByAttribute("input:submit", "fulltag", "input:submit", "regexp", 0);
        if (!submit.IsVoid)
        {
            submit.Click();
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(waitTime2); // подождём немного
            continue;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
    }
    success = true;
};

// проверим правильность ответа рекапчи 2
Action Check= () => {
    project.SendInfoToLog("Проверяем правильность", needShowMessages);
    for (int k = 0; k < tryLoadElement; k++)
    {
        var checkAnswer = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
        if (!checkAnswer.IsVoid)
        {
            if (checkAnswer.OuterHtml.Contains("style=\"\""))
                success = true;
            else
                success = false;
            return;
        }
        if (k == (tryLoadElement - 1)) timeout = true;
        System.Threading.Thread.Sleep(waitTime2);
    }
};

// Кликаем по кнопке я не робот, если она есть
NotRobotClick();
if (success) return "ok";

// Пытаемся распознать рекапчу
for (int i = 0; i < tryRecognize; i++)
{
    int z = i;
    z++;
    project.SendInfoToLog(Convert.ToString(z)+" попытка", needShowMessages);
    if (!isRecaptcha1) OpenAudioTask();
    if (timeout) break;
    GetAudioFile();
    if (timeout) break;
    Recognize();
    if (fileLoadingError)
    {
        fileLoadingError = false;
        continue;
    }
    if (timeout) break;
    InputAnswer();
    if (timeout) break;
    if (!fileDeleted)
    {
        if (File.Exists(file))
        {
            File.Delete(file);
            fileDeleted = true;
        }
    }

    if (isRecaptcha1) return "ok";
    SubmitAnswer();

    if (!needToCheck) return "ok";

    if (timeout) break;
    if (!isNewView) CheckOldView();
    else Check();
    if (success) return "ok";
}

if (timeout) throw new Exception("Вышло время ожидания загрузки элемента");
else throw new Exception("Не распознано. Закончились попытки распознать, прежде чем ответ был засчитан");
Измененения в строчках.

4, 5, 7, 9, 11, 173-176, 290, 349, 372, 383-385
Это мой первый опыт работы с модулем. Не могу понять, зелёная галочка от рекапчи появляется, но экшен всё равно уходит в неуспех.... :(
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
Мало информации, вы делали по этой инструкции?
http://zennolab.com/wiki/rc-audio
Я использую ваш обновлённый код и больше ничего. Суть в том, что капча распознаётся и галочка (которая в капче) появляется, но вот экшен не завершается успехом, как будто не работают условия проверки в коде.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Я использую ваш обновлённый код и больше ничего. Суть в том, что капча распознаётся и галочка (которая в капче) появляется, но вот экшен не завершается успехом, как будто не работают условия проверки в коде.
Странно, попробуйте значение в 4 строке заменить с 350 на 2000.
Может вы забыли переменную назначить для снипета?
А вобще прогоните в PM и пришлите сюда, что в логе пишет, после ошибки.
 

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
Странно, попробуйте значение в 4 строке заменить с 350 на 2000.
Может вы забыли переменную назначить для снипета?
А вобще прогоните в PM и пришлите сюда, что в логе пишет, после ошибки.
Снипет что-то возвращает и ему нужна переменная? o_O вот что значит первый опыт. Теперь получилось, спасибо.
 
  • Спасибо
Реакции: Mikhail B.

pavelbond

Client
Регистрация
07.05.2015
Сообщения
91
Благодарностей
3
Баллы
8
постоянно что то сегодня пишет Вы должны выполнить несколько заданий. (( через аудио капчу, кстати заметил что через проджек майкер все хорошо а вот взенке вот так выдает(
Пользуюсь своим ап
 
Последнее редактирование:

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
постоянно что то сегодня пишет Вы должны выполнить несколько заданий. (( через аудио капчу, кстати заметил что через проджек майкер все хорошо а вот взенке вот так выдает(
Пользуюсь своим ап
Разрешение окна инстанса попробуй поменять.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113
да там вопрос и ответ на новую каптчу не в зашифрованом виде дают, ломайте пока есть возможность ))
 
  • Спасибо
Реакции: dedok3000

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 657
Благодарностей
656
Баллы
113

pavelbond

Client
Регистрация
07.05.2015
Сообщения
91
Благодарностей
3
Баллы
8
Ребят был ли бан по ап? если да что делать?)) личный ап без прокси работал(( конечно я так думаю что можно поменять у провайдера(
 

pavelbond

Client
Регистрация
07.05.2015
Сообщения
91
Благодарностей
3
Баллы
8
использовал новыый снипет, делал на разгадывание капчи) кран так сказать эксплаутировал) тестировал) до тестировался. Спс кстати за снипет очень классный)) в хорошем смысле.
Данный вопрос решился, ап динамический) но используйте прокси баны пошли
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.

Egorko

Client
Регистрация
19.11.2015
Сообщения
40
Благодарностей
11
Баллы
8
Mikhail B. Благодарю, то что надо! Всё работает
 

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
399
Благодарностей
92
Баллы
28
отличный снипет, работает на ура. спасибо. надуюсь гугл не забанит мой ip :-)
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113

Вложения

Последнее редактирование:
  • Спасибо
Реакции: Roman*

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Собрал небольшую статистику по попыткам, прокси дешевые использовал.

1 попытка - 100
2 попытки - 560
3 попытки - 222
4 попытки - 120
5 попыток - 85
6 попыток - 37
7 попыток - 24
8 попыток - 11
9 попыток - 10
10 попыток- 5
11 попыток- 3
12 попыток- 3
13 попыток- 4
14 попыток- 2
Не удача - 112

Исходя из данных выше, думаю самый логичный выбор это 7 попыток.
 
  • Спасибо
Реакции: dedok3000

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
Собрал небольшую статистику по попыткам, прокси дешевые использовал.

1 попытка - 100
2 попытки - 560
3 попытки - 222
4 попытки - 120
5 попыток - 85
6 попыток - 37
7 попыток - 24
8 попыток - 11
9 попыток - 10
10 попыток- 5
11 попыток- 3
12 попыток- 3
13 попыток- 4
14 попыток- 2
Не удача - 112

Исходя из данных выше, думаю самый логичный выбор это 7 попыток.
Что происходит в случае неудачи? Требуется разгадать картинки или этот новый вид капчи?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Что происходит в случае неудачи? Требуется разгадать картинки или этот новый вид капчи?
У меня регистрации, по этому я просто завершаю выполнение шаблона.
Как правило неудача, это когда IP достиг лимита разгадываний, либо лимита достиг сниппет.

Если бы мы сделали 7 попыток, то неудач было бы 160 а не 120, а если 5, то 221.
Тут вопрос времени, у меня от начала шаблона до начала разгадывания уходит время за которое кап разгадывает 2 попытки, по этому мне выгоднее подождать 5-7 попыток, чем ждать в пустую. Но если у вас капча в середине шаблона, то конечно, тут надо выставлять по максимуму. С другой стороны, любой нормальный человек не будет 14 раз разгадывать, это сумасшествие.
 
Последнее редактирование:

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
У меня регистрации, по этому я просто завершаю выполнение шаблона.
Как правило неудача, это когда IP достиг лимита разгадываний.
Ну да, я имею ввиду в чём причина неудачи? Появляется этот новый вид капчи, который не переключить на аудио даже после 14 попыток?
 

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