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

  • Автор темы Автор темы lutic
  • Дата начала Дата начала

lutic

Client
Регистрация
20.01.2024
Сообщения
97
Реакции
92
Баллы
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;");
                     
                            }
     
                        }
             
                 
                    }
                }
            }
        }

Спасибо за внимание
 

Вложения

Последнее редактирование:
а как после получения скрина решить капчу? та же хкапча, которая состоит не из квадратов, а с разными предметами? и интересно как решать капчу из способа 1. сделать скрин, разрезать на картинки, а дальше что? в гугл отправлять запрос что на картинке нарисовано?
 
а как после получения скрина решить капчу? та же хкапча, которая состоит не из квадратов, а с разными предметами? и интересно как решать капчу из способа 1. сделать скрин, разрезать на картинки, а дальше что? в гугл отправлять запрос что на картинке нарисовано?
Отправить в сервисы по распознаванию капчи
 
Отправить в сервисы по распознаванию капчи
так а какой сервис отдает клики по координатам для хкапчи? просто если отсылать на сервис, то проще уже кубиком стандартным
 
  • Спасибо
Реакции: majestro
так а какой сервис отдает клики по координатам для хкапчи? просто если отсылать на сервис, то проще уже кубиком стандартным
Любой из возможных, рукапча, антикапча, капгуру, капмонстр и другие.
 
Можете ли вы откатиться до версии 7.7.4?
 

Вложения

  • Спасибо
Реакции: garikn

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