Продолжаем рассматривать вопросы применения Delphi в Internet. И сегодня я рад представить Вам очередной компонент для Delphi 2010. На этот раз компонент предназначен для определения даты регистрации и возраста домена. Если воспользоваться всеми рассмотренными в блоге компонентами, включая этот, то уже можно писать небольшую программку по аудиту сайтов :)
В прошлой статье я рассмотрел небольшую программку, реализующую алгоритм подобный тому, который реализован в компоненте. Но, на самом деле основной целью написания программы было освоение навыков работы с RegExp в Delphi. Поэтому и над передачей данных особо не заморачивался и использовал простое сохранение данных в файл и дальнейшую обработку. Компонент работает несколько иначе.
1. Модель компонента DomainAge
Вся работа с получением исходного текста от whois-сервера проходит в отдельном потоке, что избавляет приложение от лишних «зависаний», использования Application.ProcessMessages и пр. Далее, после того как поток завершает свою работу, проводится работа с объектом RegExp и определяется дата регистрации и возраст домена. В случае, если необходимо сохранить исходный текст страницы whois-сервера, весь текст сохраняется в текстовом файле с названием домена.
Для получения данных о дате регистрации и возрасте домена необходимо воспользоваться единственным событием компонента — OnAcceptData. Все просто как три копейки.
Остается установить компонент и воспользоваться им :) Кстати, с установкой тоже проблем возникнуть не должно, но на всякий случай рассмотрим некоторые моменты, связанные с установкой компонентов в Delphi 2010.
2. Установка компонента. Обзор основных свойств и события.
Установка компонента как и всегда возможна либо с использованием прилагаемого bpl-файла, либо с помощью pas-файлов из собственного пакета Package.
При использовании pas-файлов в пакет необходимо включить файлы uDomains.pas и InetThread.pas.
Также следует обратить внимание на то, что компонент использует в своей работе объект TRegExp, поэтому перед установкой самого компонента не забудьте импортировать в Delphi 2010 библиотеку Microsoft VBScript Regular Expressions 5.5. Как это сделать я подробно рассматривал здесь.
После того, как компонент будет установлен, он станет доступен на вкладке WebDelphi.ru палитры компонентов.
В компоненте определены следующие свойства:
1. Domain: string — анализируемый домен. Следует отметить, что анализируется именно домен, а не хост. То есть, если Вы зададите свойство, например так:
Domain:=bvv36.ya.ru
то анализироваться будет ya.ru (домен), а не bvv36.ya.ru (хост).
2. Pattern: string — регулярное выражение, используемое в RegExp при анализе страницы и поиске данных по домену. По умолчанию используется регулярное выражение следующего вида:
'^CD+(d{4}.d{2}.d{2})|Cw{7,8}sw{4}:D+(d{4}-d{2}-d{2})'
Если Вы не имеете навыков по составлению регулярных выражений, то не рекомендую Вам изменять это свойство. На всякий случай в модуле uDomains.pas определена константа:
PatternConst = '^CD+(d{4}.d{2}.d{2})|Cw{7,8}sw{4}:D+(d{4}-d{2}-d{2})';
В случае необходимости можете ей воспользоваться для восстановления регулярного выражения для RegExp.
3. SaveSource : boolean — опция, определяющая будет ли содержимое потока сохраняться в отдельный текстовый файл. Если SaveSource равно true, то по окончании работы поток сохранит все полученные данные в текстовый файл с названием домена. То есть данные для webdelphi.ru сохраняются в файл webdelphi.ru.txt и т.д.
4. WhoisPattern: string — строка-шаблон, определяющая адрес whois-сервера по которому можно получить необходимые данные. В определении этого свойства необходимо помнить, что в WhoisPattern обязательно должна присутствовать директива %s — вместо неё будет подставляться имя домена. В случае ошибочного задания этого свойства, Вы можете восстановить исходное значение воспользовавшись константой из модуля uDomains.pas:
URLPatternConst = 'http://www.who.is/whois/%s';
Также в компоненте определено единственное событие onAcceptData, которое возникает в случае, если поток удачно завершает работу и передает данные на обработку в RegExp.
Для получения данных о дате регистрации и возрасте домена рекомендую Вам пользоваться именно этим событием, либо, если Вы уверены, что компонент удачно отработал все операции, пользоваться свойствами только для чтения Age и RegDate.
Для того, чтобы запустить поток в работу, необходимо использовать метод Activate, который создает отдельный поток и блокирует все обращения к компоненту до момента срабатывания события onAcceptData.
Ну, а теперь, рассмотрим применение компонента при разработке собственных приложений.
3. Пример использования компонента DomainAge
Я не стал изобретать что-то новое и воспользовался заготовкой программы из прошлой статьи, только добавил ещё один компонент на форму:
Состояние CheckBox определяет будет ли сохраняться исходник страницы в отдельный файл.
Теперь, если у Вас есть под рукой исходный текст этого приложения, то можете перейти к событию onButtonClick и смело удалить оттуда весь код. Он нам больше не пригодится.
Теперь уложите на форму компонент DomainAge и на событие onClick напишите вот такие строки:
DomainAge1.Domain:=Edit1.Text; DomainAge1.SaveSource:=CheckBox1.Checked; DomainAge1.Activate;
Здесь мы определили домен для анализа, задали свойство SaveSource и запустили компонент на выполнение.
Теперь перейдите на вкладку Events компонента DomainAge, сделайте двойной клик на событии onAcceptData и напишите такой обработчик события:
procedure TForm2.DomainAge1AcceptData(Age: Integer; RegDate: TDate); begin label7.Caption:=IntToStr(Age); label5.Caption:=DateToStr(RegDate); end;
Вот и все. То, что ещё вчера расписывалось на соню с лишним строк, теперь уместилось всего в 5 строк кода, написанного Вами. Теперь можете запустить приложение и протестировать работу компонента.
К сожалению, на момент написания этой статьи у who.is были проблемы с доступом к MySQl, поэтому результат работы программы показать не могу. Но, в случае, если дата регистрации домена и его возраст не определены, то в переменных Age и RegDate вернуться значения -1.
Можете использовать другие whois-сервера для работы — это не принципиально, главное — составьте правильное регулярное выражение :) Например, можете воспользоваться следующей настройкой компонента:
WhoisPattern:='http://whois.domaintools.com/%s'; Pattern:='(?:created|creation date):.*?(d{4}[.-]{1}d{2}[.-]{1}d{2})';
Так для других серверов нужно другое регулярное выражение, получается?
Да, но судя по тому, что практически все whois-сервера выдают информацию по домену в виде «как есть», то само регулярное выражение будет меняться очень не значительно, скорее всего изменения могут коснуться только проверки символов до и после слов created и create date