Доброго времени суток, на днях кодил программу на Delphi для автоматизации очередного нудного веб-мастерского процесса (поиск свободных доменов с PR + кое-какой чек в WA) и походу дела столкнулся с проблемкой — определение Whois сервера. Собственно необходимым кодом я сейчас и поделюсь, уточнив несколько основных моментов при работе с Whois.
Прежде всего для самых отдалённых (таких как я) для того что-бы например проверить регистрацию или дату освобождения домена — нужен Whois, т.е. тянуть всю информацию оттуда. Тут в принципе всё понятно но есть одно но, у каждой доменной зоны есть свой Whois сервер, например если обратится к базе whois.ua, запросив при этом данные для домена в зоне .com — то нас мягко пошлют, мол нету информации — то и логично.
В общем задался я вопросом, как можно узнать Whois сервер для зоны, выход нашел и то был iana.org обратившись к этому сервису по Whois протоколу можно без проблем получить информацию о том, какой whois сервер использовать для той или иной доменной зоны. Необходимый Whois сервер iana выдаёт в поле refer, всю грязную работу я сделал за вас, прочекав все возможные доменные зоны и узнав их Whois. Теперь вынашу на суд мой творение — универсальный код по определению Whois данных.
План действий такой:
- Берём url из едита
- определяем доменную зону
- определяем Whois сервис для этой зоны
- получаем Whois данные
теперь сам код:
function getzona(url: string):string; var i, num, num2:integer; begin num:=0; num2:=0; for i:=0 to length(url) do begin if url[i] = '.' then begin num:=num+1; num2:=i; end; end; result:=copy(url,num2,length(url)); end;
Данная функция служит для определения зоны, входной параметр это собственно урл.
Далее в memo или ещё куда подгружаем список мною добытый (в конце записи полный список), где идёт сопоставление доменной зоны с whois, список вида:
.ua+whois.ua
.ac+whois.nic.ac
.ae+whois.aeda.net.ae
.aero+whois.aero
.af+whois.nic.af
и т.п.
т.е. вначале идёт зоны и потом через плюс идёт whois сервер. Юзается подобная база так:
var ws, zona:string; i, num, num2:integer; begin zona:=getzona(edit3.text); for i:=0 to form1.memo1.lines.count-1 do begin if copy(memo1.lines[i],1,pos('+',memo1.lines[i])-1) = zona then begin ws:=copy(memo1.lines[i],pos('+',memo1.lines[i])+1,length(memo1.lines[i])); continue; end; end;
В начале вызываем функцию getzona которая определяет зону (алгоритм там простенький — подсчёт точек, и последняя точка — начало позиции зоны, дальше копирование) в переменную zona. Затем проходим по мемо где находится список вида «зона=whois” и ищем необходимый whois под нашу зону.
Собственно после того как всё определили, получаем whois данные:
IdWhois1.Host:=ws; // указываем whois сервер memo1.lines.text:=IdWhois1.WhoIs('lalala.org.com'); // в мемо пихаем данные.
Чуть не забыл, не забудьте на форму кинуть компонент idwhois с вкладки indy clients. На этом в принципе всё, удачи.