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

WLDN

Client
Регистрация
09.07.2015
Сообщения
117
Благодарностей
160
Баллы
43
Привет, братишки. :-)

Не так давно мне поступила задача сделать разгадывание 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, но логику реализации я описал в статье, поэтому вы можете применять эти знания и на других сайтах.
 
Категория
Полезно

Вложения

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

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 205
Благодарностей
529
Баллы
113
Хоть это скорее всего мне не пригодиться, но такие технические реализации топчег
 

GREXA

Client
Регистрация
16.09.2017
Сообщения
87
Благодарностей
10
Баллы
8
Когда предлагали 200$ за разгадывание такой капчи)
 
  • Спасибо
Реакции: lomshakov и WLDN

Babulia

Client
Регистрация
18.11.2018
Сообщения
13
Благодарностей
6
Баллы
3
Спасибо как для кого но для меня это очень полезно!!! еще бы подделать что бы чучуть быстрее ползунок переводил на 1 или 1.5 сек было бы вообще огонь.
 
  • Спасибо
Реакции: Z_i_m и WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
117
Благодарностей
160
Баллы
43
Спасибо как для кого но для меня это очень полезно!!! еще бы подделать что бы чучуть быстрее ползунок переводил на 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 внедрят подобную фишку после наших комментариев...
 
Последнее редактирование:

Sanekk

Client
Регистрация
24.06.2016
Сообщения
717
Благодарностей
261
Баллы
63
норм. статья + в карму)
 
  • Спасибо
Реакции: WLDN

Supergrok

Client
Регистрация
05.03.2019
Сообщения
60
Благодарностей
68
Баллы
18
Информация и логика выполнения ценная, в копилочку.
 
  • Спасибо
Реакции: WLDN

Asmus003

Client
Регистрация
25.03.2018
Сообщения
65
Благодарностей
16
Баллы
8
Отличная статья и главное полезная!
 
  • Спасибо
Реакции: WLDN

AZANIR

Client
Регистрация
09.06.2014
Сообщения
329
Благодарностей
139
Баллы
43
Техническая статья с решением конкретного примера , класс!
 
  • Спасибо
Реакции: WLDN

Moadip

Client
Регистрация
26.09.2015
Сообщения
461
Благодарностей
660
Баллы
93
К сожалению, 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
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
117
Благодарностей
160
Баллы
43
Это все делается через C#, никакие сторонние сервисы не нужны.
И не понял для какой цели их вообще конвертировать в base64.
Если картинка на винте, то подгружаем ее или как byte[], или как Bitmap.
Верно подмечено. Можно конвертировать через C# и грузить картинки с винта. :-)
Хранение в Base64 было сделано для того, чтобы не сбрасывать отдельно фоновые картинки клиенту.
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 227
Благодарностей
801
Баллы
113
В своё время тоже была задача решить этот вид капчи, я использовал библиотеку imagemagick. Вот тут описывал процесс:

А у меня сейчас решение с помощью Magick.Net работает не хуже чем у ТС, картинки на диск не сохраняет, работает напрямую) все методы хороши, главное чтоб работало быстро, с минимальными затратами ресурсов :-)
 
  • Спасибо
Реакции: WLDN

Mahno

Client
Регистрация
16.05.2015
Сообщения
394
Благодарностей
81
Баллы
28
Топ
 
  • Спасибо
Реакции: WLDN

Metrix

Client
Регистрация
03.01.2014
Сообщения
264
Благодарностей
202
Баллы
43
Отличная статья для того, чтобы понять как оно работает )
Особенно, если собрать вместе всю информацию воедино с рекомендациями из комментариев.
А главное, бесплатно!
Для кого-то это шикарный подарок.
 
  • Спасибо
Реакции: WLDN

White trash

Client
Регистрация
09.06.2014
Сообщения
537
Благодарностей
199
Баллы
43
Что-то не получается. В логе пишет - Выполнение действия CSharp OwnCode: GeeTest. Недопустимый параметр.
 

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