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

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
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, но логику реализации я описал в статье, поэтому вы можете применять эти знания и на других сайтах.
 
Тема статьи
Другое
Номер конкурса статей
Двенадцатый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

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

Valandersi

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

DenisK

Client
Регистрация
28.06.2016
Сообщения
591
Благодарностей
289
Баллы
63

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Давно хотел освоить эту либу, теперь точно это сделаю. Спасибо!
 
  • Спасибо
Реакции: WLDN

GREXA

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

Babulia

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

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Спасибо как для кого но для меня это очень полезно!!! еще бы подделать что бы чучуть быстрее ползунок переводил на 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
Сообщения
999
Благодарностей
390
Баллы
63
норм. статья + в карму)
 
  • Спасибо
Реакции: WLDN

Supergrok

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

Asmus003

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

AZANIR

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

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
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
Сообщения
357
Благодарностей
566
Баллы
93
Это все делается через C#, никакие сторонние сервисы не нужны.
И не понял для какой цели их вообще конвертировать в base64.
Если картинка на винте, то подгружаем ее или как byte[], или как Bitmap.
Верно подмечено. Можно конвертировать через C# и грузить картинки с винта. :-)
Хранение в Base64 было сделано для того, чтобы не сбрасывать отдельно фоновые картинки клиенту.
 

che100

Client
Регистрация
18.04.2017
Сообщения
808
Благодарностей
503
Баллы
63
В закладки. :dz:
 
  • Спасибо
Реакции: WLDN

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Добавлено видео (см. внизу статьи).
 
  • Спасибо
Реакции: WLDN

lybimiy86

Client
Регистрация
29.10.2016
Сообщения
97
Благодарностей
187
Баллы
33
  • Спасибо
Реакции: WLDN

samsonnn

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

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

Mahno

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

Metrix

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

White trash

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

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93

antonfrost

Новичок
Регистрация
11.02.2020
Сообщения
10
Благодарностей
1
Баллы
3
@WLDN Привет, спасибо за интересное решение. Подскажи плз, пробую твой шаблон применить для тикток, но у меня выскакивает ошибка
Выполнение действия CSharp OwnCode: GeeTest. Недопустимый параметр.

В чем может быть дело?
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
@WLDN Привет, спасибо за интересное решение. Подскажи плз, пробую твой шаблон применить для тикток, но у меня выскакивает ошибка
Выполнение действия CSharp OwnCode: GeeTest. Недопустимый параметр.

В чем может быть дело?
Привет, ну сходу так, к сожалению, не выйдет. :( Под каждый сайт нужно своё решение писать. Если мне не изменяет память, то у ТикТока на вебе не гитест, а своя каптча, просто принцип похож.
 

antonfrost

Новичок
Регистрация
11.02.2020
Сообщения
10
Благодарностей
1
Баллы
3
Привет, ну сходу так, к сожалению, не выйдет. :( Под каждый сайт нужно своё решение писать. Если мне не изменяет память, то у ТикТока на вебе не гитест, а своя каптча, просто принцип похож.
Блин, жаль, что не подходит. Каптчи, вроде бы, одинаковые, я так же пробовал на этом сайте запустить твой шаб https://www.geetest.com/en/demo но и здесь была ошибка. Если не сложно, глянь пзл тикток, как там можно пройти каптчу, буду очень благодарен
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Блин, жаль, что не подходит. Каптчи, вроде бы, одинаковые, я так же пробовал на этом сайте запустить твой шаб https://www.geetest.com/en/demo но и здесь была ошибка. Если не сложно, глянь пзл тикток, как там можно пройти каптчу, буду очень благодарен
Данное решение в момент написания статьи подходило только под eBay.
Статья была написана как инструкция (схема) для создания своего решения под необходимый сайт.

Если нужно индивидуальное решение. Можешь написать мне, я занимаюсь написанием шаблонов на заказ. :-)
В моей подписи есть ссылка на ветку с отзывами и Telegram.
 

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18
Можно и так вытащить картинку. Без всяких скриншотов. Например.
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
а можно сюда эти кубики?)))
 

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18
Привет, ну сходу так, к сожалению, не выйдет. :( Под каждый сайт нужно своё решение писать. Если мне не изменяет память, то у ТикТока на вебе не гитест, а своя каптча, просто принцип похож.
по Вашему шаблону на ebay так же эта ошибка
 

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18
  • Спасибо
Реакции: WLDN

top-accs

Новичок
Регистрация
27.06.2018
Сообщения
22
Благодарностей
1
Баллы
3
Кто может сделать сейчас решение для моего сайта за плату? Напишите @ivansk2
 
  • Спасибо
Реакции: WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93

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