RSS

Получаем Whois домена. Проверяем домен с помощью Indy

В этом уроке мы создадим приложение, которое по введенному имени домена вернет нам его Whois-информацию, а так же сообщит, занят ли домен с таким именем или нет. Этот пример станет полезен тем, кто хочет написать свой генератор доменных имен на языке Delphi. Приложение так же способно проверять домены в зоне «.РФ», преобразуя кириллические имена в понятный для DNS PunyCode.
 
Приступим.
 
Создаем новый проект в Delphi.
Добавляем на форму:
— Edit, вкладка (Standard), для ввода имени домена;
— Button, вкладка (Standard);
— Memo, вкладка вкладка (Standard), для вывода полученной информации;
— idWhois, вкладка (Indy Clients)
indy whois (idWhois) компонент Delphi

Все имена оставляем по умолчанию. Сохраните проект в новой папке. Это потребуется для внедрения стороннего модуля.
 
Для конвертации кириллицы в PunyCode нам потребуется дополнительный модуль. Скачать его можете отсюда. Архив содержит как исходный код PunyCode.pas, так и уже откомпилированный модуль  PunyCode.dcu. Перенесите модуль PunyCode.dcu в папку с Вашим проектом. Переходим далее к нашему проекту.
 
В раздел Uses допишите PunyCode. На форме расположите все элементы приблизительно так:


Да, для Memo1 установите свойство ScrollBars равным ssVertical (вертикальная полоса прокрутки). Это на случай если информации будет слишком много.
 
Собственно с дизайном формы завершили, смотрим весь код модуля:

unit Get_WHOIS_Un;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,         Dialogs, IdWhois, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, PunyCode;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    IdWhois1: TIdWhois;
    procedure Button1Click(Sender: TObject);

private
    { Private declarations }
public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//функция запроса Whois инфо по домену
//входные параметры:
//domain — имя проверяемого домена с указанием зоны (.ru, .com, .kz и т.д.)
//idWhois — объект Indy
//ответ передается в Answer
//функция возвращает TRUE если домен свободный.
function CheckDomain(domain:string; idWhois: TIdWhois; Answer:TStrings):boolean;
var FindResult:string;  //переменная для результата запроса
    Host:string//переменная для хранения ссылки на Whois-сервер
    i:integer;
    arrAnswFree:array of string[50];//динамический массив содержащий образцы ответа в случае если домен свободен

begin
   Host := ‘whois.internic.net’//задаем адрес Whois по умолчанию
   result:=false; //результат функции пока false

   //задаем кол-во элементов массива и заполняем образцы ответов
   SetLength(arrAnswFree,3);
   arrAnswFree[0]:=‘No entries found’;
   arrAnswFree[1]:=‘No match for’;
   arrAnswFree[2]:=‘Nothing found for this query’;

  //если зона RU или РФ меняем адрес Whois-сервера
  //аналогично по остальным перечисленным зонам
  if  (lowercase(extractfileext(domain)) = ‘.ru’or
      (lowercase(extractfileext(domain)) = ‘.рф’)
         then Host := ‘whois.r01.ru’;

  if lowercase(extractfileext(domain)) = ‘.kz’
         then Host:=‘whois.nic.kz’;

  if lowercase(extractfileext(domain)) = ‘.tv’
         then Host:=‘whois.nic.tv’;

  //передаем адрес Whois-сервера компоненту Indy Whois
  IdWhois.Host :=Host;

  //делаем запрос на Whois сервер и получаем ответ
  //если домен в зоне РФ то кодируем его в Punycode
  findresult:=idwhois.WhoIs(PunycodeEncodeDomain(domain));

  //заменяем символ перевода каретки с кодом #10 в запросе, на понятный для Memo код #13
  //иначе все строки будут идти одна за одной
  findresult:=stringReplace(findresult, #10, #13, [rfReplaceAll]);

  //передаем ответ
  Answer.Text:=  findresult;
  Answer.Insert(0,‘Проверка адреса: ‘ + uppercase(domain));//так для красоты

  //проверям ответ на наличие ответа о не найденом домене
  for i:=0 to length(arrAnswFree)-1 do
         if pos(arrAnswFree[i], findresult)>0 then
           begin
             result:=true; //если такой ответ есть то передаем функции TRUE
             exit;
           end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

memo1.Clear;  //чистим Memo

if CheckDomain(edit1.Text,idWhois1,memo1.Lines) then  //если функция вернула TRUE, то домен свободен
        showmessage(‘Домен ‘+edit1.Text+‘ свободен!’+#13+‘Спешите зарегистрировать его!’);

end;

end.

Код я постарался снабдить подробными комментариями. Здесь мы создаем функцию CheckDomain (domain:string; idWhois: TIdWhois; Answer:TStrings) которая вернет True если домен свободен или False, если  домен занят. Answer – получит Whois-информацию в любом случае и выдаст ее в Memo1.
 
Переменная Host содержит адрес Whois-сервера, на который компонент idWhois делает запрос. Это важный момент т.к. некоторые зоны имеют свои Whois-сервера. Для примера, я выделил три сервера для зон: RU, TV, KZ, РФ. По остальным зонам запрос уходит на четвертый Whois-сервер, который установлен по умолчанию.
 
Если Вам необходимо проверить адреса в определенной зоне, то воспользуйтесь гуглом и запросом «Whois сервер для …» и укажите нужную зону.  Как правило, уже на выдаче виден адрес. Практически все они начинаются на Whois.***.***
 
В примере используется несколько функций, описание и пример работы с которыми, Вы можете глянуть в нашем словаре: lowercase, extractfileext, StringReplace, uppercase, pos.
 
Полный пример Вы можете скачать здесь.
 
П.С.: Если у Вас установлен Брэндмауер(Dr.Web, Outpost и т.д.) или сетевой экран, не забудьте дать разрешение на доступ в сеть нашему приложению, иначе ничего не произойдет.