zennoX
Client
- Регистрация
- 05.04.2014
- Сообщения
- 484
- Благодарностей
- 134
- Баллы
- 43
вот именно, кому надо,Кому надо - тот всегда сообразит какая была логика работы шаба, как ни прячь ))) Опять же фидлер ещё никто не отменял
для остальных скрыть)
вот именно, кому надо,Кому надо - тот всегда сообразит какая была логика работы шаба, как ни прячь ))) Опять же фидлер ещё никто не отменял
Не говорите, что мне делать, и я не скажу, куда Вам идти.ну тогда не продавай шаблонов - продавай их результат!
Я не предлагал, раз туда пошел, значит на это себя и ценишь.Ну ити тебе на 3 букви куда мне предложил.
Не хами !
А по поводу совета это не сарказм а реальный совет.
Скривить ты не сможешь даже от зеленых новичков.
// Основные параметры
// время ожидания
var waitTime = 1000;
// количество попыток распознать
var tryRecognize = 2;
// количество попыток загрузить элемент
var tryLoadElement = 60;
// Вспомогательные переменные
// вкладка
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;
// поиск кнопки открытия формы с аудио заданием
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= () => {
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();
}
};
// Определение версии рекапчи
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 System.Threading.Thread.Sleep(waitTime); // подождём загрузки элемента
}
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;
}
// скачиваем файл
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= () => {
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];
}
finally
{
if (File.Exists(file))
{
File.Delete(file);
fileDeleted = true;
}
}
};
//Вводим ответ
Action InputAnswer= () => {
if (!String.IsNullOrEmpty(answer) && answer != "sorry")
{
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(waitTime);
};
// Проверяем правильность для старого вида рекапчи 2
Action CheckOldView= () => {
// Проверяем, была ли ошибка в распознавании
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(waitTime); // подождём немного
continue;
}
if (k == (tryLoadElement - 1)) timeout = true;
}
success = true;
};
// проверим правильность ответа рекапчи 2
Action Check= () => {
var checkAnswer = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
if (!checkAnswer.IsVoid)
{
if (checkAnswer.OuterHtml.Contains("style=\"\""))
success = true;
}
};
// Кликаем по кнопке я не робот, если она есть
NotRobotClick();
if (success) return "ok";
// Пытаемся распознать рекапчу
for (int i = 0; i < tryRecognize; i++)
{
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 (timeout) break;
if (!isNewView) CheckOldView();
else Check();
if (success) return "ok";
}
if (timeout) throw new Exception("Вышло время ожидания загрузки элемента");
else throw new Exception("Не распознано");
1. Что происходит если капчу надо распознать? Детально, меня интересует рендерится вся страница целиком или участок выделенный где капча[+] Добавлен режим работы проекта “Браузер без отображения содержимого”. Пока в режиме beta, в данном режиме работает практически все кроме плагинов, типа Flash. Отключает рендеринг, позволяет экономить ресурсы памяти и CPU.
За это отдельная благодарность. Теперь шаблоны отправятся в криптованный контейнер, а в системе будут лежать только символьные ссылки на них, очень удобно и приватно.[*] Исправлено обновление проекта по symbolic ссылке.
проверим, должно работать, мы же сами тестируем у себя на последних билдах все.Вообщем обновился до 5.9.7.0, капмонстр 2.5.5.1! Перестала работать аудикаптча!
Вот такие ошибки:
Тип Время Сообщение
09:51:25 127.0.0.0 module Не получен ответ на запрос http://127.0.0.0/in.php. Error: Невозможно соединиться с удаленным сервером
Тип Время Сообщение
09:51:46 127.0.0.0 module Не получен ответ на запрос http://127.0.0.0/in.php. Error: Невозможно соединиться с удаленным сервером
Тип Время Сообщение
09:51:46 Выполнение действия CSharp OwnCode Ответ не получен
Код вот такой использую, взят отсюда http://zennolab.com/wiki/ru:addons:capmonster:rc-audio
Вчера все на 5.9.5.1 работало, на 5.9.7.0 нет. В чем может быть проблема? С сишарпом не знаком!
1. если капчу можно из кеша браузера достать, то ничего не надо рендерить она напрямую оттуда пойдет. если капчу нельзя достать то рендериться только участок с капчой.Билд супер, есть вопросы:
1. Что происходит если капчу надо распознать? Детально, меня интересует рендерится вся страница целиком или участок выделенный где капча
2. Возможно ли сделать рендеринг если мне надо посмотреть что там? Например это удобно в случае ошибки - чтобы по скрину сразу понять
Пробовали. Тиккет открыт на почте сапорта с диагностик репортом.проверим, должно работать, мы же сами тестируем у себя на последних билдах все.
но судя по ошибкам у вас CapMonster как-то криво запустился, выключите обе программы и перезапустите компьютер.
Как это можно использовать? Не понимаю контекста, вкладка "группы" отображает тоже самое что и вкладка "совпадения"Change Log:
[+] Улучшен конструктор регулярных выражений, теперь он показывает совпадения по группам, можно выделять только необходимые результаты парсинга для копирования в буфер обмена.
([a-z])([a-z])
Низкий поклон! Только ссылка кривая, вот правильная. Я опасаюсь - тут как пишутся данные, как в список (с кэшированием) или напрямую запись строки в файл? Опасаюсь создать излишнюю нагрузку на диск при многопоточности.Change Log:
[+] Добавлены настройки логирования. Через C# код, свойство project.LogOptions.LogFile позволяет установить путь к файлу лога выполнения проекта, а свойство project.LogOptions.SplitLogByThread позволяет включить автоматическое разделение лога по потокам, при установке свойству значения true, файл лога начинает именоваться в формате “путь к файлу.N.расширение”, где N - id потока выполнения.
Как оно на деле работает? Механизм нужен, помнится you писали что это очень сложно запилить, нужны детали как выкрутилисьChange Log:
[*] Исправлено обновление проекта по symbolic ссылке.
Не помогает!проверим, должно работать, мы же сами тестируем у себя на последних билдах все.
но судя по ошибкам у вас CapMonster как-то криво запустился, выключите обе программы и перезапустите компьютер.
отвечу скрином@@darkdiver теперь вопрос, взяли мы эти группы, а как с ними работать? В обычных регулярках, например в NP++ можно сделать "\1" и мы получим значение которое было в скобках круглых, а тут как?
спасибо, исправим ссылкуНизкий поклон! Только ссылка кривая, вот правильная. Я опасаюсь - тут как пишутся данные, как в список (с кэшированием) или напрямую запись строки в файл? Опасаюсь создать излишнюю нагрузку на диск при многопоточности.
ну написали 10 килобайт кодаКак оно на деле работает? Механизм нужен, помнится you писали что это очень сложно запилить, нужны детали как выкрутились
в настройках капч удалите, и перезапустите постер.Не помогает!
Про кэширование пропущен ответспасибо, исправим ссылку
через NLog пишется все, там есть внутренние буферы, должно нормально работать.Низкий поклон! Только ссылка кривая, вот правильная. Я опасаюсь - тут как пишутся данные, как в список (с кэшированием) или напрямую запись строки в файл? Опасаюсь создать излишнюю нагрузку на диск при многопоточности.
это уже практически релиз, как выяснилось..а когда релиз то?
ДаДля использования скрытия браузера, необходимо ли что бы ZennoPoster был данного билда?