Добрый день
Для решение капчи иногда требуется отправить 2 картинки или один скриншот, и чтобы уменьшить нагрузку на процессор приходится уходить от создания создания скриншотов в пользу производительности
Ранее делался скриншот и отправлялся в капча сервисы для получение результата, то сейчас получаем 2 картинки, одну основную и блок из нескольких картинок надо объединить в одну картинку
Это можно сделать с помощью кода
В итоге получаем из нескольких картинок одну в base64 и отправляем вместе с основной картинкой как задание для распозование капчи
Спасибо за внимание!
Для решение капчи иногда требуется отправить 2 картинки или один скриншот, и чтобы уменьшить нагрузку на процессор приходится уходить от создания создания скриншотов в пользу производительности
Ранее делался скриншот и отправлялся в капча сервисы для получение результата, то сейчас получаем 2 картинки, одну основную и блок из нескольких картинок надо объединить в одну картинку
Это можно сделать с помощью кода
C#:
Tab tab = instance.ActiveTab;
Document doc2 = tab.AllDocuments.Documents[0]; //doc2 = null;
void info(string word) { project.SendInfoToLog(word.ToString(), "[CapGuru][PP]", true); }
var items2 = doc2.QuerySelectorAll(".geetest_box_wrap[style*=block] .geetest_ques_back img");
if (items2 != null && items2.Count > 0)
{
Bitmap combinedImage = null;
Image image;
List<string> slist = new List<string>();
int i12 = 0;
// Определяем максимальные размеры
int maxWidth = 0;
int maxHeight = 0;
foreach (var item in items2)
{
string img33 = item.GetAttribute("src");
var captcha = getu2(img33);
byte[] imageBytes = Convert.FromBase64String(captcha);
using (MemoryStream stream = new MemoryStream(imageBytes))
{
image = Image.FromStream(stream);
if (image.Width > maxWidth) maxWidth = image.Width;
if (image.Height > maxHeight) maxHeight = image.Height;
}
}
// Создаем combinedImage с максимальными размерами
combinedImage = new Bitmap(maxWidth * items2.Count, maxHeight);
using (Graphics g = Graphics.FromImage(combinedImage))
{
g.Clear(Color.White);
}
// Приводим все изображения к максимальным размерам и объединяем их
foreach (var item in items2)
{
string img33 = item.GetAttribute("src");
var captcha = getu2(img33);
byte[] imageBytes = Convert.FromBase64String(captcha);
using (MemoryStream stream = new MemoryStream(imageBytes))
{
image = Image.FromStream(stream);
}
// Приводим изображение к максимальным размерам
Bitmap resizedImage = new Bitmap(maxWidth, maxHeight);
using (Graphics g = Graphics.FromImage(resizedImage))
{
g.Clear(Color.White);
g.DrawImage(image, 0, 0, maxWidth, maxHeight);
}
// Рисуем изображение на combinedImage в правильном положении
using (Graphics g = Graphics.FromImage(combinedImage))
{
g.DrawImage(resizedImage, i12 * maxWidth, 0);
}
i12++;
}
if (combinedImage != null)
{
using (MemoryStream stream = new MemoryStream())
{
combinedImage.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
var imageBytes = stream.ToArray();
// Предполагается, что project.Variables["var2"] существует
project.Variables["var2"].Value = Convert.ToBase64String(imageBytes);
}
}
else
{
info("combinedImage is null");
}
}
else
{
info("No images found");
}
string getu2(string url){
string[] headers = new[]{string.Empty};
byte[] imgbytes = ZennoPoster.HTTP.RequestBytes(method:ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET, url:url, content:"",contentPostingType:"", AdditionalHeaders: headers);
return imgbytes != null && imgbytes.Length > 0?Convert.ToBase64String(imgbytes):"";
}
Спасибо за внимание!
Последнее редактирование: