Вопрос защиты от автоматизированных запросов к веб-сервисам стоит особенно остро. Одним из наиболее распространенных способов защиты является использование CAPTCHA – теста, который должен подтвердить, что пользователь является человеком, а не программой. В данной статье мы рассмотрим, как с помощью Delphi и Object Pascal можно решить задачу отображения CAPTCHA, которая хранится в свойстве background-image элемента DIV.
Проблема
Пользователь столкнулся с необходимостью отображения CAPTCHA на своем сайте, информацию для которого он собирает с различных источников. CAPTCHA находится на сайте tjms.jus.br и отображается в виде изображения, которое хранится в свойстве background-image элемента DIV с идентификатором captchaCodigo.
Решение
Для решения задачи можно использовать следующий подход. CAPTCHA на сайте передается в виде строки, закодированной в формате base64. Чтобы получить изображение, необходимо извлечь эту строку из HTML-кода страницы, декодировать ее и отобразить в виде изображения.
Пример кода на Object Pascal, который извлекает строку base64 из HTML и отображает ее в компоненте TImage:
uses Soap.EncdDecd, IdHTTP, System.StrUtils, pngimage;
Function _ExtractBetweenTags(Const s, LastTag, FirstTag: string; TrimTags: Boolean = True): string;
// ... (реализация функции, не показанная полностью для краткости)
procedure TForm4.btn1Click(Sender: TObject);
var
Input: TStringStream;
Output: TBytesStream;
sTmp, uuidCaptcha, captchaCodigo: string;
IdHTTP: TIdHTTP;
Graphic: TGraphic;
begin
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.AllowCookies := True;
IdHTTP.HandleRedirects := True;
IdHTTP.Request.Connection := 'keep-alive';
IdHTTP.Request.UserAgent := 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36';
sTmp := IdHTTP.Get('http://www.tjms.jus.br/cpopg5/imagemCaptcha.do');
// ... (извлечение uuidCaptcha и captchaCodigo, не показанное полностью для краткости)
mmo1.Lines.Add(captchaCodigo);
Input := TStringStream.Create(captchaCodigo, TEncoding.ASCII);
try
Output := TBytesStream.Create;
try
Soap.EncdDecd.DecodeStream(Input, Output);
Output.Position := 0;
Graphic := TPngImage.Create;
try
Graphic.LoadFromStream(Output);
img1.Picture.Bitmap.Assign(Graphic); // Отображение изображения в компоненте TImage
finally
Graphic.Free;
end;
finally
Output.Free;
end;
finally
Input.Free;
end;
finally
IdHTTP.Free;
end;
end;
Важные замечания
Необходимо понимать, что большинство сайтов с CAPTCHA защищают свои сервисы от автоматического сбора информации. Поэтому использование подобных методов может нарушать условия использования сайта.
В примере кода используется библиотека IdHTTP для отправки HTTP-запросов и получения ответов от сервера.
Для декодирования строки base64 используется компонент Soap.EncdDecd.
Важно не забывать отправлять идентификатор uuidCaptcha с POST-запросом, который идентифицирует конкретную CAPTCHA, введенную в вашей программе.
Заключение
В данной статье мы рассмотрели, как с помощью Delphi и Object Pascal можно решить задачу отображения CAPTCHA, которая хранится в свойстве background-image элемента DIV. Это может быть полезно для разработчиков, которые сталкиваются с подобными задачами в рамках своих проектов. Однако следует помнить о юридических аспектах использования CAPTCHA и соблюдать условия использования соответствующих сайтов.
Статья о решении задачи отображения CAPTCHA в Delphi, используя Object Pascal, для получения и декодирования изображения в формате base64.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.