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