Разработка плагинов для обхода капчи: как создать скриншот, если не работает DrawToBitmap

lutic

Client
Регистрация
20.01.2024
Сообщения
53
Благодарностей
33
Баллы
18
При создании плагинов для решения капч очень важным становится сделать скриншот той или иной капчи или даже получить оригинал картинки, чтобы сервисы по решению капч прислали ответ, на что нажимать или как двигать ползунок. Сейчас почти каждый сайт имеет защиту от роботов, а эффективность работы инструмента такого плана важна. Мною было проанализировано много вариаций скриптов, но я выделяю только те, которые работают у меня.

В Zennoposter есть сложность в создании скриншотов с помощью DrawToBitmap, особенно часто эта проблема встречается в Chromium (beta).
Нашлось 2 способа реализации решения этой проблемы:

Перед тем как вставлять код в с# желательно создать переменную var1
1716282283016.png1716282319301.png

Способ №1

1716283432158.png
*Картинка для пример

Если у нас канваc:
C#:
Tab tab = instance.ActiveTab;
string selector09 = "#captcha__puzzle canvas";
var el = tab.MainDocument.QuerySelector(selector09, 0);
string captcha =  el.DrawToBitmap(false);
if(string.IsNullOrWhiteSpace(captcha)){
    captcha = tab.MainDocument.EvaluateScript("var canvas = document.querySelector('"+selector09+"'); var ctx = canvas.getContext('2d');  return canvas.toDataURL();");
}
project.Variables["var1"].Value=captcha; //сохраняем в переменную
Способ № 2

А если именно элемент html, то я использую библиотеку html2canvas:
Пример выполнения кода: sendimg.zp
1716282733596.png 1716282785075.png


C#:
Tab tab = instance.ActiveTab;
tab.MainDocument.EvaluateScript("var kk23=''; var sde='https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js'; function addScript( src ) {  var s = document.createElement( 'script' );  s.setAttribute( 'src', src );  document.body.appendChild( s ); } addScript(sde);");
Подгружаем 1 раз на страницу для того, чтобы библиотека не активировалась 2 раза.
Далее делаем скриншот html картинки.

C#:
Tab tab = instance.ActiveTab;

string selector09 = ".challenge-container";
var el = tab.MainDocument.QuerySelector(selector09, 0);

string captcha =  el.DrawToBitmap(false);
if(string.IsNullOrWhiteSpace(captcha)){
    tab.MainDocument.EvaluateScript(" var sde = document.querySelector('"+selector09+"'); html2canvas(sde, {useCORS: true, scale: 1}).then(canvas => { kk23=canvas.toDataURL('image/png') ;}); "); // делаем скриншот html объекта
    Thread.Sleep(500); //Сон
    captcha = tab.MainDocument.EvaluateScript("return kk23; "); // получение самой картинки
    tab.MainDocument.EvaluateScript("kk23='';"); //освобождаем переменную для следующего скриншота
}
project.Variables["var1"].Value=captcha; //сохраняем в переменную

Запишу для себя тут способы создания скриншотов с помощью функции DrawToBitmap, чтобы возвращаться к этой информации и не запутаться.

C#:
string captcha = el.DrawToBitmap(true); //полная картинка реальных размеров, не сжатое через css   --- 1
string captcha = el.DrawToBitmap(false); // картинка, которую пользователь видит в браузере, сжатое через css --- 2
string captcha = el.DrawPartToBitmap(0, 0, 300, 400, false); // такое иногда нужно, чтобы обрезать картинку по своим размерами, очень подходит для яндекса ---3
1) 1716283623790.png 2) 1716283684479.png 3) 1716283806489.png


Также иногда важно знать размер самой картинки, полный размер картинки (после DrawToBitmap(true) ) для расчета координатов, я пользуюсь таким способом:
C#:
Image image;
byte[] imageBytes = Convert.FromBase64String(captcha);
using (MemoryStream stream = new MemoryStream(imageBytes)){  image = Image.FromStream(stream); } // image.Width ширина , image.Height - высота картинки

UPD. В связи с заявкой на создание плагина для фанкапчи, делюсь способом получения картинки из html кода, так как очень актуальная задача.
C#:
string captcha ="";
Tab tab = instance.ActiveTab;
Document doc2 = tab.AllDocuments.Documents[4]; //тут может быть любой номер фрейма

if(string.IsNullOrWhiteSpace(captcha) || captcha == null){
     
            var items = doc2.QuerySelectorAll(".match-game img");
            if(items != null && items.Count > 0){
                foreach (var item in items){
                    if(!item.IsVoid){
                        var itstyle  = item.GetAttribute("style");
                        if(itstyle.Contains("blob:")){
                            Match match2 = Regex.Match(itstyle, @"blob\:(.*?)""", RegexOptions.IgnoreCase);
       
                            if(match2.Success && match2.Length>0){
                                var match2Value = Regex.Replace(match2.Value ,@"[^0-9a-zA-Z:,;/_.-]","");
                         
                                doc2.EvaluateScript("kkk2='';");
                                doc2.EvaluateScript("function toDataUrl(o,e){var n=new XMLHttpRequest;n.onload=function(){var o=new FileReader;o.onloadend=function(){e(o.result)},o.readAsDataURL(n.response)},n.open('GET',o),n.responseType='blob',n.send()}toDataUrl('"+match2Value+"',function(o){kkk2=(o)});");
                                Thread.Sleep(500);
                                captcha = doc2.EvaluateScript("return kkk2;");
                     
                            }
     
                        }
             
                 
                    }
                }
            }
        }
Спасибо за внимание
 

Вложения

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

Asmus003

Client
Регистрация
25.03.2018
Сообщения
257
Благодарностей
66
Баллы
28
а как после получения скрина решить капчу? та же хкапча, которая состоит не из квадратов, а с разными предметами? и интересно как решать капчу из способа 1. сделать скрин, разрезать на картинки, а дальше что? в гугл отправлять запрос что на картинке нарисовано?
 

lutic

Client
Регистрация
20.01.2024
Сообщения
53
Благодарностей
33
Баллы
18
а как после получения скрина решить капчу? та же хкапча, которая состоит не из квадратов, а с разными предметами? и интересно как решать капчу из способа 1. сделать скрин, разрезать на картинки, а дальше что? в гугл отправлять запрос что на картинке нарисовано?
Отправить в сервисы по распознаванию капчи
 

Asmus003

Client
Регистрация
25.03.2018
Сообщения
257
Благодарностей
66
Баллы
28
Отправить в сервисы по распознаванию капчи
так а какой сервис отдает клики по координатам для хкапчи? просто если отсылать на сервис, то проще уже кубиком стандартным
 

lutic

Client
Регистрация
20.01.2024
Сообщения
53
Благодарностей
33
Баллы
18
так а какой сервис отдает клики по координатам для хкапчи? просто если отсылать на сервис, то проще уже кубиком стандартным
Любой из возможных, рукапча, антикапча, капгуру, капмонстр и другие.
 

kawae

Client
Регистрация
05.03.2020
Сообщения
28
Благодарностей
1
Баллы
3
Можете ли вы откатиться до версии 7.7.4?
 

lutic

Client
Регистрация
20.01.2024
Сообщения
53
Благодарностей
33
Баллы
18

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