Бесплатный Geetest на 100%

WLDN

Client
Регистрация
09.07.2015
Сообщения
358
Реакции
571
Баллы
93
Привет, братишки. :-)

Не так давно мне поступила задача сделать разгадывание Geetest без использования сторонних сервисов.
У меня уже был опыт написания решения пазл-каптчи под TikTok, поэтому я не долго думая взялся и успешно выполнил задачу.
В моей статье я подробно расскажу вам как написать такой кубик для разгадывания Geetest каптчи на примере сайта eBay.
Погнали! :bi:


Итак, загружаем eBay и пытаемся поймать Geetest.

45558


Нам необходимо определить крайнюю координату тёмного пазла по оси X, чтобы передвинуть ползунок в нужное место.
В этом нам помогут библиотеки от AForge.NET Framework:
  • Aforge
  • Aforge.Math
  • Aforge.Imaging
  • Aforge.Video
Сразу же скачиваем их с сайта и добавляем в папку ExternalAssemblies (там, где находится ваш ZP) и наш проект с помощью блока "Ссылки из GAC".
Также не забываем прописать библиотеки в using:
Директивы using и общий код:
Развернуть Свернуть Копировать
using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using AForge;
using AForge.Imaging;
using AForge.Imaging.Filters;
using AForge.Math;
using AForge.Math.Geometry;


Чтобы определить точные координаты тёмного пазла, нам нужно, чтобы фоновая картинка стала одноцветной, а пазл был четко выделен на ней. Таким образом AForge со 100%-ой вероятностью определит координаты углов пазла. Если так не сделать, то AForge найдет очень много лишних углов, которые нам абсолютно не нужны.
Для того, чтобы это провернуть нужно "найти разницу" между картинкой с тёмным пазлом, которую прислал нам Geetest, и такой же картинкой без тёмного пазла - "фоном".
К сожалению, Geetest нам присылает только картинку с тёмным пазлом, причем запутанную, поэтому дабы не усложнять себе жизнь, просто делаем скриншот из инстанса.
Делаем скриншот картинки с тёмным пазлом:
Развернуть Свернуть Копировать
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("canvas", "class", "geetest_canvas_slice geetest_absolute", "regexp", 0); //Получаем элемент цветного пазла
he.SetAttribute("style", "opacity: 0; display: block;"); //Убираем цветной пазл с помощью редактирования атрибута style, чтобы он не мешал нам

int left = Convert.ToInt32(he.GetAttribute("left")); //Получаем координату элемента по left
int top = Convert.ToInt32(he.GetAttribute("top")); //Получаем координату элемента по top

long unixTime = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds; //Получаем UnixTime в миллисекундах

ZennoPoster.ImageProcessingCropFromScreenshot(instance.Port, project.Directory + "\\" + unixTime + ".jpg", left, top, he.Width, he.Height, "pixel");  //Делаем скриншот по координатам элемента и сохраняем в папку с шаблоном
System.Threading.Thread.Sleep(1000); //Небольшая пауза, чтобы система успела сохранить файл
System.Drawing.Bitmap image = (Bitmap)Bitmap.FromFile(project.Directory + "\\" + unixTime + ".jpg"); //Загружаем скриншот обратно в код


Теперь нам нужен "фон". Его мы можем получить, сложив пару одинаковых картинок с разным расположением тёмного пазла в любом графическом редакторе.
45603
+
45605
=
45606


Картинки можно получить с помощью предыдущего кода.


Теперь закидываем все фоновые картинки (на eBay их 4) в код, чтобы они не пылились у нас на жестком диске. Предварительно конвертируем их в Base64 с помощью любого онлайн сервиса.

45607

P.S. Я сделал это так, но вы также можете хранить их в папке с шаблоном и загружать с помощью: System.Drawing.Bitmap image = (Bitmap)Bitmap.FromFile


Отлично! :ay: У нас загружена картинка и загружены фоны, но нужно определить какой из фонов выдал Geetest в конкретный момент времени.
Для этого необходимо получить цвет "нулевого" пикселя каждого фона и с помощью логики определить какой сейчас фон подкинула каптча.
Получаем цвет:
Развернуть Свернуть Копировать
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("canvas", "class", "geetest_canvas_slice geetest_absolute", "regexp", 0);
he.SetAttribute("style", "opacity: 0; display: block;");
int left = Convert.ToInt32(he.GetAttribute("left"));
int top = Convert.ToInt32(he.GetAttribute("top"));
long unixTime = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds;
ZennoPoster.ImageProcessingCropFromScreenshot(instance.Port, project.Directory + "\\" + unixTime + ".jpg", left, top, he.Width, he.Height, "pixel");
System.Threading.Thread.Sleep(1000);
System.Drawing.Bitmap image = (Bitmap)Bitmap.FromFile(project.Directory + "\\" + unixTime + ".jpg");

return image.GetPixel(0,0);

Определяем и загружаем фон:
Развернуть Свернуть Копировать
string color = String.Empty;
//Определяем фон
if (image.GetPixel(0,0).ToString().Contains("R=76"))  color = red;
if (image.GetPixel(0,0).ToString().Contains("R=102"))  color = red2;
if (image.GetPixel(0,0).ToString().Contains("R=155"))  color = blue;
if (image.GetPixel(0,0).ToString().Contains("R=221")) color = white;

//Загружаем фон
byte[] imageBytes = Convert.FromBase64String(color);
   var ms = new MemoryStream(imageBytes);
    Bitmap sourceImage = new Bitmap(ms);


Наконец-то мы можем найти "разницу" между изображениями.
Находим разницу между изображениями:
Развернуть Свернуть Копировать
Difference filter = new Difference(image);
Bitmap image2 = filter.Apply(sourceImage);

Для примера "разница" выглядит так:
45615


После того как мы получили "разницу", мы можем определить точные координаты углов тёмного пазла.
Определяем координаты углов:
Развернуть Свернуть Копировать
SusanCornersDetector scd = new SusanCornersDetector(); //используем SusanCornersDetector для определения координат

List<IntPoint> corners = scd.ProcessImage(image2); //получаем список координат
List<int> L = new List<int>(); //создаём список для координат X
string rx = ".*(?=,)"; //условие для регулярки
foreach ( IntPoint corner in corners ) //цикл для проверки каждого пункта из списка corners
{

    L.Add(Convert.ToInt32(Convert.ToString(Regex.Match(Convert.ToString(corner),rx)))); //загружаем в список L только координаты X

}
var minEven = L.Min(); //находим ближнюю X координату

Отключаем и удаляем изображения:
Развернуть Свернуть Копировать
sourceImage.Dispose();
image.Dispose();
image2.Dispose();
File.Delete(project.Directory + "\\" + unixTime + ".jpg");


Ура! :bo: Мы нашли ближнюю X координату тёмного пазла, а значит можем добавлять код для перемещения ползунка.

Перемещаем ползунок:
Развернуть Свернуть Копировать
Random rnd = new Random();
//находим и возвращаем цветной пазл на место
HtmlElement he_move = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("canvas", "class", "geetest_canvas_slice geetest_absolute", "regexp", 0);
he_move.SetAttribute("style", "opacity: 1; display: block;");

//определяем координаты нахождения пазла
int left_move = Convert.ToInt32(he_move.GetAttribute("left"));
int top_move = Convert.ToInt32(he_move.GetAttribute("top"));

//находим ползунок и определяем его координату
HtmlElement he2_move = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div", "class", "geetest_slider_button", "regexp", 0);
int top2_move = Convert.ToInt32(he2_move.GetAttribute("top"));


instance.EmulationLevel = "Full"; //устанавливаем полную эмуляцию
instance.ActiveTab.DragDrop(left_move+28, top2_move+15, left_move+28, top2_move+15); //хватаем ползунок
instance.ActiveTab.FullEmulationMouseMove(left_move + minEven +22, top2_move + 17); //тащим на место тёмного пазла
System.Threading.Thread.Sleep(rnd.Next(500, 1000)); //небольшая рандомная пауза для эмуляции человеческого "прицеливания"
instance.ActiveTab.FullEmulationMouseClick("left", "click"); //отпускаем

Поздравляю! Мы реализовали кубик для решения Geetest каптчи. :bp:
У платформы AForge много полезных фишек, поэтому её можно использовать и для других задач. :al:


P.S. Шаблон гарантированно работает на версии 5.29.4 и движке Chrome. Также eBay иногда упрощает регистрацию, поэтому не всегда слёту удаётся поймать Geetest, но логику реализации я описал в статье, поэтому вы можете применять эти знания и на других сайтах.
 
Номер конкурса статей
  1. Двенадцатый конкурс статей
Тема статьи
  1. Другое

Вложения

Последнее редактирование модератором:
Хоть это скорее всего мне не пригодиться, но такие технические реализации топчег
 
Когда предлагали 200$ за разгадывание такой капчи)
 
  • Спасибо
Реакции: lomshakov и WLDN
Спасибо как для кого но для меня это очень полезно!!! еще бы подделать что бы чучуть быстрее ползунок переводил на 1 или 1.5 сек было бы вообще огонь.
 
  • Спасибо
Реакции: Z_i_m и WLDN
Спасибо как для кого но для меня это очень полезно!!! еще бы подделать что бы чучуть быстрее ползунок переводил на 1 или 1.5 сек было бы вообще огонь.
Можно это сделать другой версией Drag'n'Drop, но, к сожалению, там нельзя выставить эмуляцию "прицеливания", а значит каптча редко будет принимать такие ответы. :(
Drag'n'Drop:
Развернуть Свернуть Копировать
instance.ActiveTab.FullEmulationMouseDragAndDrop(left_move+28, top2_move+15, left_move+28, top2_move+15);
Я не углублялся, но возможно на форуме есть спецы, которые могли бы использовать сторонние методы для решения "прицеливания". А может ZennoLab внедрят подобную фишку после наших комментариев...
 
Последнее редактирование:
норм. статья + в карму)
 
  • Спасибо
Реакции: WLDN
Информация и логика выполнения ценная, в копилочку.
 
  • Спасибо
Реакции: WLDN
Отличная статья и главное полезная!
 
  • Спасибо
Реакции: WLDN
Техническая статья с решением конкретного примера , класс!
 
  • Спасибо
Реакции: WLDN
К сожалению, Geetest нам присылает только картинку с тёмным пазлом, причем запутанную, поэтому дабы не усложнять себе жизнь, просто делаем скриншот из инстанса.
Можно и так вытащить картинку. Без всяких скриншотов. Например.
C#:
Развернуть Свернуть Копировать
var canvas_bg = instance.ActiveTab.MainDocument.EvaluateScript("return document.getElementsByClassName(\"geetest_canvas_bg geetest_absolute\")[0].toDataURL();");
canvas_bg = canvas_bg.Replace("data:image/png;base64,", "");


Предварительно конвертируем их в Base64 с помощью любого онлайн сервиса.
Это все делается через C#, никакие сторонние сервисы не нужны.
И не понял для какой цели их вообще конвертировать в base64.
Если картинка на винте, то подгружаем ее или как byte[], или как Bitmap.


После того как мы получили "разницу", мы можем определить точные координаты углов тёмного пазла.
Решал эту задачу с помощью OpenCV. Там есть спец метод для нахождения границ объекта - findcontours. Если точнее, то границ прямоугольника в который вписан объект.


В целом статья норм. Плюсанул.:-)
Шаб посмотрел. Просто так взять решение и перенести в свой не получится, придется дорабатывать напильником. Шаб как пример что делать.

Вот к примеру как это выглядит у меня.
Данный шаб юзается как подшаблон в других шаблонах.
45753


PS: Выложил бы кто решение второй капчи от GeeTest, бесплатной на 100%.
Там всего то надо собрать картинки, разметить датасет и обучить нейронку.:D
 
Это все делается через C#, никакие сторонние сервисы не нужны.
И не понял для какой цели их вообще конвертировать в base64.
Если картинка на винте, то подгружаем ее или как byte[], или как Bitmap.
Верно подмечено. Можно конвертировать через C# и грузить картинки с винта. :-)
Хранение в Base64 было сделано для того, чтобы не сбрасывать отдельно фоновые картинки клиенту.
 
В закладки. :dz:
 
  • Спасибо
Реакции: WLDN
Добавлено видео (см. внизу статьи).
 
  • Спасибо
Реакции: WLDN
  • Спасибо
Реакции: WLDN
В своё время тоже была задача решить этот вид капчи, я использовал библиотеку imagemagick. Вот тут описывал процесс:


А у меня сейчас решение с помощью Magick.Net работает не хуже чем у ТС, картинки на диск не сохраняет, работает напрямую) все методы хороши, главное чтоб работало быстро, с минимальными затратами ресурсов :-)
 
  • Спасибо
Реакции: WLDN
Топ
 
  • Спасибо
Реакции: WLDN
Отличная статья для того, чтобы понять как оно работает )
Особенно, если собрать вместе всю информацию воедино с рекомендациями из комментариев.
А главное, бесплатно!
Для кого-то это шикарный подарок.
 
  • Спасибо
Реакции: WLDN
@WLDN Привет, спасибо за интересное решение. Подскажи плз, пробую твой шаблон применить для тикток, но у меня выскакивает ошибка
Выполнение действия CSharp OwnCode: GeeTest. Недопустимый параметр.

В чем может быть дело?
 
@WLDN Привет, спасибо за интересное решение. Подскажи плз, пробую твой шаблон применить для тикток, но у меня выскакивает ошибка
Выполнение действия CSharp OwnCode: GeeTest. Недопустимый параметр.

В чем может быть дело?
Привет, ну сходу так, к сожалению, не выйдет. :( Под каждый сайт нужно своё решение писать. Если мне не изменяет память, то у ТикТока на вебе не гитест, а своя каптча, просто принцип похож.
 
Привет, ну сходу так, к сожалению, не выйдет. :( Под каждый сайт нужно своё решение писать. Если мне не изменяет память, то у ТикТока на вебе не гитест, а своя каптча, просто принцип похож.
Блин, жаль, что не подходит. Каптчи, вроде бы, одинаковые, я так же пробовал на этом сайте запустить твой шаб https://www.geetest.com/en/demo но и здесь была ошибка. Если не сложно, глянь пзл тикток, как там можно пройти каптчу, буду очень благодарен
 
Блин, жаль, что не подходит. Каптчи, вроде бы, одинаковые, я так же пробовал на этом сайте запустить твой шаб https://www.geetest.com/en/demo но и здесь была ошибка. Если не сложно, глянь пзл тикток, как там можно пройти каптчу, буду очень благодарен
Данное решение в момент написания статьи подходило только под eBay.
Статья была написана как инструкция (схема) для создания своего решения под необходимый сайт.

Если нужно индивидуальное решение. Можешь написать мне, я занимаюсь написанием шаблонов на заказ. :-)
В моей подписи есть ссылка на ветку с отзывами и Telegram.
 
  • Спасибо
Реакции: XAPOHbI4
Можно и так вытащить картинку. Без всяких скриншотов. Например.
C#:
Развернуть Свернуть Копировать
var canvas_bg = instance.ActiveTab.MainDocument.EvaluateScript("return document.getElementsByClassName(\"geetest_canvas_bg geetest_absolute\")[0].toDataURL();");
canvas_bg = canvas_bg.Replace("data:image/png;base64,", "");



Это все делается через C#, никакие сторонние сервисы не нужны.
И не понял для какой цели их вообще конвертировать в base64.
Если картинка на винте, то подгружаем ее или как byte[], или как Bitmap.



Решал эту задачу с помощью OpenCV. Там есть спец метод для нахождения границ объекта - findcontours. Если точнее, то границ прямоугольника в который вписан объект.


В целом статья норм. Плюсанул.:-)
Шаб посмотрел. Просто так взять решение и перенести в свой не получится, придется дорабатывать напильником. Шаб как пример что делать.

Вот к примеру как это выглядит у меня.
Данный шаб юзается как подшаблон в других шаблонах.


PS: Выложил бы кто решение второй капчи от GeeTest, бесплатной на 100%.
Там всего то надо собрать картинки, разметить датасет и обучить нейронку.:D
а можно сюда эти кубики?)))
 
Привет, ну сходу так, к сожалению, не выйдет. :( Под каждый сайт нужно своё решение писать. Если мне не изменяет память, то у ТикТока на вебе не гитест, а своя каптча, просто принцип похож.
по Вашему шаблону на ebay так же эта ошибка
 
Кто может сделать сейчас решение для моего сайта за плату? Напишите @ivansk2
 
  • Спасибо
Реакции: WLDN

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